在Slick2D中释放键后如何让角色继续移动?

时间:2016-08-06 22:48:56

标签: java slick2d

我是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;
            }

        }
    }

但是我无法让它发挥作用。

2 个答案:

答案 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()中稍微移动并在此新位置渲染,直到它完全位于拼贴上。