Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Scene2D在Libgdx中移动精灵(演员?)_Java_Libgdx_Sprite_Actor_Scene2d - Fatal编程技术网

Java 使用Scene2D在Libgdx中移动精灵(演员?)

Java 使用Scene2D在Libgdx中移动精灵(演员?),java,libgdx,sprite,actor,scene2d,Java,Libgdx,Sprite,Actor,Scene2d,我一直在努力学习scene2d,当按下一个键时,我很难让精灵/演员移动。我试过几种不同的方法,但我似乎想不出来。这是我目前拥有的代码,每次我按下键时都会移动演员,但按下键时不会移动 class Player extends Actor { Sprite sprite = new Sprite(new Texture (Gdx.files.internal("character.png"))); public Player() { setBounds(sprite

我一直在努力学习scene2d,当按下一个键时,我很难让精灵/演员移动。我试过几种不同的方法,但我似乎想不出来。这是我目前拥有的代码,每次我按下键时都会移动演员,但按下键时不会移动

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);
    }


}

您可以使用状态机制来实现这一点。这可以是一个简单的枚举,如下所示:

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;
   }
}

我不确定演员是否专注于自己来处理上下键事件,这就是为什么我会避免使用侦听器来移动播放器

另外,更改参与者的位置不需要操作-类中有一个简单的setPosition()方法。您还有getX()getY()方法来获取参与者的当前位置

我要做的是检查是否有任何已关闭(通过使用not 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()方法在每次渲染中都会被调用(当然,如果您调用的是舞台的act),因此动作将是连续的。

为什么使用动作是危险的?