时钟周期和处理
Torque X提供一个基于TGB游戏引擎的2D游戏系统。我们修改了TGB引擎,向其中添加了组件的概念,这样就把TGB类中的大量方法分割成了多个组件。
ProcessTick
要把一个ProcessTick 回调函数注册给一个游戏对象,我们可以调用处理列表的AddTickCallback方法。这个回调函数将会和其他被注册给这个对象的ProcessTick 回调函数一起执行。你可以提供第三个排序参数(这个参数是可选的),来指定回调函数被调用的次序。次序0代表你想要这个函数第一个被回调,1代表你想要这个函数最后一个被回调。默认值为0.5。
我们之前在讲到一个对象如何接收动作时提到过一个例子,这个例子展示了ProcessTick 回调函数的使用方法。如下所示:
void ProcessList(Move move, float dt)
时间(即第二个参数dt)的单位是秒。通常来说,所有的动作和大多数游戏逻辑都应该在处理列表调用中完成。
InterpolateTick
Torque X支持常量和变量更新两种方式。当使用常量更新时,我们可以在不同机器间得到更加一致的行为(例如一个更新的线程每秒被调用100次和当它每秒只被调用50次肯定是不一样的)。这样带来的一个后果就是,如果一帧画面需要在两个时钟周期内完成,那么我们就必须能够重新定位游戏中的所有对象,然后在两个时钟周期之间做插值运算和后续处理。这个工作是通过InterpolateTick回调函数实现的。当这个函数被回调时,对象(或者组件)负责在前两个时钟周期间进行插值(1代表最近的时钟周期,0代表上一个时钟周期)。大多数时候,你使用stock组件来对位置、旋转等进行插值计算,所以在这里你不需要做任何事情。但是,如何你注册了一个时钟周期回调函数,你就需要实现插值回调函数,因为InterpolateTick是ItickObject接口的一部分。
UpdateAnimation
有一件事情是确定的:游戏对象绝对不需要关心常量时钟周期。动画就是最好的例子。如果每一个时钟周期都要追踪动画的状态并且在渲染时计算出插值的位置,就太繁琐了。取而代之的是,我们通过UpdateAnimation回调函数来更新动画。在上一次渲染和下一次渲染之间,这个回调函数将被调用。注册一个UpdateAnimation回调函数非常简单,仅仅在处理列表中调用AddAnimation回调函数就可以了。像其他的周期回调函数一样,你可以提供一个可选的第三参数来指定调用的次序。