一个基于OGRE图形引擎高度面向对象游戏结构.docVIP

一个基于OGRE图形引擎高度面向对象游戏结构.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个基于OGRE图形引擎的高度面向对象的游戏结构 0.前言 其实在此之前真正的游戏我只写过一个的,就是一个叫《紫星村》的。那个游戏情节很缩水的,策划让我增加情节,我就说不行了,因为结构太差了,里面有2000行的switch啊。 当然任何有一点点制作经验的人都会知道这个switch应该用类似状态机这样的更好的方式来实现,在这个事情之后,我就没敢再写过游戏,我一边学习OGRE图形引擎,一面努力的学习游戏结构,这样的文章也真不少,光《游戏编程精粹》中就有《一个游戏实体工厂》《一个基于对象组合的游戏构架》《一个针对巨量多玩家游戏的灵活的仿真框架》等(都是中文版游戏编程精粹23中的文章),网上文章也很多。不过或者太复杂或者太简单,或者用来维护任务而没有消息驱动,或者太底层连内存池都要管理。 去其糟粕取其精华,我们需要一个高度面向对象,消息驱动,拥有有限状态机的结构,能很好的结合OGRE以及其他引擎,能够应用于绝大部分类型游戏,可以支持游戏储存/读取(对象序列化)的结构。我尝试写了一个这样的结构,不敢乱吹牛,不过本人用起来还是满爽的。 1.总体 介绍一下这个结构的思路。 游戏中所有可以活动的物体被称为角色(Actor),角色首先是一个有限状态机,所以他可以有简单的智能。有限状态机能执行瞬时动作或者注册持续动作给角色,角色能维护一些持续的动作(比如寻径)。角色之间可以通过传递事件消息进行交流。 角色们共同存在的空间被称为世界(World),这个概念很广泛,比如一个装载很多物品的背包就是一个物品角色的世界,而背包在更大的世界中却是一个角色,最底层的世界用来维护场景地图(比如BSP地图)。当角色执行某个动作的时候可以对世界广播这个事件,在收听这个广播者角色频道的所有角色都能得到这个事件,当然世界本身也可以向其中的角色广播事件。 写这个程序的时候,我很认真的规范了风格,并生成了相应的文档,下面提到的任何事情,您都可以在本文提供的文档中找到对应的介绍和代码实现。 2.角色的实现 白色的Actor_t(“_t”代表接口)就是角色的接口,当然我们希望在接口层不依赖引擎的实现,是一个绝对的抽象,在角色接口类Actor_t类下面的是游戏具体实现的角色(节点管理角色和表层管理角色,节点管理角色又分成摄像机管理等等),而角色接口类Actor_t本身是一种有限状态机(FSM_t),有限状态机又是一种可以储存对象(SaveObj_t),可以储存对象拥有字符串接口(OGRE::SringInterface)。 OGRE::SringInterface: 这个是OGRE引擎提供的一个可以把类中的属性和字符串互相转换的接口。我们不是说接口层要脱离引擎么,怎么又使用了这个OGRE的东西呢。看了OGRE的源码您就清楚了,这个接口抽象得很漂亮,和其他的引擎的类没有什么依赖的,我们只把这个接口当作大师实现的对象序列化策略就可以了。 SaveObj_t: 在我的源代码中预留了 void SaveObj_t::load ( Std::istream is?) [virtual] void SaveObj_t::save ( Std::ostream os?) [virtual] 这两个读取和储存的接口,并没有具体实现,但是只要有了:SringInterface接口,只要写进去您的储存策略就好了。 FSM_t: 有限状态机的实现。 公有成员 ? FSM_t () virtual? ~FSM_t () virtual void? postEvent (Event_t * evt) ? FSM_t::postEvent( Event_t * evt ) 得到事件. virtual bool? exect () ? exect() 处理下一个事件. void? exectAll () virtual void? addState (State_t * state) 增加新状态 virtual bool? setState (std::string stateName) 设置当前状态 在这里我们把提交事件和处理事件做成了异步处理,这样不仅可以提高松散耦合,更能在以后的改进中用更加灵活的策略处理事件(考虑多线程)。 Actor_t: 游戏世界中的角色 公有成员 ? Actor_t (std::string name) virtual? ~Actor_t () const std::string? getName () virtual void? update ( float timeElapsed ) 更新角色. virtual void? goTo ( World_t * world ) ? 记录进入世界. vi

文档评论(0)

天马行空 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档