首先让我们来看看ActionTest里面教了我们什么。第一个LAYER演示了如何进行人为的转移,不过我直接理解为设置初始属性什么的似乎要容易理解一点。接口都是SPRITE的接口。第一个层对应的类是ActionManual,这个类继承自ActionDemo,在ActionDemo中,进行了初始化,读取并创建了3个精灵以及下方的3个按钮和MainMenu。精灵的创建也很简单,用的CCSprite::create()函数,参数也很简单,c风格的字符串,指向资源路径。回头来看ActionManual的onEnter()函数,很显然,精灵的setScaleX用于实现X轴的放大,setScaleY实现Y轴的缩放,参数为负,实现颠倒效果setPosition设置位置,setOpacity用于设置透明度,这个值越小,透明度越高。setRotation实现顺时针的旋转,setColor设置颜色;另外还有2个宏:ccp(x,y):创建一个点;ccc3(r,g,b),创建一个颜色。为了后面不至于混淆,这里也让我们认识一下3个精灵:m_tamara指的是曲头发的女性,m_grossini指男性,m_kathia指的圆头发的女性。
接下来是演示MoveTo和MoveBy的用法。首先我们注意到,程序首先是创建了3个ACTION,然后使用sprite->runAction()接口来运行。这个和上面的简单的使用set有本质的区别,所以第一个DEMO的演示,还是理解为设置初始属性来的方便一些。创建ACTION很简单,都是使用对应类的静态create函数。注意moveto和moveby的创建参数都是一样的,第一个参数是一个浮点值,代表动作持续的时间,第2个参数为一个ccp,表达的含义不一样。moveTo第2个参数指的是绝对坐标,即移动到达的地点,而moveBy是相对坐标,代表移动的相对位移。这个把参数的Y值改为负数来看,就会很明了。action还有一个reverse()接口,返回这个动作的倒退。这个也很方便。接下来我们看到如何将2个动作进行衔接,使用CCSequence::create()。注意最后有个NULL参数,这个创建函数可以加入多个动作,但是最后必须要有个NULL结尾。可以修改下代码,把上面创建的3个动作都加里面看看效果。
第3个画面演示了旋转效果。to代表到达的值,by代表偏移量。第一个参数仍然为以秒为单位的动作持续事件,第2个代表角度,一圈为360度。这个值为正,人物顺时针旋转,为负则逆时针旋转。
ScaleTo/ScaleBy:这个动作的创建,如果只带2个参数,则表示整体的缩放;如果带3个参数,则后2个参数分别代表X与Y方向的缩放。
SkewTo/SkewBy:演示了扭曲效果。注意这个扭曲X/Y的2个参数有相互加成抵消的效果。比方说第一个动作(37.2,-37.2),事实上人物只是在侧身旋转,人物本身没有扭曲,而第3个人物(45,45),加成为90,最后扭曲效果几乎和第2个一致:扭曲成了一条线。
RotationSkewTo/RotationSkewBy:实际上这里用的还是CCRotateTo和CCRotateBy,只不过参数比第3个示例比,参数变成了3个。这个代码参数和上个示例的取值几乎一摸一样,但是效果有些细微的差别。这个用Rotation也实现了扭曲的效果。
接下来的这个示例更为详尽的演示了Skew与Rotate的区别。从效果上看,Skew扭曲的幅度更大,几乎达到全屏的效果,而ratation显然影响范围要小一点。这里我们看到几个接口:sprite->removeFromParentAndCleanup(),自清理;setAnchorPoint(),设置锚点;锚点简单点说就是一个参照点,一个精灵是一个图块,设置他的位置以及其他变换参照总是要归结到某个点,这个点就是锚点。
再接下来是skew rotate与scale的组合运用。这个很神奇的组合看上去有3D的效果。但是很显然,这个是个2D变换。
JumpTo/JumpBy:实现跳跃效果,但参数多了2个:第3个参数为跳多高,第4个参数为总共跳多少次。这里我们看见如何让一个动作永久持续:使用CCRepeatForever::create()。
CardinalSplineTo/CardinalSplineBy:这个示例让精灵沿这个特定的曲线移动。这个特定的曲线是什么呢。。好吧。。我不是学数学的。。不过看代码,画左边的曲线和右边的正方形都是用同一个函数ccDrawCardinalSpline()画的,所以正方形也该是这个曲线的一种。不过我放弃去理解这个曲线的内部原理。
CatmullRomBy/CatmullRomTo:又一种曲线。。我在网上搜索了下,这2种曲线应该都是某种插值算法,让过度显得比较平滑。从代码使用上来,创建这个动作要传入一个CCPointArray做参数。创建这个Array需要传递一个容量做参数,使用addControlPoint()函数增加控制点。所以使用上还是比较简单。
BezierBy/BezierTo:贝塞尔曲线。。。
Blink:闪烁!啊 终于不再曲线里面打转了。。传递一个参数闪多少次,简单明了。
FadeIn/FadeOut:淡入与淡出!注意在使用淡入效果前,程序实现将精灵透明度设置为0!如果把这句代码注释掉,可以发现一开始精灵会有个闪烁的效果。
Tint:实现染色效果。
Animation:这个示例演示如何创建动画。先创建一个空的动画对象,然后用addSpriteFrameWithFileName()逐帧加入。。这也太没效率了。。现在帧动画应该都放在一张图片里面。setDelayPerUnit(),设置每帧间隔事件;setRestoreOriginFrame();动画结束是否回到初始帧。接下来程序演示了另一个种创建动画的模式:读取一个PLIST文件来创建,但这里没有任何信息告诉我怎么创建这个plist文件;再接下来我们看到,动画也可以通过copy来创建。。我网上GOOGLE了一下,这个PLIST文件格式其实就是利用XML写的有关设置帧动画的信息。不过我们没有必要手工去编写这个文件。因为有个比较广泛好用的工具:TexturePacker可以生成这个文件。这里给个地址:http://zengrong.net/post/1981.htm 不过为毛是未完待续啊。。
接下来是2个有关CCSequence的演示。需要注意的是第2个示例,演示了如何把一些特殊的动作以及回调函数放入动作组里面去。
CCRemoveSelf:让自己消失。
CCSpawn:让多个动作混合。
CCactionInterval->reverse():创建一个反转动作。
CCDelayTime:延迟
CCRepeat/CCRepeatForever:Repeat只重复固定的次数。
接下来程序演示了如果通过在回调函数来实现动作效果。先将某回调函数加入动作链,然后回调中使用pSender->runAction。