0

cocos2d(-iphone v2.0) プラットフォーマー/実行中のゲームにチュートリアル モードを実装しています。ユーザーがチュートリアル モードになっている場合、ゲームを一時停止して指示を出す必要があります。ゲームでは、すべてのアニメーションを停止し、いくつかの入力を順番にユーザーに提供する必要があるポイントがあり、互いに上書きします (たとえば、1 秒間隔で)。

ゲーム レイヤー内の必要な時点で、[[CCDirector sharedDirector]stopAnimation]すべてのアニメーションを停止する を呼び出します。ここで、1 秒間隔で 2 つの連続した呼び出しを呼び出したいと考えています。アニメーションが停止しているため、更新呼び出しがありません。したがって、以下に示すように 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];
  //...
}

アニメーションが停止し、タイマー関数が呼び出されますが、セレクターの 2 番目の命令は、アニメーションを再開するまで表示領域に表示されません。showNextTutorialInstruction2 番目の命令が呼び出されたらすぐに表示するにはどうすればよいですか? レイヤーへのアクセスを強制しようとしましたが、うまくいきません。

4

1 に答える 1

0

あなたの動きやアニメーションを提供する更新メソッドはどのように書かれていますか? できることの 1 つは、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 のドキュメントでは、「実行中のシーンを一時停止します。実行中のシーンは描画されますが、スケジュールされたすべてのタイマーは一時停止されます。一時停止中、CPU の消費を減らすために、描画レートは 4 FPS になります」

私が使用した isPaused は BOOL であり、最初の更新メソッドに次の行があります

if (isPaused) { return; }

しかし、今振り返ってみると、それはまったく必要ないはずです。ディレクターが一時停止した後に performSelector のタイマーが追加されるため、スケジュールどおりに実行されます。これにより、必要なものを追加して目的の結果を得ることができます。

于 2013-02-26T22:51:06.367 に答える