2010-10-10 46 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

相关问题