帧同步游戏开发框架(推倒重构版)

来源:互联网 发布:linux fork多个子进程 编辑:程序博客网 时间:2024/06/07 04:10

帧同步消息、对象池、逻辑/视图层对象、事件消息!


1. 帧同步消息

帧同步消息由Msg目录下的几个文件进行管理,所有Input进行的操作皆是SendMsg来开始。


2. 对象池

对象池管理比较复杂, 但是对于整个程序而言十分重要,且可以帮助理清程序的结构,一定程度上帮助实现解耦。

对象池分为两个:LogicObjectPool和ViewObjectPool

每个对象池以字典的形式进行存储,然后字典里每个键值对是以   类型名-堆栈  的形式存在的。即例如Tank逻辑对象,键值对表现为:(string "tank",Stack<LTank>)形式,每增加一种新对象时开一个新的堆栈进行存储。

对象池中的堆栈存储的是LogicObject的基类。当存在已有对象时,可以返回对象,若不存在,则需要根据String调用生成函数生成对应的Object。

....

至于已有对象怎么修改值使得其值属于新生成对象的属性,待讨论。


3. 逻辑/视图层对象

逻辑/视图层对象,在此前已有所涉及,但代码结构略乱,思路驳杂。在此进行大规模的重构。

重构的基础核心思想:生成两个基类:LogicObject和ViewObject基类,这两个类主要实现所有逻辑和视图对象的基本元素,例如LogicObject的移动速度,质量,以及我们会需要用到的其他共有元素等。ViewObject中包括LogicObject,绑定函数,等等。


4. Event事件机制

在逻辑层与视图层之间,可以采用Event事件机制来进行通信。简单来说,就是像Msg那样的发送和处理消息的方法。不过该方法已经封装好了,只需要正确使用即可。用于程序内部的通信,最重要的是可以大大的优化Logic和View之间的通信结构,而且对于解耦很有帮助。

    //全局事件    public static EventDispatcher GlobalEventDispatcher = new EventDispatcher();//坦克开火            dispatcher.SendEvent(EventType.TANK_SHOOT, null);//坦克转向        //冷却的时候也瞄准,通知view层朝向        dispatcher.SendEvent(EventType.TANK_AIM, dir);//然后在对应的View视图处理            LTank.dispatcher.AddEventHandler(EventType.TANK_AIM, OnLogicAim);            LTank.dispatcher.AddEventHandler (EventType.TANK_SHOOT, OnLogicShoot);            LTank.dispatcher.AddEventHandler(EventType.TANK_UPGRATE, OnUpgrate);//我们将dispatcher变量在Logic基类中声明,方便使用//然后在View中定义相关处理即可


5. Manager  Input  Else

剩下的则是各种管理类和输入处理类,以及其他的如摄像机跟随和适配之类的处理类。

原创粉丝点击