我们回到matchRun方法中去尝试第一次修改,部分代码如下:
CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:duration position:ccp(0.9f, 0)];
CCActionJumpBy *jump = [CCActionJumpBy actionWithDuration:duration position:ccp(0, 0) height:0.05 jumps:20];
//略去回调block中的方法...
player.speed = [CCActionSpeed actionWithAction:moveBy speed:1.0f];
CCActionSequence *seq = [CCActionSequence actionWithArray:@[player.speed,blk]];
[player runAction:seq];
[player runAction:jump];
改动并不大.主要是将移动动作放到了Speed动作中去,然后在seq中执行speed动作而已.
信心满满的编译通过,然后尝试运行…
神马,竟然出错了!提示speed动作找不到selector duration!
找到CCActionSpeed的API,发现最下方有如下一句:
Note: CCActionSpeed can not be added to a CCActionSequence because it does not inherit from CCActionFiniteTime. It can however be used to control the speed of an entire CCActionSequence.
原来ActionSpeed不能被添加到ActionSequence中去,因为其并不继承于ActionFiniteTime类.其根本原因我猜测是该类中没有duration方法,而Seq中需要该方法计算其中所有子方法经历的时间.
但是我们必须要顺序(seq)中的回调block,否则无法在选手到达终点时完成动作.
接下来是我的第二次尝试修改:
CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:duration position:ccp(0.9f, 0)];
CCActionJumpBy *jump = [CCActionJumpBy actionWithDuration:duration position:ccp(0, 0) height:0.05 jumps:20];
//略去回调block中的方法...
CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveBy,blk]];
player.speed = [CCActionSpeed actionWithAction:seq speed:1.0];
[player runAction:player.speed];
[player runAction:jump];
[player startMatch];
编译运行,now it’s work!关键是将seq放在了speed方法中,而不是反过来.
可是这又产生一个小问题.写代码就是这样,完成了一点新的的东西,原来的又工作不正常了.没关系,这也是编程乐趣所在.下篇我们再叙 ;)