4. Window Message & Game Event.md

我觉得前面看着这个立方体在那里自转, 这一点也不自由, 所谓3D世界, 至少要有一点控制乐趣, 我想要快点动起来, 以便能够随意遨游. 这个过程涉及到鼠标键盘输入消息的处理, 以及三维观察的概念, 鼠标键盘消息作为最普遍的消息, 不应该只是处理一方面的事情, 因此在这一节会同时引入事件的概念, 而进行自由的观察三维世界, 则需要创建一个照相机.

理论

窗口消息

在创建窗口时, 填充待创建窗口的描述结构中, 需要绑定一个消息处理函数, 在游戏循环中, 通过函数PeekMessage从线程队列获取消息, 在通过TranslateMessage将虚拟消息转换为字符消息, 再由函数DispatchMessage分发消息到绑定到窗口的消息处理函数中, 该函数能够出来来自窗口的所有消息, 大致包括鼠标消息, 键盘消息, 窗口变化三类消息,

事件

什么是事件? 当一些对象的状态发生改变时, 会对周遭产生影响, 那么这个行为便可称之为一个”事件”, 例如: 游戏中一名玩家上线, 它提示另外一些玩家好友上线了, 这个过程中玩家上线可以看做是一个事件, 其他玩家被通知即为该事件产生的影响. 事件非常有用, 在程序中几乎无处不在, 它是各个子系统之间的粘合剂, 是各个子系统之间交流的途径. 因此, 需要一套专门的事件系统来管理这纷繁的实践, 以免其杂乱无章.
一般来说, 一个简单的事件系统包括三个方面: 事件类型, 事件监听器和事件管理器.

  1. 事件类型: 每个事件都有其独特性, 在事件每发送前, 它被抽象成一个数据类型;
  2. 事件监听器: 将事件类型注册到监听器, 表示当此类事件被触发时, 此事件由该监听器处理.
  3. 事件管理器: 事件管理器管理所有的事件, 每当事件注册到监听器都会通知事件管理器将两者绑定, 它接收事件, 将其分发到对应的监听器处理.