2016-05-14 82 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