我(对MoveBy和MoveTo):你们的爹地ActionInterval除了你们还有其他的孩子吗?
MoveBy:有,而且还有很多。他们也几乎都是一对儿一对儿的,不是父子就是兄弟,当然也有独生子。
我(窃窃私语):你们的爹地好能生……
MoveTo:而且他们的大多数的工作方式与我们相似。
我:有点儿意思,待我去与他们聊聊。
我:你们能做什么?
RotateBy和RotateTo:我们能旋转您指定的物体。
我:听说你们与MoveBy和MoveTo的工作方式很类似,有什么不同之处吗?
RotateBy:当然有,有以下几点,
1、旋转分为3种模式,各自的创建方式也不同,
(1) 2D平面内的普通旋转,围绕物体的z轴旋转,正顺时针,负逆时针。
auto rotateBy2D = RotateBy::create(1.0f,360); // 2D平面内围绕z轴顺时针旋转360°。
auto rotateBy2D = RotateBy::create(1.0f,-60); // 2D平面内围绕z轴逆时针旋转60°。
(2) 2D平面内的Skew旋转,只有两个角度设置为不同的值时才能触发这种旋转,正顺时针,负逆时针。这种旋转的效果不好描述,还是实际实验一下比较好。
auto rotateBy2DSkew = RotateBy::create(1.0f,360,-360); // 2D平面内的Skew旋转。
auto rotateBy2D = RotateBy::create(1.0f,360); // 2D平面内的普通旋转。
(3) 3D空间中的旋转。
// 围绕X轴、Y轴、Z轴的旋转,正负影响旋转的方向。
auto rotateBy3D = RotateBy::create(1.0f,Vec3(360,0,0));
auto rotateBy3D = RotateBy::create(1.0f,Vec3(0,-360,360));
2、不同的旋转模式在update()中设置与获取物体角度的函数不同,
Tables | 获取X轴角度 | 获取Y轴角度 | 设置X轴角度 | 设置Y轴角度 |
---|---|---|---|---|
2D平面内的普通旋转 | getRotationSkewX() | getRotationSkewY() | setRotation() | setRotation() |
2D平面内的Skew旋转 | getRotationSkewX() | getRotationSkewY() | setRotationSkewX() | setRotationSkewY() |
3D空间中的旋转 | getRotation3D() | getRotation3D() | setRotation3D() | setRotation3D() |
3、不支持多个RotateTo或RotateBy动作同时作用于同一个物体。如果这么使用了,混合的运动效果可不一定是什么样的哦。
我:嗯,果然还是有不少差别的。RotateTo呢?你有什么要说的。
RotateTo:我嘛,相比于MoveTo除了刚才RotateBy说的那些差别外还有一个差别。MoveTo是MoveBy的儿子,而我是RotateBy的兄弟,我们都是ActionInterval的孩子。所以我也不像MoveTo那样绝大部分的功能都由他的老爹实现,计算旋转角度,让物体旋转都由我自己来实现。
我:不过看起来你和RotateBy的工作模式差不多相同。
RotateTo:说实话我也觉得是,不过不知道设计者为何如此设计。
我:此外我在看你计算变化角度的时候有一个疑问,与我理解的变化角度的计算有出入,见我的这篇博文。如果你见到你的设计者也让他看一眼吧,:)
我:接下来是SkewTo和SkewBy父子。
SkewTo:在呢。我们能做的还是要实际试一试才更直观。
auto skewto = SkewTo::create(3,100,0);
auto skewby = SkewBy::create(3,100);
我:嗯,我做了几个测试,觉得SkewTo你在计算X轴的变化角度时有些问题,还是见我的这篇博文。
SkewTo:嗯,好的,希望设计者能看到,:)
我:此外,你俩的父子关系相比于MoveTo和MoveBy是倒过来。
SkewTo:嗯,没错。我是老爹,计算变化角度以及让物体动起来都由我来负责。
SkewBy:我是儿子,我把目标角度计算出来给我的老爸,其他的就都由老爸负责了。
我(窃窃私语):虽然父子关系颠倒,但与MoveBy与MoveTo的工作方式相同,真是一家子。
我:看来一个爸的孩子真是有很多相似之处。ActionInterval的孩子们,你们还有谁与MoveTo,MoveBy,RotateTo,RotateBy或者SkewTo,SkewBy工作方式相似的,都来自报家门吧。
JumpTo和JumpBy:我们能让您指定的物体以抛物线弹跳的方式跳跃,您只需要告诉我们规定的时间、目的地坐标、跳跃的高度以及跳跃的次数。理解我们的实现您需要理解抛物线弹跳的计算方式。
BezierBy和BezierTo:我们能让您指定的物体以贝塞尔曲线的轨迹运动,理解我们的实现您需要理解贝塞尔曲线的原理。
ScaleTo和ScaleBy:我们能缩放您指定的物体,您只需要告诉我们规定的时间以及缩放的比例。
ScaleTo:需要注意的是,您给我的是以物体原尺寸为基础缩放到的比例。举个例子,假设物体当前尺寸为原尺寸的2倍,
auto scaleto = ScaleTo::create(3,5);
那么我会将物体缩放到原尺寸的5倍。
ScaleBy:而您给我的是以物体当前尺寸为基础缩放到的比例。还是上面的假设,
auto scaleby = ScaleBy::create(3,5);
那么我会将物体缩放到原尺寸的10倍(2 * 5)。
TintTo和TintBy:我们能改变您指定物体的RGB值,您只需要告诉我们规定的时间以及相应的RGB值。
Blink:我是个独生子,我可以让您指定的物体闪烁,您只需要告诉我规定的时间以及闪烁的次数。同时我还很听话,在闪烁完成之后我还会把物体的可见状态恢复为执行闪烁动作之前的可见状态。
FadeTo:我能改变您指定物体的透明度,您只需要告诉我们规定的时间以及目标透明度。不过设计者没有实现FadeBy倒是有些奇怪。
FadeIn和FadeOut:我们是FadeTo的儿子,我们可以让您指定的物体变为全透明或者全不透明,我们就相当于老爸的一个快捷方式,我们能做的老爸也能做。
我(自言自语):听他们说了这么多,看起来是各显神通。不过其实他们的这些本领除了他们自身有良好的技术外,还要依靠他们手里那些神奇的工具,
Tables | 获取 | 设置 |
---|---|---|
MoveTo and MoveBy | getPosition3D() | setPosition3D() |
RotateTo and RotateBy | getRotationSkewX(),getRotationSkewY(),getRotation3D() | setRotation(),setRotationSkewX(),setRotationSkewY(),setRotation3D() |
SkewTo and SkewBy | getSkewX(),getSkewY() | getSkewX(),getSkewY() |
JumpTo and JumpBy | getPosition() | setPosition() |
BezierBy and BezierTo | getPosition() | setPosition() |
ScaleTo and ScaleBy | getScaleX(),getScaleY(),getScaleZ() | setScaleX(),setScaleY(),setScaleZ() |
TintTo and TintBy | getColor | setColor() |
Blink | getVisible() | setVisible() |
FadeIn,FadeOut and FadeTo | getOpacity() | setOpacity() |
此外,他们的实现方式上也有一些我不理解的地方,看来我也有很多需要额外学习的东西,
抛物线弹跳 贝塞尔曲线 记下了。