暂停对精灵的特定操作

时间:2014-12-17 10:54:47

标签: ios cocos2d-x

我在cocos2dx V3中有一个Sprite *类型的玩家,我想让它在不同的时间间隔上运行不同的动画,我找不到暂停然后恢复特定动画的方法(动作)。虽然我可以使用_player-> pauseSchedulerAndActions()同时暂停和恢复Sprite的所有动作。我在精灵上使用“CCRepeatForever”动作,所以,我必须暂停一个以恢复其他动作。请帮忙按标记或任何其他方法暂停操作。 在此先感谢。

2 个答案:

答案 0 :(得分:1)

<强>糟糕

我假设这是Objective-C,但是@Droppy告诉我它不是。

我没有意识到cocos2d-x是不同的。但是,因为这是一个相当高级别的框架,我在答案中所做的背后的概念仍然有效。我现在就在这里保留答案。

答案

我已经有一段时间了,因为我已经完成了任何Cocos2D,但我可以给你一个想法。

而不是创建一个动作并永远重复它,你应该有一个像这样的方法......

- (void)twirlAround
{
    // only create and perform the actions if variable set to YES
    if (self.twirling) {
        // this will do your action once.
        CCAction *twirlAction = // create your twirl action (or whatever it is)

        // this will run this function again
        CCAction *repeatAction = [CCActionCallBlock actionWithBlock:^{
            [self twirlAround];
        }];

        // put the action and method call in sequence.
        CCActionSequence *sequence = [CCActionSequence actions:@[twirlAction, repeatAction]];

        [self runAction:sequence];
    }
}

只要twirling属性设置为YES,就会重复运行。

因此,在您的代码中的其他位置(可能是您当前正在添加重复操作的位置),您可以执行此操作...

self.twirling = YES;
[self twirlAround];

这将开始反复旋转。

要停止它,你可以做...

self.twirling = NO;

这将停止旋转。

替代方法

- (void)twirlAround
{
    // this will do your action once.
    CCAction *twirlAction = // create your twirl action (or whatever it is)

    // this will run this function again
    CCAction *repeatAction = [CCActionCallBlock actionWithBlock:^{
        if (self.twirling) {
            [self twirlAround];
        }
    }];

    // put the action and method call in sequence.
    CCActionSequence *sequence = [CCActionSequence actions:@[twirlAction, repeatAction]];

    [self runAction:sequence];
}

答案 1 :(得分:1)

基于Fogmeister的建议,这是

的cocos2d-x版本
void MySprite::jumpForever(){
   if (!twirling) return;
   auto jump = JumpBy::create(0.5, Vec2(0, 0), 100, 1);
   auto endCallback = CallFuncN::create(CC_CALLBACK_1(MySprite::jumpForever,this));
   auto seq = Sequence::create(jump, endCallback, nullptr);
   runAction(seq);
}