2016-02-12 133 views
2

我想實現使用SDL 2的背景滾動。 據我所知,只能通過整數值移動源矩形。 當我每移動一次遊戲循環時,我的滾動效果就會很好。 但我想慢一點。我嘗試使用此代碼我該如何實現一個緩慢平滑的背景滾動sdl

moved += speed; 
    if (moved >= 1.0) { 
     ++src_rect.x; 
     moved -= 1; 
    } 

這裏movedspeeddouble s到移動。我希望我的背景移動速度慢十倍,因此我將speed設置爲0.1。它確實移動了十倍,但動畫不再流暢。它從一個像素跳到另一個像素,當速度很低時看起來和感覺都很難看。

我想讓我的背景更大,並使用整數滾動它。也許當背景足夠大時,1的速度似乎會變慢。

有沒有一種方法可以緩慢而平滑地同時滾動一個非常大的背景?

謝謝。

+0

我試着用'1'滾動背景,用'5'滾動。當瓷磚在其前面移動五倍時,背景運動看起來很緩慢且平滑。也許只是讓背景變大一點,用「1」來滾動它就是要走的路。 – sasha199568

回答

0

我會做的是有一組浮點數來跟蹤虛擬屏幕的位置,然後當你實際渲染時你只需將浮點數轉換爲整數,這樣你就永遠不會失去浮點精度。

給你舉個例子,我有一個SDL_Rect,我想把它移動到每一幀。我有一個追蹤每一幀我會更新這些x和y位置,將它們轉換成整數,然後渲染矩形的矩形的x和y位置,兩個浮點變量,EX:

// Rect position 
    float XPos = 0.0f; 
    float YPos = 0.0f; 

    SDL_Rect rect = {0, 0, 64, 64}; 

    // Update virtual positions 
    XPos += 20.0f * DeltaTime; 
    YPos += 20.0f * DeltaTime; 

    // Move rect down and to the right 
    rect.x = (int)XPos; 
    rect.y = (int)YPos; 

雖然這並不能給你想要的確切結果,這是我知道要做到這一點的唯一方式,它會讓你更準確地延遲你的動作,而不會讓你在運動中變得醜陋,它也會讓你添加更加精確的加速。希望這可以幫助。

+0

我剛剛試過你的代碼。也許你的代碼比我的代碼好,但動畫仍然像顫抖一樣,因爲當每次迭代的速度都是「浮動」時,位移距離將會不同。因此浮動滾動不會平滑。 – sasha199568

+0

爲了解決這個問題,你可以考慮做一個添加,我的確這樣做是因爲它將每一幀的位置相乘,嘗試添加一個平坦的浮動並且看看你得到了什麼。 –