我是Slick2D的新手,我正在尝试使用我的角色。我可以在按住移动键的同时使其平稳移动,但我也希望角色完成其移动,使其完全停在下一个瓷砖上(我有一个简单的地图,其中有瓷砖32x32)。这对我来说是一个问题,因为它移动到下一个瓷砖,但它传送到那里 - 运动是即时的,我希望我的角色继续以相同的速度运动。
我在update()
方法中尝试过类似的例子:
else if (input.isKeyPressed(Input.KEY_D))
{
characterAnimation = characterAnimationRight;
characterAnimation.update(delta);
xCoord = (int) xCoord;
while (xCoord%32 != 0)
{
xCoord += 1;
characterAnimation.update(delta);
if (xCoord > Window.WIDTH - 32)
{
xCoord = Window.WIDTH - 32;
}
}
}
但是我无法让它发挥作用。
答案 0 :(得分:0)
为什么不尝试使用" xSpeed"和" ySpeed"并根据' characterAnimation'的位置设置这些值。设置为和是否在一个确切的瓷砖上?
类似的东西:
else if (input.isKeyPressed(Input.KEY_D)) {
characterAnimation = characterAnimationRight;
}
// ...
if (characterAnimation == characterAnimationRight){
xSpeed = 1;
}
else if (characterAnimation == characterAnimationLeft){
xSpeed = -1;
}
xCoord += xSpeed;
characterAnimation.update(delta);
if(xCoord % 32 == 0) {
xSpeed = 0;
}
// ...
我实际上并不知道您的代码(或slick2d)是如何工作的,因此我认为在调用xCoord
时会神奇地考虑characterAnimation.update(delta)
值。否则,根据xCoord
执行更新角色位置所需的任何操作。
答案 1 :(得分:0)
解决方案不是在xCoord
方法中计算while()
中的update()
。原因是它是在update()
方法的单次运行中计算的,之后调用render()
方法来渲染字符。这意味着在while()
之后渲染角色并传送。
这是我的解决方案:
@Override
public void update(GameContainer gc, StateBasedGame s, int delta)
throws SlickException {
// .......
if (moving)
{
if (movingDirection == DIR_RIGHT)
{
if (xCoord >= targetCoord)
{
xCoord = targetCoord;
moving = false;
}
else
{
xCoord += delta * 0.1f;
characterAnimation.update(delta);
if (xCoord > Window.WIDTH - 32)
{
xCoord = Window.WIDTH - 32;
}
}
}
else if (movingDirection == DIR_LEFT)
{
if (xCoord <= targetCoord)
{
xCoord = targetCoord;
moving = false;
}
else
{
xCoord -= delta * 0.1f;
characterAnimation.update(delta);
if (xCoord < 0)
{
xCoord = 0;
}
}
}
else if (movingDirection == DIR_UP)
{
if (yCoord <= targetCoord)
{
yCoord = targetCoord;
moving = false;
}
else
{
yCoord -= delta * 0.1f;
characterAnimation.update(delta);
if (yCoord < 0)
{
yCoord = 0;
}
}
}
else if (movingDirection == DIR_DOWN)
{
if (yCoord >= targetCoord)
{
yCoord = targetCoord;
moving = false;
}
else
{
yCoord += delta * 0.1f;
characterAnimation.update(delta);
if (yCoord > Window.WIDTH - 32)
{
yCoord = Window.WIDTH - 32;
}
}
}
}
}
按下移动键后,变量moving
设置为true。现在,在render()
的每次调用之后,角色会在update()
中稍微移动并在此新位置渲染,直到它完全位于拼贴上。