2014-05-01 38 views
2

正如問題所述,在spritekit中,我試圖找到一種方法來改變我的布爾值從false,對於x秒的數量也是如此,然後改變它回到錯誤。 的邏輯是,我有這個變種,isStunned,當我的球員來與X雪碧我把它接觸和我的操縱桿被禁用,因爲玩家感到「震驚」設置一個布爾真正的兩秒鐘,然後變回假

if (controlButtonDown) { // If i pressed joystick 
    if (!isStunned) { // IF i am not stunned 
    //move player 

當我的球員接觸膠水,我設置爲「是」並且遊戲杆被禁用,但是我想知道一種只能禁用我的遊戲杆的方法,或者不能移動我的精靈達幾秒鐘。我知道SKAction和等待順序,但這些都是行動,我不認爲他們會在這裏適用。任何幫助表示讚賞。

謝謝

+0

檢查的NSTimer功能......可能是適合您的情況 –

+0

感謝所有爲我指出了正確的方向 –

+1

使用SKAction runBlock與包裹在repeatforever waitforduration行動。不要使用NSTimer,因爲定時器在暫停視圖,場景或節點或運行轉換時不會自動暫停。 – LearnCocos2D

回答

3

既然你有spritekit標籤明確要求。

不要在遊戲中使用NSTimer或動作來處理時間。而是使用更新功能。如果以60fps運行,這意味着更新功能將在兩秒鐘內調用120次。使用幀而不是秒來保持你的遊戲更新將會避免遊戲被滯後所改變。想象一下,例如玩家遊戲有點滯後,換句話說運行速度較慢。無論遊戲滯後,2秒還是2秒,所以現在他受膠水的影響比沒有滯後的人要少。所以...

首先你應該有一個變化保持跟蹤遊戲時間:int _time;

在每個更新週期中,您都會添加一個:_time++;

您應該隨時瞭解用戶何時碰到膠水的變化:int _glueTouchedAtTime;

當用戶單擊您設置的膠水時:_glueTouchedAtTime = time;

您應該有一個常數來定義膠水活動時間:#define GLUE_TIME 120;

當您啓動遊戲設置_glueTouchedAtTime到:_glueTouchedAtTime = -GLUE_TIME;爲了防止膠水從正對時(_time == 0)

測試,如果用戶已經接觸膠水,現在是這樣工作的:

if(_glueTouchedAtTime+GLUE_TIME>time) { 
    // Glue is active 
} else { 
    // Glue is not active 
} 

不同的膠水爲不同的精靈

要爲不同的精靈有不同的膠水我會建議先做一個普通的遊戲對象(Gam eObject)作爲SKNode或SKSpriteNode的子類,具體取決於您的需要。然後創建一個名爲GameObjectGluable的GameObject的子類。這應該有一個屬性稱爲:@property int gluedAtTime;

您可以通過膠水膠合的遊戲對象:aGameObjectGluable.gluedAtTime = time;

您現在可以測試:

if(aGameObjectGluable.gluedAtTime +GLUE_TIME>time) { 
    // Game Object is glued 
} else { 
    // Game object is not glued 
} 
+0

完美的作品,除了我有一個問題在這一行 if((_glueTouchedAtTime + GLUE_TIME)> _time)它工作,如果我刪除「GLUE_Time並把120」。但是像這樣,它說「如果身體是空的」 –

+0

另外,假設我想要不同的「膠水」粘住我的精靈在不同的時間。過度使用更新函數並說出類似的話是明智的。 (void)update:(NSTimeInterval)currentTime timestuck:(float)timestuck { –

+0

GLUE_TIME是一個定義的常量,所以在使用它之前需要定義它。如果你喜歡,你可以在這裏使用一個硬編碼的int,但我建議有一個文件來保存這些常量。 我編輯了我的答案以反映您對多個膠水的評論。 –

0

設置你的價值的利益爲true,然後火NSTimer後兩秒鐘,將其設置爲false。

有關如何使用NSTimer的說明,請參閱本SO螺紋:How do I use NSTimer?

0

可以使用SKAction也。使用runBlock方法,您可以將代碼塊作爲操作執行。

SKAction *wait = [SKAction waitForDuration:2.0]; 
SKAction *reenableJoystick = [SKAction runBlock:^{ 
    joystick.userInteractionEnabled = TRUE; 
}]; 
SKAction *sequence = [SKAction sequence:@[wait, reenableJoystick]]; 
[self runAction:sequence]; 
相關問題