1

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

我需要有两个屏幕,一个在左边,另一个在右边,就像在滚动视图中一样,分页有两个屏幕可以在它们之间切换。我在 RootViewController 类的帮助下检测到滑动并成功地左右滑动屏幕。

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

我正在使用一个名为 SelectWorld 的主场景,两个是它的子场景。第一个屏幕称为工厂,其他屏幕称为堆栈。以下是我的代码:

选择世界屏幕:

@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;
}

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

4

1 回答 1

1

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

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

例如:

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

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

于 2012-11-22T19:39:31.330 回答