事件调度器模块
记录下我们游戏里事件调度器模块, 用处, 代码结构。
我们用来注册一些事件到调度器, 调度器在做update的时候, 会检查容器内的事件, 事件的封装, 包含senderObj, receiveObj, id, delayFrameCount等等。 如果当前帧已经符合delayFrameCount的要求了, 就执行receiveObj.RecieveEvent()方法,将senderObj注册事件时的参数等, 带入RecieveEvent方法执行。
主要包含3个类:
1, Event.h 提供事件的封装
2, EventReceiver.h 一个简单的抽象基类,纯虚函数RecieveEvent接口, 它的派生类都要实现它, 用来接收事件。
3, EventDispatcher.h 全局的事件调度器,每个game world都将创建一个eventdispatch, 使用World()->GetDispatcher()获取当前world的eventdispatch。
EventDispatcher只有几个简单的接口, Create, Register, Update:
Create 提供给需要创建事件使用, 2个重载函数, 原型如下:
Dispatcher的Create会首先使用对象池alloc一个Event对象, 因为Event.h类型是个足够抽象的类型, 我们不需要每次都生成一个重复的Event对象实例, 比如一个事件它有相同的sender, 一样的receiver, 一样的args, 那么就不用重复初始化实例了, 我们使用自己构造的ObjectPool容器来初始化和free一个实例:
所有需要接收事件的Object, 比如Creature, SKillManager等, 都需要继承EventReceiver类,并提供RecieveEvent接口。
技能释放操作就使用到了EventDispatcher, 当客户端向后端发起一个skill cast, 经过业务逻辑后, 并不会立马在当前帧执行具体的Battle计算, 而是SkillManager创建一个Event, 同时接受者也是SKillManager自己, 对某些技能做成delayToNextCast方式, 比如需要读秒的技能, 需要蓄力过程的技能, 他们并不会立马释放技能, 而且一个延迟释放,这时候就用到了这个事件调度器。
技能模块都是独立与生物类的, SkillManager下次再做分析。