Java 使用Scene2D在Libgdx中移动精灵(演员?)
我一直在努力学习scene2d,当按下一个键时,我很难让精灵/演员移动。我试过几种不同的方法,但我似乎想不出来。这是我目前拥有的代码,每次我按下键时都会移动演员,但按下键时不会移动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
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),因此动作将是连续的。为什么使用动作是危险的?