0

我尝试在我的 GameLayer 中使用一些功能。第一个 - 来自另一个类,第二个 - 来自 GameLayer 类,但 CCSequence 像 CCSpawn 一样运行,而不是序列。另外,它们都在 GameLayer 中完美运行。

在游戏层中

    [self runAction:[CCSequence actions:
                    [CCCallFuncN actionWithTarget:self.rolypoly selector:@selector(jumpToDeath:)],
                    [CCCallFuncND actionWithTarget:self selector:@selector(goToGameOverLayer:tagName:)data:(int)TagGameOverLose],     
                     nil]];

在rolypoly类

-(void)jumpToDeath:(id)sender
{

       [self.sprite stopAllActions];

       id actionSpaw = [CCSpawn actions:
                       [CCMoveTo actionWithDuration:0.5f position:ccp(self.sprite.position.x, self.sprite.position.y+self.sprite.contentSize.height)],
                       [CCBlink actionWithDuration:1.0f blinks:4],
                        nil];

       [self.sprite runAction:[CCSequence actions:
                              [CCCallFuncND actionWithTarget:self selector:@selector(setJumpingToDeath:withValue:)data:(void*)1],
                              actionSpaw,
                              [CCHide action],
                              [CCCallFunc actionWithTarget:self selector:@selector(moveSpriteDeath)], 
                              nil]];


}
4

1 回答 1

1

问题是这runAction不是阻塞方法。这意味着当您使用函数调用动作(如CCCallFunc)时,序列中它之后的动作将在函数调用返回时执行。在您的情况下jumpToDeath运行动作但不等待它们完成并且当它返回时执行主序列中的第二个动作(在内部序列jumpToDeath完成之前)

尝试重新安排你的行动。如果您需要更多帮助,请告诉我。

编辑:我的建议:

 [self runAction:[CCSequence actions:
                    [CCCallFuncN actionWithTarget:self.rolypoly selector:@selector(jumpToDeath:)], nil]];

-(void)jumpToDeath:(id)sender
{

       [self.sprite stopAllActions];

       id actionSpaw = [CCSpawn actions:
                       [CCMoveTo actionWithDuration:0.5f position:ccp(self.sprite.position.x, self.sprite.position.y+self.sprite.contentSize.height)],
                       [CCBlink actionWithDuration:1.0f blinks:4],
                        nil];

       [self.sprite runAction:[CCSequence actions:
                              [CCCallFuncND actionWithTarget:self selector:@selector(setJumpingToDeath:withValue:)data:(void*)1],
                              actionSpaw,
                              [CCHide action],
                              [CCCallFunc actionWithTarget:self selector:@selector(moveSpriteDeath)],
                              [CCCallFuncND actionWithTarget:self selector:@selector(goToGameOverLayer:tagName:)data:(int)TagGameOverLose],
                              nil]];
}

如您所见,我将最后一个调用函数操作移动到jumpToDeath方法中的最后一个,以确保在所有其他操作完成后最后执行它。

我不知道它的实现是什么,moveSpriteDeath但如果它不包含动作就可以了,否则显示它的实现或尝试做同样的事情

于 2012-05-10T07:36:10.920 回答