SpriteKit定制操作(持续时间为0.0)是第一次运行时称为两倍



我不确定这是一个错误还是我在做错事,但是当我尝试运行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]){...在这种情况下,如果已经采取了操作并在处理中,则不会加倍。

相关内容

最新更新