2013-10-07 62 views
0

我想在遊戲中擊敗關卡時進行3秒倒計時顯示。所以這是我做過什麼:cocos2d中的三秒倒計時

-(void) gameSegmentBeat { 
    [self pauseSchedulerAndActions]; 

    // Overlay the game with an opaque background 
    CCSprite *opaqueBG = [CCSprite spriteWithFile:@"background1.png"]; 
    opaqueBG.position = screenCenter; 
    [self addChild:opaqueBG z:10000]; 

    // These are the 3 labels for the 3 seconds 
    CCLabelTTF *three = [CCLabelTTF labelWithString:@"3" fontName:@"Helvetica" fontSize:100]; 
    three.position = ccp(screenCenter.x, screenCenter.y); 
    CCLabelTTF *two = [CCLabelTTF labelWithString:@"2" fontName:@"Helvetica" fontSize:100]; 
    two.position = ccp(screenCenter.x, screenCenter.y); 
    CCLabelTTF *one = [CCLabelTTF labelWithString:@"1" fontName:@"Helvetica" fontSize:100]; 
    one.position = ccp(screenCenter.x, screenCenter.y); 

    // Secondspast is specified in the update method 
    secondspast = 0; 
    if (secondspast == 1) { 
     [self addChild:three z:10001]; 
    } else if (secondspast == 2) { 
     [self removeChild:three]; 
     [self addChild:two z:10001]; 
    } else if (secondspast == 3) { 
     [self removeChild:two]; 
     [self addChild:one z:10001]; 
    } 
} 

而且更新:

framespast = 0; 

-(void)update:(ccTime)delta { 
     framespast++; 
     secondspast = framespast/60; 
} 

我在我還沒有上圖所示的方法之一叫做gameSegmentBeat ...我知道它被調用,因爲: 1. pauseSchedulerAndActions正在工作,2.正在顯示CCSprite *opaqueBG

此外,這是我應該補充的是,如果我搬到外面[self addChild:three z:10001]; if語句的,這是目前在,則標籤顯示了,但只要我搬回到if語句,它不工作...

我不知道爲什麼,但標籤不會每秒切換,所以沒有倒計時。

提前致謝!

+0

這裏被稱爲gameSegmentBeat?我猜它被召了一次。 –

+0

我更新了問題。 –

回答

1

你可能在執行中使用定時執行塊1,2和3秒延遲:

dispatch_time_t countdownTime1 = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)); 
dispatch_after(countdownTime1, dispatch_get_main_queue(), ^(void){ 

    [self addChild:three z:10001]; 

}); 

dispatch_time_t countdownTime2 = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)); 
dispatch_after(countdownTime2, dispatch_get_main_queue(), ^(void){ 

    [self removeChild:three]; 
    [self addChild:two z:10001]; 

}); 

dispatch_time_t countdownTime3 = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)); 
dispatch_after(countdownTime3, dispatch_get_main_queue(), ^(void){ 

    [self removeChild:two]; 
    [self addChild:one z:10001]; 

}); 
+0

謝謝!你不僅解決了我的問題,而且還教會了我一些新的東西! +1並接受:) –

0

由於切換標籤的代碼未被調用(至少在您共享的代碼中不可見),因此您的標籤不會被切換。

調用gameSegmentBeat從您的更新循環

-(void)update:(ccTime)delta { 
    framespast++; 
    secondspast = framespast/60; 

    [self gameSegmentBeat]; 
} 
+0

是的,當我遊戲中的其中一個物體觸及另一個物體時,我稱之爲標籤開關。我更新了這個問題。 –

0

內這

[self pauseSchedulerAndActions]; 

將防止所謂的更新方法。正如它說的那樣暫停了調度程序。

測試更新是否被調用set a breakpoint

+0

你知道另一種方式我可以切換標籤(或有倒計時),與'pauseSchedulerAndActions'一起使用嗎?謝謝! –

-1

很少有東西......

  1. 功能gameSegmentBeat在其中被調用一次secondspast的值設置爲0,因此if-conditions都不符合,因此您看不到任何標籤。

  2. 功能gameSegmentBeat調用pauseSchedulerAndActions其暫停所有計劃的選擇和行動,因此,你的功能update不叫,因此secondspast並沒有改變的價值。即使它改變了,它也不會影響上面的代碼,因爲gameSegmentBeat沒有從更新中調用。

現在,如果你必須調用pauseSchedulerAndActions可以或許做到以下幾點:

-(void) visit{ 

    framespast++; 
    secondspast = framespast/60; 

    if (secondspast == 1) { 
     [self addChild:three z:10001]; 
    } else if (secondspast == 2) { 
     [self removeChild:three]; 
     [self addChild:two z:10001]; 
    } else if (secondspast == 3) { 
     [self removeChild:two]; 
     [self addChild:one z:10001]; 
    } 
    [super visit]; 
}