使用100多个按钮快速加载关卡选择屏幕的最佳解决方案

时间:2014-07-19 05:15:38

标签: ios objective-c performance cocos2d-iphone

我有一个类似于糖果粉碎(水平路径)的水平选择屏幕,我计划有超过100个级别。当我一次加载这么多级别时,创建和加载所有这些级别的时间是~0.17秒。现在,在用户按下按钮进入关卡后等待显然太长了。游戏似乎冻结了一点,然后终于开始了。

现在我一直在寻找一些不同的解决方案。我可以作为最后手段恢复的一个解决方案是创建某种过渡,暂时显示加载屏幕,然后进入关卡选择屏幕。尽管如此,绕过这个加载会很好。

目前我的关卡选择屏幕是一个普通的CCNode类,上面有一个滚动视图。这意味着它不是单例,每次我去它时,都会加载一个新实例。关于这一点的好处是我可以不断更新某人是否击败了一个级别,并改变了下一级别的颜色和能力(是否可以在单例类中进行这种更新?)。单身对我来说似乎是最好的方法(然后我会在游戏加载时加载),但我不确定上述问题的答案是否正确。如果有人有这方面的经验,请告诉我!

我不确定我还能尝试做什么。唯一的另一个好选择似乎是以某种方式加速我的代码,但我不知道我怎么能这样做(发布在下面)。最后一种方法是在我的游戏加载时创建此类的实例,然后只要我不希望它显示就隐藏所有用户交互。尽管如此,这听起来有点草图。感谢您的建议,这是我创建按钮的代码。

-(void)didLoadFromCCB{
    buttonArray = [NSMutableArray array];
    CFTimeInterval startTime = CACurrentMediaTime();
    CCSpriteFrame *redTile = [CCSpriteFrame frameWithImageNamed:@"Sprites/glossyTile.png"];
    for (int l = 0; l < NUMBER_OF_WORLDS; l++) { //NUMBER_OF_WORLDS = 10
        for (int j = 0; j < 4; j++) {
            for (int k = 0; k < 5; k++) {
            NSString *tempTitle = [NSString stringWithFormat:@"%i",(k+1)+(l*5)];
            tempButton = [CCButton buttonWithTitle:tempTitle
                                          spriteFrame:redTile
                                          highlightedSpriteFrame:redTile
                                                 disabledSpriteFrame:nil];
                tempButton.block = ^(id sender) {
                CCNode *transitionScene = [CCBReader load:@"TransitionScene"];
                [self addChild:transitionScene];
                int row = k+1;
                int column = j+1;
                int buttonIndex = (row + (column-1)*5) + l*20;
                for (int m = 1; m < buttonIndex; m++) {
                    [[LevelManager sharedInstance] nextLevel];
                }
                levelNumber = i;
                [self performSelector:@selector(changeScenes) withObject:nil afterDelay:8.0/30.0
                 ];
            };
            tempButton.position = ccp(someConstant*j, someConstant2*k + someConstant3*l);
            [self addChild:tempButton];
            i++;
            }
        }
    }
    CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
    CCLOG(@"time interval media %f", elapsedTime); //logs about 0.17 seconds
}

0 个答案:

没有答案