上篇文章介绍了sceneObject,我们知道sceneobject是一个抽象类。场景中的物体,包括天空、地面、水体、建筑、植物、人物、交通工具、摄像机、标记点、声音源等都是建立在sceneObject class之上。所有这些物体在TGE中都对应了一个实体类。游戏中的类是对现实世界物体的抽象,我们想一想,上面这些物体中怎样去抽象。首先我们可以把物体分为静态物体和动态物体,像天空、地面、建筑、水体这些东西都可近似归为静态物体。而人物、交通工具、摄像机可以归为动态物体。动态物体在游戏中,我们必须实时进行计算更新,包括位置、速度、动作等。而静态物体我们只需要负责进行渲染就可以。基于这个思想,TGE中把动态物体抽象成GameBase类,而另外一些静态物体则直接在sceneObject上进行扩展,例如Sky、TerrainBlock、WaterBlock、TSStatic、Marker、InteriorInstance。下面我会着重讲解一下GameBase类。
一、GameBaseData
在介绍GameBase类之前,我想先介绍一下GameBaseData类,这个类继承于SimDataBlock。GameBaseData实际上就是GameBase类的静态属性,而且GameBase的所有子类都会有一个Data类,例如Player会有一个PlayerData类,在GameBaseData中只有两个简单的属性:category和className。category用于在场景编辑器中进行分类,className用于指定类名。
二、GameBase核心函数
上面我们提到GameBase代表的是动态物体,既然是动态物体,那么我们就必须在游戏中进行实时更新。在GameBase中有三个函数提供了基于时间的运算更新。这三个函数分别是:processTick(Move*)、interpolateTick(float)、advanceTime(float)。这三个函数在引擎中的调用频率是32ms调用一次,也就是说平均一秒调用32次。第一个函数在服务器和客户端都能执行,主要用来更新物体的位置、状态等。interpolateTick函数只在客户端执行,主要用来进行插值计算、advanceTime也只能在客户端执行,用来更新动作。这三个函数的调用都是在ProcessList类中的函数中调用的,ProcessList是一个和GameBase密切相关的一个类,ProcessList可以说是GameBase对象的一个管理器。在TGE中有两个ProcessList的全局对象,分别是gClientProcessList和gServerProcessList,负责客户端和服务端的GameBase对象管理。每个GameBase对象在创建时都会被加入到一个gClientProcessList或gServerProcessList中,引擎就是通过这两个链表对所有的GameBase对象进行管理和更新的。
Torque引擎系列之核心类(GameBase)
最新推荐文章于 2014-05-21 11:51:46 发布