2010-10-10 69 views
2

我正在用Java做一個遊戲,我想我對如何處理事件有個很好的想法。這聽起來正確嗎?這是處理Java事件的好方法嗎?

A Window class - 視圖。這是目前世界的代表。 還有一個Game類 - 控制器。 (模型的實現與這個問題無關)。

Window類不關心事件。因此,該事件偵聽器簡單地把它們分派到Game類(通過類似game.notifyEvent(Event e);

遊戲類,一旦收到這個事件的,將開始更新值等,以及一些變量(如播放器的位置)將被改變。在這一點上,它使用了類變量Window w通知的變化(通過各種方法,如w.movePlayer(Position p)

那麼,這是否健全喜歡的事,將是有意義的你?

回答

2

是的,你在做什麼是有道理的。我覺得讓窗口聽比遊戲更直觀。我還發現,如果您將GUI的不同區域分開並通過細粒度的界面將遊戲傳遞到每個區域,則Java更易於維護。我通常會獲取GUI元素來偵聽模型中的更改,並請求處理任何交互。這種方式使得單元測試變得更加簡單,如果你沒有一個體面的自動化套件,甚至只是用於日誌記錄,你可以用僞造的替代GUI來進行驗收測試。

通常拆分GUI會導致一些面板純粹收聽,而一些面板純粹是互動的。它讓人非常可愛的分離問題。我代表他們自己的類別延伸JPanel的面板,並讓這個窗口在構建過程中將它們傳遞給他們。例如,如果我有兩個面板,其中一個顯示結果,其中一個面板顯示「更新」按鈕,我可以定義兩個界面:INotifyListenersOfResultsIPerformUpdates。 (請注意,我在這裏使用IDoThisForYou模式製作基於角色的界面;無論你喜歡什麼,都可以給他們打電話)。

遊戲控制器然後實現這兩個接口,並且兩個面板各自採取相應的接口。更新界面將有一個名爲RequestUpdate的方法,結果界面將有AddResultsListener。這兩種方法都出現在Game類中。

無論你是否讓遊戲聽取窗口或遊戲窗口,通過以這種方式通過接口分離事物,你可以更輕鬆地稍後拆分遊戲控制器並委託其職責,一旦事情開始真的複雜,他們總是這樣做!

+0

所以在我調用'game.pushEvent(e)'後,我應該調用'ChangeObject changes = game.getChanges()'或者什麼?爲了傳遞信息,似乎很陌生。 – 2010-10-10 22:29:41

+0

我通常只是創建一個小接口,而不是創建一個ChangeObject類,然後將該接口直接放在遊戲中。如果它太複雜了,你可以稍後拆分另一個類,並使用依賴注入將它傳遞給遊戲和窗口。 – Lunivore 2010-10-11 08:22:24

0

我認爲你應該實現Observer設計n模式(http://en.wikipedia.org/wiki/Observer_pattern),而不使用.NET的事件。在我的方法中,您需要定義幾個接口並添加一些代碼。對於每一個不同類型的事件,創建一個對對稱接口

public interface IEventXDispatcher 
{ 
    void Register(IEventXHandler handler); 

    void Unregister(IEventXHandler handler) throws NotSupportedException; 
} 

public interface IEventXHandler 
{ 
    void Handle(Object sender, Object args); 
} 

X表示事件的具體名稱(點擊,按鍵響應,EndApplication,WhateverYouWant)。 然後讓你觀察到的類實現IEventDispatcher,請和你的觀察器類(ES)實施IEventHandler

public class Dispatcher implements IEventXDispatcher, IEventYDispatcher ... 
{ 
    private List<IEventXHandler> _XHandlers; 
    private List<IEventYHandler> _YHandlers; 

    void Register(IEventXHandler handler) 
    { 
     _XHandlers.Add(handler); 
    } 

    void Unregister(IEventHandler handler) throws NotSupportedException 
    { 
     //Simplified code 
     _XHandlers.Remove(handler); 
    } 

    private MyMethod() 
    { 
     [...] 
     for(IEventXHandler handler: _XHandlers) 
      handler.Handle(this, new AnyNeededClass()) 
     [...] 
    } 
    //Same for event Y 

所有的代碼都是手寫的。我對Java有一點經驗,但我相信這種模式可能對你有幫助!

+1

無論如何,MVC基於觀察者設計模式 - 這就是'game.notifyEvent(...)'所做的事情。 – Lunivore 2010-10-10 10:51:38

相關問題