2009-07-17 94 views
6

我正在用Java編寫一個簡單的遊戲,但我試圖用一個漂亮乾淨的設計來做'正確',而且沒有黑客。面向對象的遊戲設計問題

我有兩個類GamePanel接收點擊和按鍵和Model其中包含所有的實體,並負責其更新。該模型需要知道用戶的鼠標在哪裏,但我不能決定「正確」的方式來做到這一點。

如若ModelEntity內保持一個參考GamePanel或只是緩存最後已知鼠標位置和接收定期GamePanel更新。在創建模型時的第一個選項中,需要給出對GamePanel的引用,第二個最後一個鼠標位置將作爲參數發送給World.update()方法。

這些解決方案看起來都不那麼優雅,所以我想知道是否有一種「正確」的方式來做到這一點,我錯過了。

謝謝, 本。

+0

好問題,+1。 – 2009-07-17 20:49:04

+0

所以我認爲共識是,如果鼠標位置只是偶爾需要使用觀察者或事件監聽器,並且如果在大多數更新中需要鼠標位置,那麼給該模型一個對面板的引用,以便它可以輪詢它? – 2009-07-17 21:45:48

回答

3

在我看來,這取決於你的課程如何互動。觸發模型類中的實體的鼠標位置是否發生了變化?或者Model類是否獨立於GamePanel並且僅適用於鼠標位置的當前值?

如果晚些時候,那麼我同意傑夫在我之前所說的話。在創建它時將GamePanel上的句柄傳遞給Model類,並讓每個實體在需要時使用句柄來訪問鼠標位置。這樣,始終使用更新的鼠標位置。

如果前者我建議使用觀察者讓Model類知道鼠標位置值何時發生變化。然後Model類可以使用相同的設計(即讓Model類總是在GamePanel類上有句柄)並訪問GamePanel中的當前值。

總結我對你的問題的回答,我認爲它只符合OO的概念,讓GamePanel保持鼠標位置的值,並讓其他類使用GamePanel實例訪問這些信息。

謝謝, Rohan。

2

您可以始終將當前座標作爲GamePanel的公共屬性,以便實體/模型可以從此處簡單訪問它。

1

如果你想查詢當前鼠標的位置,你可以在任何時候你想運行在事件指派線程的代碼snipplet:

Point pt = MouseInfo.getPointerInfo().getLocation(); 
Point cpt = GamePanel.getLocationOnScreen(); 
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y); 

而且相對包含鼠標的相對位置。

另外,你可以看看JInput,因爲它被設計爲處理鍵盤/鼠標/任何輸入。

+0

MouseInfo自1.5 – akarnokd 2009-07-17 20:18:45

3

一個常見的解決方案是引發事件。在這種情況下,GamePanel會觸發一個事件,通知所有感興趣的(訂閱事件)對象(實體)在新鼠標位置的模型中。

通過這種方式,GamePanel不需要明確知道要通知哪些實體,並且實體不需要保留GamePanel的實例。

我的建議:閱讀事件監聽器。 (Java.util)

+0

Java.util是什麼意思?鼠標事件和偵聽器位於java.awt.event包中。 – akarnokd 2009-07-17 20:34:54

1

模型是否總是需要知道鼠標的位置。 IE:你是否需要每次更新時的鼠標位置,或只在特定點上。

如果您在每個點或每次更新時都需要它,那麼您記錄的解決方案或任何解決方案都應該是穩定的。

如果您只需要它在特定的點,然後只抓住它然後。 (IE:如果你的遊戲響應鼠標點擊,然後點擊一下。)含義閱讀關於事件監聽器。

祝你好運!希望有所幫助。