使用 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;
};
我正在使用 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;
};