游戏中,有时要仿真一些物理效果,但又不想用到物理引擎,如一个物体掉在地上,然后让它反弹几下;做一个弹出页面,让它由小变大,在变化的过程中有类似弹簧的效果;一个按钮松开时,让它有一个反弹的效果等。要实现这类效果,就要用到缓冲动画。引擎提供了很多缓冲动画,在这节,将结合缓冲曲线和程序片段讲解其中的几种。首先,怎么使用引擎中的类绘制缓冲曲线呢?这要用到DrawPrimitives类,当然也可以使用DrawNode类,并且引擎也是这样建议的。在HelloWorld类中重写draw方法,具体实现如程序片段3-32所示。
程序片段3-32 draw方法代码
实现程序片段 3-32 的窗口大小是 960×640,代码中的位置都是相对这个来设置的。程序片段3-32的功能是,先绘制一个正方向的框大小为100个像素,然后在一个for循环里绘制缓冲动画对应的控制曲线。drawDashedLine 函数是一个画虚线的函数,代码中通过更换tweenfunc中的函数来绘制不同的曲线。
有了绘制曲线的函数,下面将结合代码来讲解弹性动画、跳跃动画、指数动画、Sine 动画、回震动画和Ease动画。
弹性动画跟拉动一根弹簧后让它停止的这个过程一样。引擎提供了 3 种类型的动画,对应的类分别是EaseElasticIn、EaseElasticOut和EaseElasticInOut,它们的曲线如图3-14所示。
图3-14 弹性动画曲线图
图3-14中,从左到右的曲线分别对应类EaseElasticIn、EaseElasticOut和EaseElasticInOut。使用程序片段3-33所示的程序片段创建这类动画。
程序片段3-33 弹性动画的创建
跳跃动画的效果和一个物体掉在地上后反弹的效果类似,它有 3 种类型,分别对应类EaseBounceIn、EaseBounceOut和EaseBounceInOut,对应的缓冲曲线如图3-15所示。
图3-15 跳跃动画曲线图
创建跳跃动画如程序片段3-34所示。
程序片段3-34 跳跃动画的创建
对于对数动画,它的缓冲控制函数是指数,包括的类有 EaseExponentialIn、Ease ExponentialOut和EaseExponentialInOut,它们相应的控制曲线如图3-16所示。
图3-16 指数动画曲线图
对于指数动画的使用,同样以一个节点的移动为例来讲解,具体实现如程序片段 3-35所示。
程序片段3-35 指数动画使用代码
Sine 动画的缓冲控制函数是 sinf 和 cosf,相应的类有 EaseSineIn、EaseSineOut 和EaseSineInOut,控制曲线如图3-17所示。
图3-17 Sine动画曲线
Sine动画的使用如程序片段3-36所示。
程序片段3-36 Sine动画使用代码
回震动画有 3 种类型的动画,相应的类为EaseBackIn、EaseBackOut 和 EaseBackInOut,控制曲线如图3-18所示。
图3-18 回震动画曲线
回震动画的使用如程序片段3-37所示。
程序片段3-37 回震动画使用代码
Ease 动画使用的控制函数是 powf,相应的类有 EaseIn、EaseOut 和 EaseInOut,它们对应的控制曲线如图3-19所示。
图3-19 Ease动画曲线
Ease动画的使用如程序片段3-38所示。
程序片段3-38 Ease动画使用代码
上面只是介绍了其中几种,引擎还提供了 Bezier,二次、三次、四次和五次方程式等控制函数的缓冲动画,这类动画除了 Bezier 外,其他的都有对应的 In、Out 和 InOut 控制动画,读者在使用的过程中,结合缓冲动画对应的控制函数或曲线,根据实际需求选择对应的缓冲动画。
缓冲动画作用于其他动画之上,操作被控制动画的缓冲效果,改变它的运动状态。需要注意的是,它只会改变动画的运动轨迹,不会改变动画的执行时间。