对于业余爱好我正在制作游戏。游戏中有一个追逐人类的怪物(像吃豆子一样)。当吃豆子被卡住时,可以吃人或做一些动作;应该提出一个事件。这是因为我的程序变得不合适了,因为所有的对象都必须彼此了解内聚力不好。
有一个类似对象的控件(称为Game)应该响应事件;人类移动,怪物移动,人类吃掉,怪物卡住,并最终让视图知道发生了什么,所以它重新粉刷。同样重要的是,视图会响应演员的按键,并且这些事件应该以某种方式传达给人类(也包括事件)。
有人可以帮我解决这个问题吗?我在互联网上搜索同样的问题,但没有遇到过。
在MVC中:控制器是否知道视图?如果是这样:整个程序是从控制器开始还是从视图开始? (是谁)
答案 0 :(得分:1)
基本上,事件处理机制只是一个生产者 - 消费者模式,假设您正在生成一些事件(一个动作),并且有一组需要通知您的动作的侦听器。
是否要使用Java内置事件处理取决于您已经编写了多少代码,如果重构您的代码以使用Java事件处理需要付出很多努力,并且您只有有限的一组事件,然后你可以编写自己的消息传递系统。但显然,应该优先使用Java事件处理机制,因为它需要注意通知所有为该事件注册的监听器,您不必担心通知每个监听器,以后它将帮助您进行调试,如果发生任何事情错误。我希望它能回答你的第一个问题
简而言之,您可以编写自己的事件,例如HumanMovedEvent,MonsterMovedEvent等。
关于你的第二个问题,在MVC中是的,控制器知道它需要触发任何特定操作的所有视图。控制器可以为任何特定操作选择任何特定视图,假设您执行某些操作A,则可以调用视图V.
并且您的程序开始于从UI向Controller发送请求。然后,Controller会选择为特定操作呈现所需的View。
我希望我明确表示:)
答案 1 :(得分:0)
在MVC中,控制器知道模型对象和视图。模型对象不知道谁在控制它,同样,视图也不知道。模型和视图通常通过回调与控制器通信:模型定义了各种回调方法的接口,并且具有一个“委托”实例变量,其中包含指向该接口的指针。控制器将自身设置为模型上的委托。同样对于观点。 您也可以按照建议使用事件,而不是回调,这会增加额外的解耦层:
通常,您的程序中的每个对象都有一个模型 - 视图 - 控制器组合(一个怪物模型,怪物视图和怪物控制器)。但是您也可以让一个控制器管理多个模型对象和/或视图。这取决于您使用哪种方法最实用的UI框架。
您的第二个问题还取决于您使用的UI框架。通常,控制器实例化视图,但某些框架以不同方式执行。
对于您提到的键盘键:通常视图会通知控制器按下“ctrl-K”的键,控制器会将其转换为模型对象“向上移动1个”的命令。