可能这是一个非常基本的问题,但作为一个新手,我对此感到困惑。
在我的libGDX项目中,我想移动播放器。 最初的玩家在左侧。对于第一个点击玩家应该移动到另一侧并占据那里的位置。对于下一个点击它应该移动到左边。并将继续这样。
我实现了这个逻辑。现在的问题是我的播放器根本没有移动但只是占据了相反的位置。我使用了速度值,但它对代码没有任何影响。
我想让它一路走来,而不仅仅是占据这个位置。 请帮忙。
public float ninjaX = Constants.W_WIDTH;
public float ninjaY =Constants.WORLD_HEIGHT/2+Constants.WORLD_HEIGHT/4;
public float ninjaVelocity =100f;
public boolean isLeftBool=true;
public void ninjaMove() {
if (isLeftBool) {
ninjaX = ninjaX+ ninjaVelocity;
setPosition(Constants.WORLD_WIDTH - (Constants.W_WIDTH+Constants.PLAYER_HEIGHT/2), ninjaY);
isLeftBool = false;
}
else
{
ninjaX=ninjaX-ninjaVelocity;
setPosition(ninjaX,ninjaY);
isLeftBool = true;
}
}
在渲染中更新玩家:
if (MyInputProcessor.isTap) {
MyInputProcessor.isTap = false;
ninja.ninjaMove();
}
答案 0 :(得分:3)
您的球员坐标变化应取决于增量时间:
x1 = x0 + v *Δ t
x1 - 是新坐标
x0 - 是当前坐标
v - 速度
Δ t - x0 和 x1 之间的时间跨度
LibGDX provides获取当前帧和最后帧之间时间跨度的方法:
Gdx.graphics.getDeltaTime();
因此,相应地更改代码应该让您的播放器顺利移动(取决于速度):
ninjaX = ninjaX + ninjaVelocity * Gdx.graphics.getDeltaTime();
else 块中的减法相同。
你也可能想要设置x坐标(ninjaX)和y(目前你没有在 setPosition 方法中传递它):
setPosition(ninjaX, ninjaY);
*我猜这里是因为我不知道该方法的作用
答案 1 :(得分:0)
这只是你如何解决这个问题的一个例子。 你没有解释setPosition()的作用以及调用它的原因所以我会忽略它。
在你的渲染()中:
public void render(float delta){
....
ninja.update(delta);
}
在你的Ninja.class
private final Vector2 leftPos = new Vector(20, 60);
private final Vector2 rightPos = new Vector(80, 60);
private Rectangle bound = new Rectangle(80,60,32,32);
private Vector2 currentPos;
private float moveSpeed = 100f;
public Ninja(){
currentPos = leftPos;
}
public void update(float delta){
if(bound.x > currentPos.x)bound.x += moveSpeed * delta;
else bound.x -= moveSpeed * delta;
}
public void move(){
if(currentPos == leftPos)currentPos = rightPos;
else currentPos = leftPos;
}
然后在touchDown()
中输入处理器调用ninja.move()这些都没有经过测试。
你需要将moveSpeed与delta时间相乘的原因是使移动独立于fps。这样,无论游戏运行多少fps,忍者都会在同一时间内移动相同的距离。