使用 SDL2 平滑网格移动?

Smooth grid movement with SDL2?

我正在使用 C++ 和 SDL2 制作类似口袋妖怪的游戏。我正在尝试完成它的网格移动(其中角色逐块移动,每块 32px)。

我已经完成了平铺移动,但是看起来不流畅,看起来很"robotic"。

这是我目前的情况:

overflowY += deltaY * elapsedTime;
overflowX += deltaX * elapsedTime;
if (overflowX >= 32){
    _x += 32;
    overflowX = 0;
}else if (overflowX <= -32){
    _x -= 32;
    overflowX = 0;

}
if (overflowY >= 32){
    _y += 32;
    overflowY = 0;
}else if(overflowY <= -32){
   _y -= 32;
    overflowY = 0;
}

AnimatedSprite::update(elapsedTime);

deltaX 为 1 或 -1(右或左)* 速度,与 deltaY 相同。 我的代码确实有效,但正如我所说,它看起来并不流畅。

有什么猜测吗?

以下代码未经测试,但应该给出解决问题的思路。请记住,对于小的 elapsedTime(高帧率),整数计算不起作用。然后使用浮点数或定点计算。

class SpritePosition
{
public:
    enum Direction { Left, Right, Up, Down };

    SpritePosition(int x, int y) : _x(x), _y(y) {}

    void update(Direction d, float elapsedTime)
    {
        _d = d;

        switch(d)
        {
            case Left: _x -= _tileSize * elapsedTime; break;
            case Right: _x += _tileSize * elapsedTime; break;
            case Up: _y -= _tileSize * elapsedTime; break;
            case Down: _y -= _tileSize * elapsedTime; break;
        }
    }

    void update(float elapsedTime)
    {
        if((_x % _tileSize) == 0 && (_y % _tileSize) == 0)
            return;

        int step = _tileSize * elapsedTime;

        if(_d == Left)
        {
            int d = _x % _tileSize;

            if(step > d)
                _x -= d;
            else
                _x -= step;
        }                
        else if(_d == Right)
        {
            int d = tileSize - (_x % _tileSize);

            if(step > d)
                _x += d;
            else
                _x += step;
        }
        else // same for Up and Down                
    }

    int getX() const { return _x;}        
    int getY() const { return _y;}        

    int getTileX() const { return _x / _tileSize;}        
    int getTileY() const { return _y / _tileSize;}        

private:
    const int _tileSize = 32;
    int _x;
    int _y;
    Direction _d;
};