我不确定这是一个错误还是我在做错事,但是当我尝试运行0.0持续时间的自定义操作时,该块会运行两次。例如,如果我将此代码放入场景的初始化方法中,我将获得以下输出:
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
[self runAction:doThis];
2014-03-13 01:41:11.271 Leapfrog[2168:60b] DO THIS
2014-03-13 01:41:11.287 Leapfrog[2168:60b] DO THIS
如果我尝试按顺序运行两个动作,则第一次执行两次,第二次执行一次,就像这样:
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];
2014-03-13 01:46:11.910 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.926 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.942 Leapfrog[2184:60b] DO THAT
到目前为止,我想出的唯一方法是让它正确运行,就是在开始时包括一个虚拟动作:
SKAction *wait = [SKAction waitForDuration:0.0];
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:wait, doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];
2014-03-13 01:48:41.946 Leapfrog[2192:60b] DO THIS
2014-03-13 01:48:41.964 Leapfrog[2192:60b] DO THAT
每次我想做这种事情时,我都坚持使用零持续时间的等待动作吗?
说明
" CutomActionDuration"为几秒钟,并执行操作,直到传递" 1秒"。有足够的时间执行" 0和1"秒之间的操作(例如,一秒钟内有1000个miliseconds)。根据所使用的机器/PC的速度,您会看到多次执行的操作。
runblock
解决方案'customActionWithDuration'用于重复动作。如果您想执行一旦有" Runblock"操作执行操作。缺点是您不能将节点作为参数传递给块。但是您可以使用其他技巧来克服此缺点(例如,在运行块之前将节点存储在某些全局变量中。将对全局节点执行块)。这是样本:
SKAction* blockAction = [SKAction runBlock:^{
//your actions here
[SomeNode.physicsBody applyImpulse:(10,10)];
}];
[SomeNode runAction:blockAction];
用cutomactionwithDuration
解决方案如果您仍然想使用'customActionWithDuration'。我有工作
SKAction* applyImpulse =[SKAction customActionWithDuration:0.000001 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
if(!(elapsedTime>0)){
//Do your thing here :)
}
}];
有时如果过滤导致双重动作。另一个选项是实现节点的某种参数。例如:if(![node hasactions]){...在这种情况下,如果已经采取了操作并在处理中,则不会加倍。