I want to add a score to the top of my scene in the game I am working on. The score is going to based on how long you last, and will increase every second. Thanks for the help in advance!
import SpriteKit class easyScene: SKScene { let scrollBarEasyBottom = SKSpriteNode(imageNamed: "scrollBarEasyBottom") let scrollBarEasyTop = SKSpriteNode(imageNamed: "scrollBarEasyTop") let ball = SKSpriteNode(imageNamed: "ball") var origSBEBpositionX = CGFloat(0) var origSBETpositionX = CGFloat(0) var maxSBEBX = CGFloat(0) var SBEBSpeed = 5 var maxSBETX = CGFloat(0) var SBETSpeed = 5 var score = 0 var timer: NSTimer? var scoreText = SKLabelNode(fontNamed: "Kailasa") override func didMoveToView(view: SKView) { println("Easy Scene is the location") self.backgroundColor = UIColor.blackColor() self.scrollBarEasyBottom.position = CGPoint(x:0, y:270) self.addChild(self.scrollBarEasyBottom) self.scrollBarEasyBottom.yScale = 0.2 self.origSBEBpositionX = self.scrollBarEasyBottom.position.x // end scrollBarEasyBottom self.scrollBarEasyTop.position = CGPoint(x:20, y:400) self.addChild(self.scrollBarEasyTop) self.scrollBarEasyTop.yScale = 0.2 self.origSBETpositionX = self.scrollBarEasyTop.position.x // end scrollBarEasyTop self.ball.position = CGPoint(x:40, y:293) self.addChild(self.ball) self.ball.yScale = 0.17 self.ball.xScale = 0.17 // end ball self.maxSBEBX = self.scrollBarEasyBottom.size.width - self.frame.size.width self.maxSBEBX *= -1 self.maxSBETX = self.scrollBarEasyTop.size.width - self.frame.size.width self.maxSBETX *= -1 // self.scoreText.text = "0" self.scoreText.fontSize = 60 self.scoreText.position = CGPoint(x: CGRectGetMidX(self.frame), y: 500) self.scoreText.text = String(self.score) self.addChild(self.scoreText) timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("scoreIncrease") , userInfo: nil, repeats: true) func scoreIncrease (){ score++ println(score) } } override func update(currentTime: NSTimeInterval) { if self.scrollBarEasyBottom.position.x <= maxSBEBX + 1200 { self.scrollBarEasyBottom.position.x = self.origSBEBpositionX } if self.scrollBarEasyTop.position.x <= maxSBETX + 1200 { self.scrollBarEasyTop.position.x = self.origSBETpositionX } scrollBarEasyBottom.position.x -= CGFloat(self.SBEBSpeed) scrollBarEasyTop.position.x -= CGFloat(self.SBETSpeed) // moving bars var degreeRotation = CDouble(self.SBEBSpeed) * M_PI / 180 self.ball.zRotation -= CGFloat(degreeRotation) //rotate ball } }
After running this code, I always get an
unrecognized selector sent to instance error
Creating a non-repeating timerlet timer1 = Timer. scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: false) let timer2 = Timer. scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in print("Timer fired!") }
You can use one like this:
var timer = NSTimer() override func viewDidLoad() { scheduledTimerWithTimeInterval() } func scheduledTimerWithTimeInterval(){ // Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounting"), userInfo: nil, repeats: true) } func updateCounting(){ NSLog("counting..") }
Swift 3:
var timer = Timer() override func viewDidLoad() { // Use for the app's interface scheduledTimerWithTimeInterval() } override func didMove(to view: SKView) { // As part of a game scheduledTimerWithTimeInterval() } func scheduledTimerWithTimeInterval(){ // Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateCounting), userInfo: nil, repeats: true) } @objc func updateCounting(){ NSLog("counting..") }
Swift 5:
Note: this solution is compatible with iOS 10.0+.
// If needing to check for iOS compatibility use // if #available(iOS 10.0, *) {code} var timer = Timer() override func viewDidLoad() { self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in updateCounting() }) } func updateCounting(){ print("counting...") }
You can then invalidate (stop) the timer using:
timer.invalidate()
There is something called NSTimer in swift which could solve your problem. I have given an example like how you can use it. Just customise it for your purpose.
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("yourMethodToCall"), userInfo: nil, repeats: true)
Add this line to the place where you need to call your function repeatedly.
1.0
refers to 1 second. selector
to call yourMethodNamerepeats
is set to true
to call that function every second.Try this out and let me know if your are stuck somewhere. Thanks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With