2017-04-26 46 views
0

我開始構建2D遊戲,並對我是否應該在更新函數或渲染函數中執行旋轉感到困惑。在更新函數或渲染函數中執行2D頂點旋轉

問題是這樣的;

我有一個三角形,由三個頂點組成。三角形具有度數的旋轉值。

如果我在更新函數中旋轉頂點,則三角形將永遠旋轉,因爲每次更新都會反覆應用旋轉。

因此,我決定不要旋轉更新函數中的頂點,而是在渲染函數中基於原始頂點執行旋轉。

這有效,但現在我有一個不同的問題。頂點實際上並不是它們看起來像的地方。因此,我不能使用頂點執行碰撞檢測等。

唯一的想法是我可以在更新函數中執行旋轉,但有兩組頂點;一個用於原始頂點,一個旋轉頂點。然後在碰撞檢測計算中使用旋轉的頂點 - 雖然這種方法嗅覺不大但效率很低!

我已經放在一起展示應用旋轉渲染功能的codepen; https://codepen.io/anon/pen/pPRjLq

Use arrow keys to rotate 

那麼,我應該旋轉渲染還是更新?如果渲染,那麼我如何保持頂點最新?如果更新,那麼我該如何防止無限旋轉?

任何經驗豐富的人的幫助將不勝感激 - 謝謝!

回答

0

當您更新actor的旋轉時,會在update方法中發生旋轉。

你也不需要記住兩個頂點,如果只有當前頂點的角色和弧度的旋轉,原始頂點不需要被記住,這將是一個更好的選擇。

提前思考,碰撞檢測不應該依賴於actor的位置矢量,更好的方法是爲它定義一個矩形/ AABB,而當將旋轉應用到actor時需要更新/縮放。

如果您確實使用自定義AABB進行檢測,則默認情況下它可以設置爲角色向量的位置,但通過分離構造可以打開很多潛在角色,例如更改角色命中範圍x/y /寬度/運行時的長度;它不應該與演員x/y/width/height結合,這應該與它的圖形表示相關。

要停止無限旋轉,您可以有一個boolean來表明是否保留鍵和一個類似的右鍵,以及類似於下面的內容;

update(delta) { 

    if(keyLeftDown) { 
     // apply rotation as rotation * delta/desiredFPS 
    } else if (keyRightDown) { 
     // 
    } 
} 

希望這會有所幫助。