2016-05-14 11 views
0

私はゲームを開発していますが、私はこのゲームでLibgdxライブラリを使用しています。 Android上で動作し、2人のプレーヤーと1つの画面で遊ぶ必要があります。しかし、私は別のプレイヤーの入力を得ることができません。私はボトムプレイヤーまたはトッププレイヤーでプレイできますが、両方でプレイすることはできません。Libgdxマルチタッチが動作しない

これはされ得る入力コード:

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

私はあなたの問題があると思う、あなたは一度に1つの入力だけが取られているという事実に頼っている。その結果、両方のプレーヤーが同時に入力を行っている場合、2人のプレーヤーの1人を無視します。

マルチタッチ入力の問題を解決するには複数の方法がありますが、簡単な方法については、this answerから変更して説明します。

両方のプレイヤーが入力できるようにするには、2つの変数が必要です。topTouchPosbottomTouchPosと呼びます。これらのそれぞれは、あなたの現在のtouchPosようVector2となり、以下のように、彼らは(あなたの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)); 
    } 
} 

あなたは、両方のプレイヤーのためにチェックする必要があります。 topTouchPosまたはbottomTouchPosが負でない場合は、それぞれのプレーヤーにタッチ値を使用します。

希望します(私は任意のコードをテストしていませんので、誤植には注意してください)。

+0

私のゲームは第2の入力を認識していると思うが、何らかの理由で他のパドルのx座標とy座標を変更することはできない。 – khan

関連する問題