`
cloud21
  • 浏览: 389869 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

关于游戏引擎

    博客分类:
  • Game
阅读更多
1,为什么要游戏引擎?
假设你做完了100个游戏,你会发现其中有很多通用的东西,那好,提炼出来,这就是游戏引擎。
2,它应该是什么样子?
1,时间管理
1,提供尽量均匀的逻辑帧频用以更新逻辑
2,可伸缩的动画帧频用来绘图(如果cpu压力大时可以略过一些动画帧以保证在正确的时间看到正确的效果)
3,附加功能
1,排程,就是能指定在某段时间后调用某函数。
2,下一帧执行某逻辑(这个在一些情况下你会于遇到的)
2,对象管理
1,持有对象,以嵌套方式持有,支持对象分组。
2,方便的查找对象(所谓“方便”,指的是你能在代*的任何地方查找特定对象,但是注意只许读不许写!这是很实用的功能),基于对象名字(字符串)查找,如:tank102
3,生成,销毁对象
4,*作对象,即调用对象的某些方法
5,对象间通信
1,对象能向特定对象,特定对象组,或全体对象进行事件广播
6,对象持有VO (valueObject)
1,DataVO这个是跟具体游戏有关的vo,比如FishVO
2,PhysicsVO 物理VO,存贮一些物理属*
3,一个附加的情况,注意MetaVO(例如有100个鲫鱼的vo,那么所有鲫鱼都有的通*,比如属于鱼类,都会游泳,最大活100岁等,这就叫metaVO,实际使用时都是存放在一个MetaManager中,全局可读即可)
3,资源管理
1,素材管理(图形,声音,文案),素材的加载(队列式加载,加载后可重用)
4,输入管理,鼠标和键盘,并且能被代*在任何地方方便的访问(因为这两个是只读属*,所以可以做成单例)
1,鼠标,~暂时没想太多
2,键盘,能同时检测多个按键
5,状态机
这个太重要了!没有状态机就没有游戏
1,位于逻辑部件内
2,支持状态间切换,
3,支持定制状态。
4,能方便的与逻辑部件交互(就是发送事件)
5,State内提供onClick和onAnimEnd方法,处理鼠标点击和动画播放完毕,非常实用
6,State内能方便访问到VO(dataVO,physicsVO等)
6,物理引擎
0,对物理对象的持有,增加,删除,更新(需要由引擎的时间管理模块来驱动)
1,物理对象数据结构,尺寸,位置(,速度,加速度),旋转,缩放等(..质量,转动惯量)
2,由力驱动,有流体阻力,摩擦力效果
3,碰撞检测,
1,每个物体有自己的碰撞ID和碰撞mask(决定哪些可以与之碰撞)
2,碰撞后能通知到游戏实体 (这个技术目前比较成熟了 )
7,渲染引擎
0,对渲染对象的持有,增加,删除,更新(需要游戏引擎的时间管理模块来驱动)
1,就是kgame5的3d引擎了,或者其他任何一个渲染引擎
2,注意渲染引擎只管绘图即可,不要做跟逻辑相关的事情
3,渲染对象产生的事件,如用户输入,或者动画播放完毕等,要发送给事件调度模块,只能单向向事件模块通信
4,渲染对象对外接口
1,播放制定动画
2,其他~
8,事件管理
1,虽然列在最后,但这个是非常重要的系统,它保证系统中实体的组件之间,实体与自己组件,实体与实体,游戏引擎Shell(对,就是liunx中shell的概念:内核的外壳)与游戏内核之间的通信
2,同一实体的组件之间,不可直接通信,由一个事件管理组件来接受各个事件并做分发,类似mediator模式,每个comp可以发送实体内消息,由eventMediatorComp接受并转达到目标组件,这样的好处是
1,在事件真正到达目标之前可以做些修整,
2,另外,事件代*集中于一处,便于管理
3,实体与实体之间
游戏引擎中有一个实体间消息管理器,实体间不要直接通信,好处是
1,可在消息真正到达目标前做修整,同时也便于调试
2,避免直接消息通信带来的混乱
实体间消息管理器的作用是:
1,向某个特定实体广播
2,向某一组或几组实体广播
3,向全体实体广播
4,每个实体都有事件管理组件,其作用是
1,实体内组件间事件中介
2,接受实体间消息管理器发来的消息
4,实体与游戏引擎外壳
实体通过对外接口组件暴露可被外部调用的接口,游戏引擎外壳通过调用实体对外接口组件暴露的方法来工作
实体通过发送shellEvent来通知游戏引擎Shell,比如,玩家在游戏中进行了某个需要调用通信模块的方法
9,今天先写到这里,未完待续...
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics