0

我正在为我的 cocos2d(-iphone v2.0) 平台游戏/跑步游戏实现教程模式 - 当用户处于教程模式时,我需要暂停游戏并提供说明。在游戏中,有一点我需要停止所有动画并按顺序向用户提供一些输入,相互覆盖(例如间隔 1 秒)。

在所需的点,在我的游戏层中,我调用[[CCDirector sharedDirector]stopAnimation]它来停止所有动画。现在,我想连续拨打两个电话,间隔 1 秒。由于动画停止,我没有收到任何更新调用。因此,我尝试使用 NSTimer,如下所示:

-(void)update
{
  //...
  [[CCDirector sharedDirector]stopAnimation];
  //...
  [self showFirstTutorialInstruction];
  NSTimer *timer = [[NSTimer scheduledTimerWithTimeInterval:1.0
  target:self
  selector:@selector(showNextTutorialInstruction)
  userInfo:nil
  repeats:NO]retain];
  //...
}

-(void)ccTouchBegan(...)
{
  //...
  [CCDirector sharedDirector]startAnimation];
  //...
}

现在动画停止了,定时器函数确实被调用了,但是在我重新启动动画之前,选择器中的第二条指令不会显示在显示区域中。如何在showNextTutorialInstruction调用第二条指令后立即显示?我曾尝试强制访问该图层,但不起作用。

4

1 回答 1

0

您的更新方法是如何编写以提供您的动作/动画的?您可以做的一件事是使用 pause 代替 stopAnimation。例如我在一个测试项目中试过这个

-(void)startPause {
    if(!isPaused) {
        isPaused = YES;
        [[CCDirector sharedDirector] pause];
        [self performSelector:@selector(addLabel) withObject:nil afterDelay:2.0];
    } else {
        isPaused = NO;
        [self removeChild:addLabel cleanup:YES];
        [[CCDirector sharedDirector] resume];
    }
}

-(void)addLabel {
    addLabel = [CCLabelTTF labelWithString:@"TEST" fontName:@"Arial" fontSize:20];
    [self addChild:addLabel];
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    addLabel.position = ccp(winSize.width/2, winSize.height/2);
}

[[CCDirector sharedDirector] 暂停];在 cocos2d 文档中概述为“暂停正在运行的场景。将绘制正在运行的场景,但将暂停所有计划的计时器在暂停时,绘制速率将为 4 FPS 以减少 CPU 消耗”

我使用的 isPaused 是一个 BOOL,在一开始我的更新方法中我有这条线

if (isPaused) { return; }

但是现在回头看,您根本不需要它。由于我的 performSelector 中的计时器是在导演暂停后添加的,因此它将按计划运行。这应该使您能够获得添加所需内容的所需结果。

于 2013-02-26T22:51:06.367 回答