Cocos2D的Actions是一个在node上随着时间推移而执行程序的类。最常用的action如移动action在指定时间内将node沿着直线移动到目的点。
action驱动着sprintBuilder的时间线动画。每个时间线动画使用action和在引擎下的action序列。
Most Notable Actions
大多数action都是即时或者区间类。除去讨论特殊的actions,移动,扩大,旋转action,认知到更大的效果更重要,因为这经常被忽略。
Instant Actions
CallFunc:perform selector action
CallBlock:run block action
Interval Actions
Tween
Delay:wait action
Repeat
Modifier Actions
RepeatForever
Speed
Conbining Actions
Sequence
Spawn
Combining Actions
使用runAction运行多个action,将并行的运行actions
CautionTwo interval actions altering the same node property (ie position) will perform the sum of the actions, which may or may not be what you want. A common case being twomoveactions running at the same time on the same node, one moving up, the other to the right - the sum of both movements will move the node in a 45° angle up and right. Check for such cases if you find action animations are not working as expected.
两个区间action警示相同的node属性将展示actions的总和,可能不是你需要的。一个常用的例子两个moveaction在同一时间运行在一个node上,一个向上移动,另一个向右移动,两个移动的和将导致node以45度角向右上方移动。检查类似的实例,你讲发现action的动画不是期待的那样效果。
action的序列允许你添加多个actions在一个序列中按照顺序运行。你也可以像普通的action一样并行运行两到三个序列,假如在每个序列中的期间action能够并行的而分离不重叠。
Spawn的action是在同一个序列中并行运行一个或者多个action而不打断当前的action序列。
Spawn的action常常被误解为是并行运行action唯一方法,然而事实是你可呢给调用runAction:多个时间不同的actions并列云心这些actions。spawn是必须的,因为你不能产生两个或者更多的actions,而且需要并行的运行在序列的中央。
Repeat和RepeatForever的action将另外的action作为输入,将重复的在一个设定的时间后或者自定义的时间后运行。
Executin Code
Perform Selector 和 Run block actions 能展示任意的代码。他们可以被添加到action序列,为了展示常用的代码,每个时间段node到达给定的移动action目标位置作为实例。或者运行代码在序列的末尾。
Perform Selector action 假如选择器没有任何参数且无返回值,能在任何给定的目标上运行该选择器。如果你需要参数,使用CallBlock action.
Alering Time
有两种方法改变action或者序列的时间周期。
Delay action允许你添加一些延迟到序列。你可以让一个node移动,然后等待,然后通过移动、延迟和另外的moveaction运行序列再次移动。延迟action仅仅是让序列在给定的时间内不做任何事。
Speed action 可以使用任何区间action作为参数。你可以参考speed action,最好是一个。无论你如何改变wrapped action的速度你需要改变speed action 的速度属性。这允许你创建一个通用的简单模型。
Varying Duration for Fixed Speed
为了确保action 动画保持在同一个速度,你需根据当前和目标值和速度因素的不同设置时间。例如为了更多的action移动node在同一个速度而不用理会距离,你计算当前和目标位的值距离且通过任意的你选择的速度因子区分开。
CGFloat speed =4.5;
CGFloat distance = ccpDistance(node.position, targetPosition);
CGFloat duration = distance / speed;
When NOT to use Actions
Very Short Durations
Action 不适用运行在短时间内。理解了这个可以帮助你理解action的开始时间。
Cocos2D跟新区间actions 以相同的速率刷新屏幕,典型的是60帧每秒。60帧每秒的最小间隔对于action就是1.0/60.0 =0.0166秒。任意的比这个时间段的间隔将继续云心一帧,因为action的时间间隔是一0.0166的很多倍。
例如:如果你指定时间间隔是0.02,action将完成两帧且对60帧每秒下的0.0333秒有影响。无论你是否指定时间间隔是0.017或者0.03,将不会在action的时间间隔内产生影响,他都是产生两个帧。这就是你为什么你在如此短的时间内仅仅能看到action改变的量化动画,或者你改变action的时间间隔小于0.0166秒。
如果你提出按了action的每个帧,现在一个确定的问题出现了,例如在更新期间:运行在touchesMoved,accelerometer和其他的input events的方法或者在相同的时间间隔内发送作为屏幕刷新效率,但也同样应用到代码。
类似的例子可能时间不足以完成action,因为他可以在下一个帧准备好后替换。动画可能卡顿或者混乱因为上一个action可能没有机会去展示。
Actions as AI/Gameplay Replacement
action主要的意义是创建一个自给自足的动画。然而在AI或者gameplay项目中你经常需要全面的控制每个时刻的主角。你可能经常需要改变主角,或者依据主角当前的动作做决定。
频繁的创建和过早的停止actions被认为是滥用action作为游戏组件的code smell。 这本质上不是一个特别坏的事情,但你应该意识到它的潜在缺陷和影响。
频繁的创建和停止action,可能每秒几百次,可能变成一个显著的问题除非你在重复使用这些action。此外,如果你需要很多action同时运行且请求很频繁可以通过getActionByTag和类似回调的方法。
复杂游戏力学动画的action是一系列所悟的源头,例如忘记停止确定的action,偶然并行运行action在本不该冰心公允性的地方,假设action变的复杂他们就可能在任意时间被停止,或者频繁的打断action导致动画不流畅。任何这些都会引起奇偶结果,可能很难调试。
保持node意图的轨迹,无论你运行或者停止action,你必须保持住状态信息直到action分离。然而actions是公共的CCNode 的API接口。因此即使其他node能够运行或者停止action而不用修改主角的内部状态。
这些推荐的被和面的例子是纯视觉action,例如这些运行的sprite帧动画,淡入或者颜色改变的node。典型的视觉故乡是由危害的,例如你停止或者替换视觉action在错误的时间node上就可能导致错误的颜色。但是即使是视觉action也可能导致node全部不可见,因此会影响游戏使用。
Move/Rotate Actions conflict with Physics
如果他有一个非静态的CCPhysicsBody,物理动画和更新node的位置和旋转属性。一个移动或者旋转action是一样的。如果两个在同一时刻运行,那个会优先,或者同时跟新属性?
你可以确认运行移动和旋转action在node上通过静态或者动态的身体。但是考虑动态的身体作为唯一的物理控制器如同位置和旋转属性被考虑一样。
但是问题并没有结束。考虑如下情形,你通过利用移动action的物理身体移动一个node。
最终,你看到的是使用物理node的身体他的移动和旋转动画可能穿透冲突或者不能达到action的目的位置和旋转。或者他们仅仅松动了冲突的边缘,而action试图在内部移动node且物理引擎试图移动再次移动他到外部。