2011-12-21 91 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

相关问题