2016-05-14 53 views
0

我正在开发一款游戏,而且我在本游戏中使用了Libgdx Library。它将在Android上运行,并且必须在一个屏幕上与两名玩家一起玩。但我无法获得另一位玩家的投入。我可以和底线或顶尖球员一起打球,但不能同时打。Libgdx multiTouch不能正常工作

这是在得到输入代码:

public class PlayStateInput implements InputProcessor { 

private PlayState playState; 
private Vector2 touchPos; 
private Vector2 bodyCord; 


public PlayStateInput(PlayState playState){ 

    this.playState = playState; 
    touchPos = new Vector2(); 
    bodyCord = new Vector2(); 

    touchPos.x=Gdx.input.getX(); 
    touchPos.y=Gdx.input.getY(); 
    bodyCord.x=playState.getGameWorld().getPaddle().getBody().getPosition().x; 
    bodyCord.y=playState.getGameWorld().getPaddle().getBody().getPosition().y; 

} 

@Override 
public boolean keyDown(int keycode) { 
    return false; 
} 

@Override 
public boolean keyUp(int keycode) { 
    return false; 
} 

@Override 
public boolean keyTyped(char character) { 
    return false; 
} 

@Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) { 

    if(playState.getGameWorld().getPuck().getCircleRect().contains(screenX,screenY)){ 

     System.out.println("collision"); 
    } 

    if(screenY > Gdx.graphics.getHeight()/2 && (pointer <= 2)){ 
     playState.getGameWorld().getPaddle2().setBottomPaddle(true); 

    } 

    if(screenY < Gdx.graphics.getHeight()/2 && (pointer <= 2)){ 
     playState.getGameWorld().getPaddle().setTopPaddle(true); 
    } 

    return false; 
} 

而且使用该输入的位置:

public class Paddle implements GameObject { 


private World world; 
private Body body; 
private Body body2; 
private BodyDef bodyDef; 
private BodyDef bodyDef2; 
private Fixture fixture; 
private Fixture fixture2; 
private FixtureDef fixtureDef; 
private FixtureDef fixtureDef2; 


private Circle circleRect; 
private Circle circleRect2; 
boolean TopPaddle = false; 
boolean BottomPaddle = false; 

private float PPM=100f; 
private float power=100f; 

private Vector2 touchPos; 

private Sprite sprite; 

String koordinatlar; 


public Paddle(World world){ 


    this.world = world; 

    bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 
    bodyDef.position.set((Gdx.graphics.getWidth()/2)/PPM,(Gdx.graphics.getHeight()/3)/PPM); 

    body = world.createBody(bodyDef); 



    fixtureDef = new FixtureDef(); 
    fixtureDef.density = 1.0f; 
    fixtureDef.friction = 1.0f; 
    fixtureDef.restitution=0.3f; 


    CircleShape circleShape = new CircleShape(); 
    circleShape.setRadius((Gdx.graphics.getWidth()/16)/PPM); 
    fixtureDef.shape = circleShape; 

    fixture = body.createFixture(fixtureDef); 

    circleRect = new Circle(body.getPosition().x,body.getPosition().y,(Gdx.graphics.getWidth()/16)); 

    Sprite.split(ImageLoader.playButtonRegion.getTexture(),20,20); 



    sprite = new Sprite(ImageLoader.paddle); 
    sprite.setSize((Gdx.graphics.getWidth()/8),(Gdx.graphics.getWidth()/8)); 
    sprite.setPosition((Gdx.graphics.getWidth()/2)-30f,(Gdx.graphics.getHeight()/3)-30f); 


    touchPos = new Vector2(); 

} 

@Override 
public void render(SpriteBatch sb) { 


    sprite.draw(sb); 
    sprite.setPosition(body.getPosition().x*PPM-30f,body.getPosition().y*PPM-30f); 
} 

@Override 
public void update(float delta) { 

    touchPos.x=Gdx.input.getX()/PPM; 
    touchPos.y=Gdx.input.getY()/PPM; 

    System.out.println(touchPos); 


    if (TopPaddle) { 

     body.setLinearVelocity(power*(touchPos.x-body.getPosition().x),power*(touchPos.y-body.getPosition().y)); 
     body.setAngularVelocity(0.0f); 


     if(Gdx.input.getY()>Gdx.graphics.getHeight()/2){ 

      body.setLinearVelocity(0f,0f); 
     } 
     //System.out.println(Gdx.input.getX()+" "+Gdx.input.getY()); 
    } 

}

我希望,我自己清楚。

+0

要正确支持多点触控,您需要实现InputListener和轨道指针索引以区分下手指。 – Tenfour04

回答

0

我想我看到你的问题,你依靠的是一次只有一个输入被采用的事实。结果,如果两个人同时进行输入,你将忽略两个球员中的一个。

解决多点触摸输入问题有多种方法,但我会解释一个简单的技术 - 从this answer修改。

为了让两个玩家都能接受输入,您需要两个变量 - 我会称它们为topTouchPosbottomTouchPos。每个将是Vector2喜欢你目前touchPos和如下(您update方法内部),他们将被计算:

//Initialise both vectors to vectors that can't be touched (negative) 
Vector2 topTouchPos = new Vector2(-1,-1), bottomTouchPos = new Vector2(-1,-1); 

//Two people can have up to 20 fingers (most touchscreen devices will have a lower limit anyway) 
for (int i = 0; i < 20; i++) { 
    //Check if this finger ID is touched 
    if (Gdx.input.isTouched(i)) { 
     //Classify it as either the top or bottom player 
     bool bottom = Gdx.input.getY(i) > Gdx.graphics.getHeight()/2; 
     if (bottom) bottomTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i)); 
     else topTouchPos.set(Gdx.input.getX(i), Gdx.input.getY(i)); 
    } 
} 

当你进入游戏主代码,你必须检查为双方球员。如果topTouchPosbottomTouchPos不是负数,则使用他们的触摸值为其各自的玩家。

希望这有助于(我没有测试任何代码,所以要小心任何错别字)。

+0

我认为我的游戏知道第二个输入,但由于某种原因它无法更改另一个桨的x和y坐标。 – khan