2016-02-16 48 views
1

我一直在嘗試學習scene2d,並且在按住某個鍵時無法讓精靈/ Actor移動。我嘗試了幾種不同的方法,但我似乎無法弄清楚。這是我目前擁有的代碼,每當我按下按鍵時,都會移動演員,但在按住按鈕時不會。使用Scene2D在Libgdx中移動精靈(Actor?)

class Player extends Actor { 
    Sprite sprite = new Sprite(new Texture (Gdx.files.internal("character.png"))); 

    public Player() { 
     setBounds(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight()); 
     setTouchable(Touchable.enabled); 

     addListener(new InputListener() { 

      @Override 
      public boolean keyDown(InputEvent event, int keycode) { 
       if (keycode == Input.Keys.RIGHT) { 
        MoveByAction mba = new MoveByAction(); 
        mba.setAmount(1f, 0f); 

        Player.this.addAction(mba); 
       } 
       return true; 
      } 
     }); 
    } 

    @Override 
    protected void positionChanged() { 
     sprite.setPosition(getX(), getY()); 
     super.positionChanged(); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     sprite.draw(batch); 
    } 

    @Override 
    public void act(float delta) { 
     super.act(delta); 
    } 


} 

回答

0

我真的不知道,如果演員有一個專注於自己來處理KEYUP/Down事件,這就是爲什麼我會避免使用監聽器移動播放器。

另外改變演員的位置不需要動作 - 在Actor類中有一個簡單的setPosition()方法。您還有getX()getY()獲取actor的當前位置的方法。

我會做什麼。將檢查是否有任何Key是向下(通過使用Gdx.input不lisetners)和由相同的一些定義步驟中修改設置的位置是:

//Actor class 
final float STEP = 1f; 

... 

@Override 
public void act(float delta) { 
    super.act(delta); 

    if(Gdx.input.isKeyPressed(Keys.W)) 
     this.setPosition(getX(), getY() + STEP); 
    if(Gdx.input.isKeyPressed(Keys.S)) 
     this.setPosition(getX(), getY() - STEP); 
    if(Gdx.input.isKeyPressed(Keys.A)) 
     this.setPosition(getX() - STEP, getY()); 
    if(Gdx.input.isKeyPressed(Keys.D)) 
     this.setPosition(getX() + STEP, getY()); 
} 

動作()方法被調用在每個渲染中(如果你正在調用舞臺的動作),所以這個動作將會持續。

+0

這工作,謝謝! –

1

您可以使用狀態機制來做到這一點。這可以是一個簡單枚舉這樣的:

public enum PlayerMoveState { 
    RIGHT, 
    LEFT, 
    IDLE 
} 

定義下的字段到你的精靈類型PlayerMoveState這樣的:根據Input.Keys.RIGHT

PlayerMoveState moveState; 

設置它的狀態,以正確的一個,輸入.kee.LEFT在你的keyDown方法中。通過在keyUp方法中將其設置爲IDLE來重置狀態,您需要重寫和實現該方法。

@Override 
public boolean keyUp(InputEvent event, int keycode) { 
    moveState = PlayerMoveState.IDLE; 
} 

最後,在你的播放器的act方法中寫一個簡單的開關大小塊。

@Override 
public void act(float delta) { 
    super.act(delta); 
    switch(moveState) { 
     case RIGHT : 
     // Move right by using whatever method you want. 
     // Directly increasing x 
     // Increase x according to velocity you have defined. 
     // Use actions, little bit dangerous. 
     break; 
     case LEFT : 
     // Move left by using whatever method you want. 
     break; 
     case IDLE : 
     // Don't change x coordinate of your player. 
     break; 
     default : 

     break; 
    } 
} 
+0

這很乾淨,非常感謝! –

+0

爲什麼使用危險的操作? –