我正在用Java制作一个游戏,我想我对如何处理事件非常了解。听起来不错吗?
一个Window
类 - 视图。它是当前世界的代表。
还有一个Game
类 - 控制器。 (该模型的实现与此问题无关)。
Window类不关心事件。因此,事件监听器只需将它们分派到Game
类(通过game.notifyEvent(Event e);
之类的东西。
Game类在收到此事件后,将开始更新值等,并且将更改某些变量(如播放器的位置)。此时,它使用其类变量Window w
来通知 it 更改(通过w.movePlayer(Position p)
等各种方法。
那么,这听起来像是对你有用的东西吗?
答案 0 :(得分:2)
是的,你正在做的事情是有道理的。我觉得让窗口听游戏要比其他方式更直观。我还发现,如果你将GUI的不同区域分开并通过细粒度的界面将游戏传递给每个区域,那么Java就更易于维护。我通常会获取GUI元素来监听模型中的更改,并请求处理任何交互。通过这种方式可以更轻松地进行单元测试,如果您没有合适的自动化套件,甚至只是用于记录,您可以使用假的替代测试来替换GUI。
通常拆分GUI会导致某些面板纯粹倾听,而某些面板纯粹是相互作用的。这使得关注点分离得非常可爱。我用自己的类扩展JPanel
代表面板,让Window在构建时将游戏传递给它们。
例如,如果我有两个面板,其中一个显示结果,另一个显示“更新”按钮,我可以定义两个界面:INotifyListenersOfResults
和IPerformUpdates
。 (请注意,我在这里使用IDoThisForYou
模式制作基于角色的界面;您可以随意调用它们。)
游戏控制器然后实现这两个接口,并且两个面板各自采用相应的接口。 Update接口将有一个名为RequestUpdate
的方法,而Results接口将具有AddResultsListener
。这两种方法都出现在Game类中。
无论你是否让游戏听到窗口或游戏的窗口,通过这种方式通过界面分离事物,一旦事情开始变得更容易分割游戏控制器并委托其职责真的复杂,他们总是这样做!
答案 1 :(得分:0)
我认为您应该在不使用.NET事件的情况下实现Observer设计模式(http://en.wikipedia.org/wiki/Observer_pattern)。在我的方法中,您需要定义几个接口并添加一些代码。对于每种不同类型的事件,创建一对对称接口
public interface IEventXDispatcher
{
void Register(IEventXHandler handler);
void Unregister(IEventXHandler handler) throws NotSupportedException;
}
public interface IEventXHandler
{
void Handle(Object sender, Object args);
}
X表示事件的特定名称(Click,KeyPress,EndApplication,WhateverYouWant)。 然后让你的观察类实现IEventDispatcher,你的观察者类实现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几乎没有经验,但我相信这种模式可能对你有帮助!