2013-12-19 28 views
3

我正在設計一個2D遊戲來練習Java和麪向對象的編程(如果有幫助的話,我使用JSFML庫)和I對如何最好地設計以下內容有疑問:OOP設計:如何確定程序流程和負責方法的類(JSFML庫)

我使用的庫提供了由可見遊戲元素(玩家,敵人,背景等)實現的Drawable界面。我也有一個RenderWindow,我將繪製Drawable對象。

這裏的東西,RenderWindowdraw(Drawable d)方法借鑑了當前窗口中Drawable對象,而Drawable對象都有一個draw(RenderWindow r)方法借鑑了RenderWindow中流過的電流Drawable對象。

如果他們做基本相同的事情,我應該使用哪一個?爲什麼?我應該考慮什麼來決定?我使用HashMap來存儲Drawable對象。我應該將RenderWindow傳遞給HashMap中的Drawables,還是將HashMap中的Drawables傳遞給RenderWindow?任何建議表示讚賞。

回答

1

您的問題的一條線路答案是
Java語言不支持雙重調度機制。

怎麼辦:圖書館希望你重寫這些方法,但從來沒有打電話給他們。我沒有使用庫,但從遊戲引擎的一些經驗,我猜應用程序將調用RenderWindow的繪製,它最終會調用所有Drawable的繪製方法。 (Drawables集合將由RenderWindow維護

原因: Java通過檢查調用方法的對象類(不是通過檢查引用)來動態調用該方法,這稱爲(您可能知道)動態調度
但是該方法的參數僅通過檢查引用來選擇(而不是通過作爲參數傳遞的實際對象的類別)。
這裏,通過強制動態調度兩次(通過爲同一目的製作兩種方法),圖書館開發人員間接實現雙重調度

將來,您可能需要擴展Drawable和RenderWindow,如果您已經繪製了方法i只有Drawable,你不能爲RenderWindow的每個孩子分別繪製。雙派遣解決了這個問題。

希望這有助於。

+0

我不明白,爲什麼我應該重寫這些方法? RenderWindow.draw(Drawable d)有一個工作實現(Drawable由Sprite實現,這是另一個庫類,我沒有提到它使問題更簡單,認爲沒關係)。庫(JSFML)本質上是C++庫的包裝,如果這有所作爲。 –

+1

RenderWindow將有一個標準的實現,您只會在極少數情況下重寫。 Drawable的方法必須被覆蓋。但正如你所指出的,庫提供了一個參考實現(Sprite)(但有時你需要你自己的,比如AnimatedSprite)。所以你只需要在大多數簡單的情況下將Sprites添加到RenderWindow中。 (這是建立一個圖書館的目的,幾乎所有東西都已經實施)。我只是試圖解釋圖書館開發人員可能不會立即需要的設計注意事項。 –