在cocos2d中初始化后运行一个方法

时间:2010-07-30 17:24:14

标签: iphone objective-c cocos2d-iphone

我有一个加载屏幕,我用标签初始化以显示加载进度。 我想在初始化加载屏幕后调用我的DataManager,然后调用方法来切换场景。这是我的代码:

-(id) init {
  if((self=[super init]))
  {
    loadingLabel = ....
    [self addChild:loadingLabel];

    /***** This is what I want to call after the init method
    //DataManager loads everything needed for the level, and has a reference to the 
    //loading screen so it can update the label
    [[DataManager sharedDataManager] loadLevel:@"level1" screen:self];
    //this will switch the scene
    [self finishLoading];
    *****/
  }
  return self;
}
-(void) setLoadingPercentage:(int) perc {
   //changes the label
}
-(void) finishLoading {
    [[CCDirector sharedDirector] replaceScene:[Game node]];
}

所以我无法在init中调用datamanager,因为标签在内容加载时不会更新,我无法在init方法中切换场景。那么如何运行我的数据管理器并在初始化后完成加载?我的计划是以1秒的间隔设定一个时间表来实现这一目标,但似乎不能等待一秒钟。

编辑:我能做到的另一种方法是在每一帧安排并向数据管理员询问它的位置......这似乎已经更好了,因为数据管理器不需要引用加载屏幕。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用performSelector:withObject:afterDelay:在当前线程运行循环的下一次迭代期间强制执行指定的选择器:

[self performSelector:@selector(finishLoading) withObject:nil afterDelay:0.0f];

答案 1 :(得分:0)

上述答案是正确的,但您应该使用Cocos2d方式安排稍后运行的方法:

[self schedule:@selector(finishLoading) interval:0.1];

-(void)finishLoading
{
  [self unschedule:@selector(finishLoading)];
  //Do your stuff
}