我有一个类似于糖果粉碎(水平路径)的水平选择屏幕,我计划有超过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
}