有些非线性动画比线性动画更容易实现

      动画可以让游戏体验更流畅。这里说的动画不是指骨骼动画或者精灵动画,而是变换动画(Transition, Tweening),一般用在用户界面、特效等方面。如果没有成熟的库或者编辑器的支持,开发动画通常是一件很麻烦的事情,尤其对非线性的动画,比如:加速、缓动、指数、碰撞、弹性等。这里介绍一种实现起来甚至比线性动画更容易的一个小技巧。

让一个物体移动到目标点

      有一个很简单的例子,为了让一个物体从当前位置移动到目标点,使用最简单的线性动画,我们需要在Update中加入:

Position += Vector2.Normalize(Target - Position) * Speed;

      但物体不能一直移动下去,所以我们要检测物体是否到了目标来让他停下来,所以上面的代码变成了这样:

if (Vector2.Subtract(Position, Target).LengthSquared() >= Speed * Speed)
    Position += Vector2.Normalize(Target - Position) * Speed;

      这并没有结束,因为物体的运动是离散的,你不能保证他最终正好落在的目标点,所以或许还得改成这样:

if (Vector2.Subtract(Position, Target).LengthSquared() >= Speed * Speed)
    Position += Vector2.Normalize(Target - Position) * Speed;
else
    Position = Target;

      实现一个线性运动也不是一行代码就能办到的事情,但最后的效果可能根本不能让你满意。比如当你的按钮从屏幕外这样飞到屏幕中间的时候,你会发现他非常的死板。

      好吧,让我们给他增加一些减速效果,听起来很容易,让我们把速度也作为一个变量,给他一个加速度吧:

Speed += Acceleration;

if (Vector2.Subtract(Position, Target).LengthSquared() > Speed * Speed)
    Position += Vector2.Normalize(Target - Position) * Speed;
else
    Position = Target;

      除了这样修改代码以外,我们还要把Speed从常量改成一个成员变量。我就只是很单纯的想把按钮以一种简单的方式移动到屏幕中间,我要写那么多代码,还要为他专门准备一个成员变量! 我是否需要写一个工具抽象这种运动呢?因为屏幕上有灰常灰常多的按钮 ==!

 

一个非线性运动的Trick

      这是我很久很久以前在做Flash时看到的一个小技巧,如果你还不知道他,那么你应该知道。他非常非常的简单,出来的效果也很棒:

      而且他只需要一行代码,并且可以用在你想要的任何地方:

Position += (Target - Position) * Easing;

      其中Easing是一个可以调节的常量,控制运动的速度。他看起来像是一个指数运动,但是我并没有从公式上去证明他是不是,只要他看起来效果不错,使用起来很简单,谁在乎其他的呢~

posted @ 2010-09-14 11:35  Yufei Huang  阅读(2791)  评论(8编辑  收藏  举报