2012-10-20 96 views
1

我正在設計一個簡單的遊戲,您可以避免被我創建的AI所擊中。簡單的Java碰撞檢測

我一直在尋找碰撞檢測,我有一個問題。

我查過的所有信息似乎都涉及到使用相當多的代碼。

我在想,爲什麼不能簡單:

if(AI.xDirection == x || AI.yDirection == x || AI.xDirection == y || AI.yDirection == y){ 
     System.out.println("Collision"); 

用於此?

正如你所看到的,我已將它設置爲打印到控制檯,它似乎爲我工作。

這是否有缺點?

回答

1

您的代碼假定所有的客戶端都關心是否存在衝突。可能有遊戲和其他客戶希望在某些情況下以某些方式處理碰撞的情況(例如,前段時間我製作了一個程序,可以在隨機障礙物之間來回跳動球,並且取決於哪一方是首先命中,它不得不朝那個方向反彈)。

這個名單繼續討論客戶在碰撞後希望發生什麼,但是如果你想要的只是顯示一個碰撞,那麼嘿,爲它做人。

+1

我不是那麼簡單,但我的意思是最初檢測到碰撞。 所以......本質上來說,使用你的球彈跳的例子,我不能讓代碼反射到對象的簡單IF語句中,類似於我正在使用的代碼嗎? – Sawyer05

+0

是的,在最簡單的情況下,你擁有的是正確的。我只是說你應該認識到這樣一個事實:對於處理碰撞的更復雜的程序,所使用的對象不能簡單地轉換爲具有X和Y變量的東西,因此代碼更多/涉及的邏輯 – yiwei

+0

我明白了,我只是測試了一些其他的形狀,我看到哪裏會需要更高級的編碼。感謝您的幫助! – Sawyer05

2

不知道你的代碼實際上在做什麼,但如果它工作並且對你來說是可以理解的,那麼我不明白爲什麼你應該改變它!

+0

同意。這對我來說沒有意義,但如果它漂浮在你的船上,就把它運出去。 –

+0

對不起!,x和y是基於我在屏幕上移動的對象的座標,而AI.xDirection是一個隨機移動的矩形。 我只是擡頭看着碰撞檢測,希望結果能像我想的那麼容易,而且對我來說他們是顯而易見的! – Sawyer05

0

你違背封裝這種做法。

Prefer定義了一個自定義對象,例如:AIPosition(可能是不可變的),專用於封裝AI座標。包含方法

AIPositionboolean doesCollideWith(AIPosition anotherPosition)

AI將包含委託方法:

public boolean doesCollideWith(AI anotherAi){ 
    aiPosition.doesCollideWith(anotherAi.getAIPosition()); 
} 

你的呼叫將是:if(ai1.doesCollideWith(ai2))

因此,如果以後座標涉及第三元件(像z),您的客戶代碼不需要更改。

+0

是的,它是我查找時發現的代碼。我仍然是Java新手,起初我猜想我正在使用if語句。 只是想知道爲什麼它不是更常用。 感謝您的信息! – Sawyer05

+0

@ Sawyer05好的。因此,您的代碼越有條件越好。爲什麼?檢查開放/封閉原則http://en.wikipedia.org/wiki/Open/closed_principle和什麼是真正封裝的代碼(不限於getter和setter) – Mik378