Delta3D(4)教程:Game Manager介绍

这一部分主要介绍Game Manager框架。它包括了Game Manager、Game Actors、Game Components和GameMessages的概览,下面这张图是这部分的高层图。
在这里插入图片描述

1、游戏管理器

通过上面那张图,我们知道Game Manager拥有所有的Game Actors、Normal Actors、Components和Messages,并且,它还管理他们的生命期和他们之间的相互关系。它是应用的核心。

如果你使用Delta3D编写应用程序,你需要把各种内容手工编写到一起,包括:场景管理、物理系统、音频播放、对象加载、动态角色、环境特效、灯光、地形、摄像机和角色动画。但是

  1. 怎么把它们放到一起组成一个游戏?
  2. 游戏中,谁维护所有对象列表?
  3. 怎么管理通信?
  4. 武器装备如何进入游戏并装备到玩家?
  5. 怎么通知玩家他被打中了?
  6. 如果你射中了他,你怎么告诉网络上的其他玩家他受伤了?

以上这些问题,都可以通过游戏管理器提供的一个核心基础结构来完成。

消息、角色和组件

游戏管理器主要完成三件事:

  • 消息管理

通过消息,我们可以在角色、组件、游戏管理器之间进行通信。消息可以用于任何事物之间的通信,如玩家健康指数的更新、人质营救事件通知、新的玩家进入我们的虚拟世界、简单的Tick事件。在系统中,消息可以在所有行为和状态之间进行通信。但是消息不会发送它自己,消息的发送由游戏管理器来处理,游戏管理器负责接收、路由角色及组件的消息。

  • 维护系统内容的所有角色

包括游戏角色和普通角色,它可以跟踪我们通过代码创建或从Map文件加载进来的角色,同时它可以通知角色处理消息,保证它们在合适的时间进入场景或退出场景,甚至通知它们对滴答事件作出响应。

  • 提供游戏管理组件

游戏组件是一个和游戏消息一起工作的高层对象,游戏组件处理更高层面,像网络行为、游戏规则、日志、航位推测等事物,而游戏角色只接收它们感兴趣的特定消息,游戏组件接收所有消息。

2、游戏角色

一个游戏角色就是一个被设计成为可以直接和游戏管理器一起工作的一个角色。

  • 普通角色

即非游戏角色,一般指那些游戏世界中静态的物体,如房子、灯光、树木或地形

  • 游戏角色

给游戏带来生命的东西,游戏角色可以做出Tick响应,可以处理游戏消息,可以和整个世界进行交互。
游戏角色是建立在动态角色层中的,所以,一个游戏角色就需要一个游戏角色代理。
在这里插入图片描述

实际上,游戏管理器只识别游戏角色代理,不直接识别游戏角色,所以我们必须使用角色代理。

3、游戏管理器组件

游戏管理器组件就是一个由游戏管理器管理的可以处理和发送消息的对象,它接收系统中的所有的消息,是我们向游戏管理器添加自定义行为的最主要的方式。

我们推荐采用组件的方式处理不同的行为,而不是直接从游戏管理器派生子类并在子类中编写特定的代码。通过组件我们可以创建航位推测组件、网络组件、日志组件等等。由于组件接收系统中所有的消息,他就能知道所有的角色及系统中发生的任何事情。

4、游戏消息

游戏消息是角色和组件之间相互通信的方式。消息通常用来发送数据(如属性变化)或行为(请求或命令),下图表示了消息在游戏角色、游戏管理器、游戏组件之间的流向。
在这里插入图片描述

以下几个函数需要掌握:

  1. SendMessage() on GameManager
  2. SendNetworkMessage() on GameManager
  3. Invokables on GameActoryProxy
  4. ProcessMessage on GMComponent
  5. DispatchNetworkMessage on GMComponent

系统中如果从其他地方(包括本机和网络)发送一个消息,可以调用GameManager的SendMessage(),要通过网络发送消息则调用SendNetworkMessage()

组件接收所有消息,可以重载ProcessMessage()接收普通的消息,重载DispatchNetworkMessage()接收准备发送到网络上的消息,通常,RulesComponent处理普通消息并把他们重新发送到网络。

对于角色来说,从不会接收网络消息,他们只接受普通消息。由于系统存在大量角色,从性能考虑,不会把所有消息发送给所有角色。角色需要通过可激活体进行注册来接受他们感兴趣的消息(通过游戏角色代理添加可激活体),角色的三个默认可激活体:

  • TickLocal()
  • TickRemote()
  • ProcessMessage

下图是一个角色有一些更新数据需要发往世界的展示。
在这里插入图片描述

  1. 坦克代理创建一个ActorUpdate消息
  2. 告诉游戏管理器调用SendMessage()处理此消息
  3. 游戏管理器先将消息放入消息队列
  4. 在下一次tick时取出该消息
  5. 在所有组件上调用ProcessMessage()处理该消息
  6. 调用所有注册需要接受该消息的角色的回调

以上是游戏管理器的理论介绍,下一篇开始正式进行教程的编码…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deverwh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值