我正在寫pong遊戲,我有一個球類,它有速度x,y,位置以及所有那些通過調用@ ball.update來更新每一幀的東西,這會通過它的x_vel和Y_vel等向前移動球。 。我的問題是我的碰撞代碼應該在循環中還是在球類的更新方法中?還是應該全部進入循環,球應該不能控制其位置?碰撞檢測代碼在哪裏?
回答
碰撞檢測不應該在你的球類中完成,因爲它需要知道你遊戲中的所有其他物體。
想象一個擁有許多物體的射手,並想想如果每個物體都試圖計算自己的碰撞,會發生什麼。
應該有一個關心碰撞檢測的專用類。如果任何監督對象改變了立場,則通知該班。然後它檢查碰撞並通知所有的abjects(不僅有2個:)有collsion。
有樂趣... :)
對於乒乓簡單的矩陣運算應該是足夠的。如果只有一個球類,則不需要球類,只用於保存元組。
像你所描述的球類確實是一個好主意。如果你喜歡在某些「突破」遊戲中產生兩個或更多球,或者如果你想在其他遊戲中重新使用該代碼,那麼你可以複製它。你也可以使用類似X,Y座標的Paddle類(或者如果它們共享許多這樣的相似成員,則從「ScreenObject」類派生出球和槳)。 Paddle可以讀取由線程/事件接收用戶輸入更新的共享變量。
基於全局可訪問的值(如屏幕尺寸範圍),可以在Ball類中完成簡單的碰撞,例如對牆壁的碰撞。您的更新例程可以簡單地在該特定牆被擊中時反轉一個速度分量。您可以在Ball類中定義和設置代表/回調以在球彈跳時播放聲音。同樣,Paddle's Update可以檢查屏幕大小,因此您無法將屏幕移出屏幕。
與TottiW建議的一樣,對象之間的碰撞最好在擁有所有對象或可以訪問其X,Y成員或邊界框的父級「經理」類中完成。這是很好的面向對象設計。球和槳不應該訪問彼此的X,Y位置! ...但經理呢。它也可以消除多餘的碰撞檢查。如果對象A檢查與對象B碰撞,則B不應該隨後檢查與A的碰撞。因此,實際上,所有的經理級需要做的是,對於每個槳,檢查每個球的位置。這可以進一步簡化,因爲槳可能只在一個方向上移動,例如水平地在固定的Y位置移動。因此,您的第一次檢查可以立即消除任何Ball.Y < Paddle.Y,簡單的例子(取決於Y的方向)。
對於有很多對象的遊戲,你不想碰撞檢測每一個,只是最近的。在這種情況下,「經理」變得更像是一個「場景管理器」,它可以在X和Y方向上保持對象的鏈接列表。當對象移過其他對象時,它們交換列表中的指針,所以列表總是保持排序。這樣,對於任何給定的對象,我們知道對象立即到左/右/上/下,所以我們只需要對這些對象進行碰撞檢查......節省大量時間並使您的遊戲以最快速度運行。雖然也許你不是這個意思!
祝你好運,並像其他人一樣說,玩得開心!
- 1. 在哪裏做碰撞檢測
- 2. box2d碰撞檢測,代碼
- 3. 碰撞檢測:碰到哪邊? [Java,Slick2D]
- 4. 碰撞檢測
- 5. 碰撞檢測不檢測
- 6. 碰撞檢測和碰撞響應
- 7. Cocos2D碰撞檢測
- 8. GameQuery碰撞檢測
- 9. 檢測牆碰撞
- 10. 檢測碰撞JavaScript
- 11. Java碰撞檢測
- 12. XNA碰撞檢測
- 13. 碰撞檢測Javascript
- 14. 碰撞檢測Swift
- 15. 在OpenGL中檢測碰撞
- 16. 在javascript中碰撞檢測
- 17. 碰撞檢測代理方案
- 18. 簡單的碰撞檢測在cocos2d box2d..nothing發生在碰撞
- 19. java中的碰撞檢測
- 20. Andengine TimerHandler和檢測碰撞
- 21. 如何檢測UIImageView碰撞
- 22. AS3:如何檢測碰撞?
- 23. Unity3D中的碰撞檢測
- 24. Android中的碰撞檢測
- 25. 碰撞檢測失敗Box2d
- 26. 執行碰撞檢測
- 27. Box2d Cocos2d ContactListener檢測碰撞
- 28. 抽象碰撞檢測
- 29. Tkinter帆布碰撞檢測?
- 30. Box2D碰撞檢測問題?
謝謝,這些評論非常有用! – Ell 2010-11-02 16:12:09