2011-12-21 78 views
1

對於愛好我正在做一個遊戲。遊戲中有一個追逐人類的怪物(吃豆子般的)。當吃豆子卡住時,可以吃人或做些動作;應該提出一個事件。這是因爲我的程序變得不合時宜,因爲所有的對象都必須知道彼此之間什麼內聚力不好。在這種情況下,我是否需要製作自定義事件?

有一個類似於對象的控件(稱爲遊戲),它應該響應事件;人爲移動,怪物移動,人爲食用,怪物卡住,並最終讓視圖知道發生了一些事情,因此重新繪製。還有一點重要,即觀點對演員的按鍵作出反應,並且這些事件應以某種方式(也與事件相關)到達人類。

  1. 有人可以幫我解決這個問題嗎?我在網上搜索了同樣的問題,但沒有遇到類似的問題。

  2. 在MVC中:控制器是否知道視圖?如果是這樣的話:整個程序是從控制器開始還是從視圖開始? (是什麼讓誰)

回答

1

基本上事件處理機制只是一個生產者 - 消費者模式,想像你正在生產一些事件(行動),並設定有需要通知你的行動誰聽衆。

是否要使用Java內置事件處理取決於您已編寫多少代碼(如果重構代碼以使用Java事件)處理需要付出很大的努力,並且您只有有限的設置的事件,那麼你可以編寫自己的消息傳遞系統。但顯然,應該優先使用Java事件處理機制,因爲它需要通知所有爲該事件註冊的監聽器,所以您不必擔心通知每個監聽器,隨後在調試時會幫助您進行調試錯誤。我希望這回答了你的第一個問題

總之你可以編寫自己的事件,如HumanMovedEvent,MonsterMovedEvent等

即將到您的第二個問題,是在MVC中,控制器知道還有些什麼看法,它需要觸發任何具體行動。控制器可以選擇任何具體行動的任何具體的看法,如果u做一些動作一讓說,你可以調用視圖V.

和是你的程序與發送從UI到控制器的請求開始。然後控制器選擇它需要呈現的視圖來執行該特定操作。

我希望我清楚:)

+0

感謝關於MVC部分:-)這幫助了我,因爲我認識的一些人相信,控制器只會讓模型保持在一起,並且不知道視圖。 我在想像一個自定義事件,類GameEvent擴展了EventObject。用描述事件的ID(使用像GameEvent.EntityMoved,HumanEaten,SnapperStuck等常量)。 我唯一需要知道的是;如何捕捉像箭頭這樣的關鍵事件的視圖讓人知道他必須向上移動? – zondvloed 2011-12-21 20:43:31

+0

你的想法是創建一個類GameEvent,並使用常量(如ENtityMoved等)引用每個事件是很好的。回到你的問題,你的觀點如何讓人知道可以通過這種方式實現。 ArrowUpEvent ---> Controller監聽事件併發送到查看---->查看生成另一個事件--->人類對象從視圖中接收事件。 – 2011-12-21 21:07:19

+0

所以你建議我應該有另一個名爲MoveHuman的自定義事件(或者在GameEvent中使其成爲一個常量)並讓人類聽它?但是,並不是每個人都依賴於GameEvent類(例如,這是否會使凝聚力好)?感謝您的幫助和時間在這個問題btw! – zondvloed 2011-12-21 21:15:25

0

在MVC中,控制器知道這兩個模型對象和視圖。模型對象不知道誰在控制它,同樣,視圖也不知道這一點。模型和視圖通常通過回調與控制器進行通信:模型爲各種回調方法定義一個接口,並且具有一個持有指向該接口的指針的「委託」實例變量。控制器將自己設置爲模型上的代表。同樣的觀點。 相反回調,你也可以使用事件按照你的建議,這將增加脫鉤額外的一層:

  • 模型可以有多個聽衆的事件,而不僅僅是控制
  • 如果控制器還使用事件與模型進行通信,然後控制器根本不需要了解模型,而只需瞭解事件。

通常,您的程序中每個對象(一個怪物模型,怪物視圖和怪物控制器)都有一個模型 - 視圖 - 控制器組合。但是你也可以有一個控制器管理多個模型對象和/或視圖。這取決於你使用的UI框架,這種方法最實用。

第二個問題還取決於您使用的UI框架。通常,控制器實例化視圖,但是一些框架以不同的方式進行。

對於您提到的keyboad鍵:通常視圖會通知控制器按下「ctrl-K」鍵,控制器會將其轉換爲模型對象「move 1 space up」的命令。

+0

我爲我的GUI使用Swing。一個jpanel實現了一個keylistener。我在程序中發現的唯一一件事就是視圖讓人知道他必須向上移動。這是因爲控制(在我的情況下稱爲遊戲)與人類沒有直接的聯繫(因爲遊戲有一個遊戲場,有什麼細胞,什麼可以有一個實體可以是人類) – zondvloed 2011-12-21 21:56:42

+0

在你的情況下,我建議你(1)向控制器添加關於哪個對象是人的知識。或者,或者這些替代方案中的一個可能會做到:(2)給人類自己的控制器並查看並指示所有鍵盤輸入到該視圖,或者(3)讓公共控制器將鍵盤輸入轉換成只有人類對象被註冊爲執行。 – fishinear 2011-12-22 15:45:19

相關問題