我一直在努力学习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);
}
}
答案 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()方法(如果你正在调用舞台的行为),那么移动将是连续的。