ios cocos2D Actions

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且物理引擎试图移动再次移动他到外部。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容