使用Scene2D在Libgdx中移动精灵(Actor?)

时间:2016-02-16 22:00:22

标签: java libgdx sprite actor scene2d

我一直在努力学习scene2d,但是当按下按键时,我无法移动精灵/ 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);
    }


}

2 个答案:

答案 0 :(得分:1)

您可以使用状态机制来执行此操作。这可以是一个简单的枚举:

public enum PlayerMoveState {
   RIGHT,
   LEFT,
   IDLE
}

在您的sprite类型的PlayerMoveState下面定义一个字段,如下所示:

PlayerMoveState moveState;

根据KeyDown方法中的Input.Keys.RIGHT,Input.Keys.LEFT将其状态设置为正确状态。通过在需要覆盖和实现的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;
   }
}

答案 1 :(得分: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());
}

在每个渲染中都会调用 act()方法(如果你正在调用舞台的行为),那么移动将是连续的。