【问题标题】:Moving a sprite (Actor?) in Libgdx using Scene2D使用 Scene2D 在 Libgdx 中移动精灵(演员?)
【发布时间】:2016-05-28 09:33:17
【问题描述】:

我一直在尝试学习 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);
    }


}

【问题讨论】:

    标签: java libgdx sprite actor scene2d


    【解决方案1】:

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

    public enum PlayerMoveState {
       RIGHT,
       LEFT,
       IDLE
    }
    

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

    PlayerMoveState moveState;
    

    根据您的 keyDown 方法中的 Input.Keys.RIGHT、Input.Keys.LEFT 将其状态设置为正确的状态。通过在需要重写和实现的 keyUp 方法中将其设置为 IDLE 来重置状态。

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

    最后,在播放器的 act 方法中编写一个简单的 switch case 块。

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

    【讨论】:

    • 为什么使用动作很危险?
    【解决方案2】:

    我不确定 actor 是否专注于处理 KeyUp/Down 事件,这就是为什么我会避免使用侦听器来移动播放器。

    同样改变演员的位置也不需要动作——Actor 类中有一个简单的 setPosition() 方法。您还有 getX() 和 getY() 方法来获取演员的当前位置。

    我会做的是检查是否有任何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() 方法在每次渲染中都会被调用(当然,如果你调用的是舞台的动作),所以运动将是连续的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2013-04-23
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      相关资源
      最近更新 更多