2016-02-01 14 views
8

मैं वर्तमान में अपने स्प्राइट किट गेम के लिए टाइमर लागू करने की कोशिश कर रहा हूं, लेकिन मुझे यह काम नहीं मिल रहा है। टाइमर का प्रारंभिक मूल्य हमेशा वही रहता है।स्प्राइटकिट टाइमर को कैसे कार्यान्वित करें?

मुझे लगता है कि मुझे किसी भी तरह/कहीं लेबल को अपडेट करने की आवश्यकता है, लेकिन मुझे नहीं पता कि कैसे और कहां:? मुझे बिंदु नहीं मिला। कोई विचार?

यहाँ आप की तरह अद्यतन करने के लिए लेबल हर levelTimerValue बदल गया है की जरूरत है

let levelTimerLabel = SKLabelNode(fontNamed: "Chalkduster") 
var levelTimerValue: Int = 500 

var levelTimer = NSTimer() 

func startLevelTimer() { 

    levelTimerLabel.fontColor = SKColor.blackColor() 
    levelTimerLabel.fontSize = 40 
    levelTimerLabel.position = CGPoint(x: size.width/2, y: size.height/2 + 350) 
    addChild(levelTimerLabel) 

    levelTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("levelCountdown"), userInfo: nil, repeats: true) 

    levelTimerLabel.text = String(levelTimerValue) 

} 

func levelCountdown(){ 

    levelTimerValue-- 

} 
+0

क्या यह मुख्य कतार पर चल रहा है? मैं हाँ मानता हूं, लेकिन बस सुनिश्चित करने के लिए ... – diatrevolo

उत्तर

9

मैं तथ्य यह है कि NSTimer दृश्य की, या देखने के रुकी हुई स्थिति से प्रभावित नहीं है की वजह से SpriteKit में कार्यों की इन प्रकार के लिए SKActions पर कायम हैं, तो यह मुसीबतों में आप हो सकती है। या कम से कम, यह आप से की आवश्यकता होगी कुछ स्थितियों, जैसे जब उपयोगकर्ता दृश्य रोक सकते हैं या एक फ़ोन कॉल में अपने टाइमर को थामने के लिए एक विराम सुविधा को लागू करने के लिए आदि के बारे में SKAction बनाम NSTimer बनाम GCD के लिए और अधिक here पढ़ें SpriteKit में समय से संबंधित कार्यों।

import SpriteKit 

class GameScene: SKScene { 

var levelTimerLabel = SKLabelNode(fontNamed: "ArialMT") 

//Immediately after leveTimerValue variable is set, update label's text 
var levelTimerValue: Int = 500 { 
    didSet { 
     levelTimerLabel.text = "Time left: \(levelTimerValue)" 
    } 
} 

override func didMoveToView(view: SKView) { 



levelTimerLabel.fontColor = SKColor.blackColor() 
levelTimerLabel.fontSize = 40 
levelTimerLabel.position = CGPoint(x: size.width/2, y: size.height/2 + 350) 
levelTimerLabel.text = "Time left: \(levelTimerValue)" 
addChild(levelTimerLabel) 

    let wait = SKAction.waitForDuration(0.5) //change countdown speed here 
    let block = SKAction.runBlock({ 
     [unowned self] in 

     if self.levelTimerValue > 0{ 
      self.levelTimerValue-- 
     }else{ 
      self.removeActionForKey("countdown") 
     } 
    }) 
    let sequence = SKAction.sequence([wait,block]) 

    runAction(SKAction.repeatActionForever(sequence), withKey: "countdown") 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    //Stop the countdown action 

    if actionForKey("countdown") != nil {removeActionForKey("countdown")} 
} 
} 
+0

आपके इनपुट के लिए धन्यवाद। – boehmatron

+0

इसकी कुंजी ("उलटी गिनती") की कुंजी कैसे है? – Confused

+0

@ कॉन्फ्यूज्ड इस उदाहरण में, "उलटी गिनती" कुंजी वाले दृश्य पर कार्रवाई निष्पादित की जाती है। – Whirlwind

4

ध्वनि मेरी GameScene कक्षा के भीतर मेरी कोड है। सबसे आसान तरीका इस तरह कुछ होगा।

func levelCountdown(){ 
    levelTimerValue-- 
    levelTimerLabel.text = String(levelTimerValue) 
} 
संबंधित मुद्दे