2017-08-26 101 views
-1

我正在使用C++和SDL2製作類似口袋妖怪的遊戲。我試圖完成它的網格移動(其中角色按瓦片移動瓦片,每個瓦片移動32px)。使用SDL2平滑網格移動?

我已經完成了瓷磚運動的瓷磚,但它看起來不光滑,看起來很「機器人」。

這是我到目前爲止有:

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。 我的代碼實際上可行,但正如我所說的,它看起來並不平坦。

任何猜測?

+0

另外你可能想介紹加速。你的動作應該包括三個階段 - 加速,恆速和減速。 – rbaleksandar

+0

你對精靈位置有什麼用處?只有'_x'和'_y'或'overflow *'呢? –

+0

@TobiasWollgam只有_x和_y。 – James

回答

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