我是libgdx游戏编程的新手,我想创建一种RPG游戏。
我想让玩家朝着鼠标/触摸位置移动。
我已经计算出了这样做的合理方法,但似乎玩家一次只移动一帧,这意味着玩家需要多次点击才能到达正确的位置,而不是走到点击只需点击一下即可逐帧定位。
我的代码:
Gdx.input.setInputProcessor(new Input(){
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
projected = new Vector3(screenX, screenY, 0);
cam.unproject(projected);
if(projected.x != position.x || projected.y != position.y){
float pathX = projected.x - position.x;
float pathY = projected.y - position.y;
float distance = (float) Math.sqrt(pathX * pathX + pathY * pathY);
float directionX = pathX / distance;
float directionY = pathY / distance;
position.x += directionX * Speed;
position.y += directionY * Speed;
}
return true;
}
答案 0 :(得分:1)
每次触摸屏幕时都会调用您的方法(一次)。您的方法使用
更改位置(一次)position.x += directionX * Speed;
position.y += directionY * Speed;
因此,每次触摸屏幕只会移动你的精灵一次。
您的Screen
课程有render(float deltaTime)
方法。这会被重复调用,参数给出自上次调用以来的时间。这使得它成为一种有用的方法,可以做你需要重复发生的事情(比如更新精灵的位置)。
所以你真正要在touchDown()
内做的是设置你的精灵方向(作为你的Sprite对象中包含的字段)。然后,您可以编写类似
update(float deltaTime) {
position.x += directionX * Speed * deltaTime;
position.y += directionY * Speed * deltaTime;
}
在你的精灵课程中。这几乎就是你所写的,但是* deltaTime
确保了位置改变的数量只是自上次调用此方法以来所覆盖的距离。
此方法仍然永远不会被调用,因此您需要使用Screen.render(deltaTime)
方法调用它:
render(float deltaTime) {
mySprite.update(deltaTime);
}