切换场景时,CCRepeatForever动作会自动停止

时间:2012-11-22 08:16:36

标签: cocos2d-iphone

我正在开发一款简单的游戏应用程序。

我需要在左边和左边有两个屏幕。右边的其他,就像滚动视图一样,分页有2个屏幕可以切换。我在RootViewController类的帮助下检测滑动并成功滑动左右屏幕。

但问题是我必须在两个屏幕上无限运行rotateBy动作,每个屏幕都在放置在屏幕中心的单个精灵上运行此动作。

我正在使用一个名为SelectWorld& amp;两个是子场景。 第一个屏幕叫做工厂&另一个叫做堆栈。 以下是我的代码:

选择世界屏幕:

@implementation SelectWorld

+(CCScene*)scene
{
    CCScene* scene = [CCScene node];
    SelectWorld* layer = [SelectWorld node];
    [scene addChild:layer];

    return scene;
}

-(id)init
{
    if((self = [super init]))
    {
        [RootViewController singleton].swipeCallBackHandler = self;
        [[RootViewController singleton] enableSwipeDetection];

        factory = [[ColorfulFactory scene] retain];
        stack = [[CoinsStack scene] retain];

        [self addChild:factory];
        isOnFactory = YES;
    }

    return self;
}

-(void)swipedLeft
{
    if(isOnFactory)
    {
        [self removeAllChildrenWithCleanup:YES];

        isOnFactory = NO;
        CCTransitionScene* transitionalScene = [CCTransitionSlideInR transitionWithDuration:0.3 scene:stack];
        [[CCDirector sharedDirector] replaceScene:transitionalScene];
    }
}

-(void)swipedRight
{
    if(!isOnFactory)
    {
        [self removeAllChildrenWithCleanup:YES];

        isOnFactory = YES;
        CCTransitionScene* transitionalScene = [CCTransitionSlideInL transitionWithDuration:0.3 scene:factory];
        [[CCDirector sharedDirector] replaceScene:transitionalScene];
    }
}

以下是仅适用于工厂的代码,同样适用于堆栈 -

@implementation ColorfulFactory

+(CCScene*)scene
{
    CCScene* scene = [CCScene node];
    ColorfulFactory* layer = [ColorfulFactory node];
    [scene addChild:layer];

    return scene;
}

-(id)init
{
    if((self = [super init]))
    {
        CGSize size = [CCDirector sharedDirector].winSize;

        CCLabelTTF* info = [CCLabelTTF labelWithString:@"Colorful Factory" fontName:@"Helvetica" fontSize:35.0];
        info.position = ccp(size.width/2, size.height-50);
        [self addChild:info];

        CCSprite* sprite = [CCSprite spriteWithFile:@"Icon.png"];
        sprite.position = ccp(size.width/2, size.height/2);
        [self addChild:sprite];
        sprite.tag = 123;

        CCRotateBy* rotateBy = [CCRotateBy actionWithDuration:60 angle:360.0];
        CCRepeatForever* repeatForever = [CCRepeatForever actionWithAction:rotateBy];
        [sprite runAction:repeatForever];
        repeatForever.tag = 456;
    }

    return self;
}

现在的问题是,在前两次滑动动作运行正常,但是一旦我尝试滑动超过两三次,动作就会停止。我没有写过一行来阻止这两个类。我要求它在那里永远运行。

1 个答案:

答案 0 :(得分:1)

您的错误在于您为每个场景更改重新使用相同的场景对象。你不能在cocos2d中这样做,你必须创建一个场景对象的新实例。

你永远不应该保留一个场景对象,因为在任何时候都应该只有一个活动场景(除了场景转换到另一个场景的持续时间 - 但是由内部的cocos2d处理)。

例如:

CCScene* factory = [ColorfulFactory scene];
CCTransitionScene* transitionalScene = [CCTransitionSlideInR transitionWithDuration:0.3 scene:factory];
[[CCDirector sharedDirector] replaceScene:transitionalScene];

如果您需要内存中的两个对象,请将它们设置为图层(或节点),而不是场景。不要使用replaceScene,而是使用常规moveTo操作在屏幕内外设置动画。