0

I try to use a few functions in my GameLayer. First - from another class, second - from GameLayer class, but CCSequence run like CCSpawn, not sequence. Separately they both work perfect in GameLayer.

in GameLayer

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

in rolypoly class

-(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アクションを実行しますが、アクションが終了するのを待たずに、メインシーケンスの2番目のアクションが実行されます(内部のシーケンス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メソッドの最後に移動しました。これにより、他のすべてのアクションが実行された後、最後に実行されることが保証されます。

I do not know what is the implementation of moveSpriteDeath but if it does not contain actions than it will be ok, otherwise show its implementation or try doing the same

于 2012-05-10T07:36:10.920 に答える