【问题标题】:Smooth grid movement with SDL2?使用 SDL2 平滑网格移动?
【发布时间】:2017-08-26 17:50:27
【问题描述】:

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

我已经完成了一个个地块的移动,但是看起来并不平滑,看起来很“机器人”。

这是我目前所拥有的:

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 相同。 我的代码确实有效,但正如我所说,它看起来并不流畅。

有什么猜测吗?

【问题讨论】:

  • 您可能还想引入加速。你的运动应该包括三个阶段——加速、匀速和减速。
  • 精灵位置用什么?也只有_x_yoverflow*
  • @TobiasWollgam 只有 _x 和 _y。
  • 但是 _x 和 _y 似乎总是 32 的倍数。所以你还需要溢出值才能顺利移动。
  • 所以你的意思是两个溢出也必须是 32 的倍数? @TobiasWollgam

标签: c++ sdl sdl-2


【解决方案1】:

以下代码未经测试,但应该可以说明如何解决该问题。请记住,对于较小的 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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-04-07
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多