2010-10-31 67 views
1

我正在寫pong遊戲,我有一個球類,它有速度x,y,位置以及所有那些通過調用@ ball.update來更新每一幀的東西,這會通過它的x_vel和Y_vel等向前移動球。 。我的問題是我的碰撞代碼應該在循環中還是在球類的更新方法中?還是應該全部進入循環,球應該不能控制其位置?碰撞檢測代碼在哪裏?

回答

3

碰撞檢測不應該在你的球類中完成,因爲它需要知道你遊戲中的所有其他物體。

想象一個擁有許多物體的射手,並想想如果每個物體都試圖計算自己的碰撞,會發生什麼。

應該有一個關心碰撞檢測的專用類。如果任何監督對象改變了立場,則通知該班。然後它檢查碰撞並通知所有的abjects(不僅有2個:)有collsion。

有樂趣... :)

1

對於乒乓簡單的矩陣運算應該是足夠的。如果只有一個球類,則不需要球類,只用於保存元組。

2

像你所描述的球類確實是一個好主意。如果你喜歡在某些「突破」遊戲中產生兩個或更多球,或者如果你想在其他遊戲中重新使用該代碼,那麼你可以複製它。你也可以使用類似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方向上保持對象的鏈接列表。當對象移過其他對象時,它們交換列表中的指針,所以列表總是保持排序。這樣,對於任何給定的對象,我們知道對象立即到左/右/上/下,所以我們只需要對這些對象進行碰撞檢查......節省大量時間並使您的遊戲以最快速度運行。雖然也許你不是這個意思!

祝你好運,並像其他人一樣說,玩得開心!

+0

謝謝,這些評論非常有用! – Ell 2010-11-02 16:12:09