Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
300 views
in Technique[技术] by (71.8m points)

ios - How can I make a function execute every second in swift?

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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 the timer using:

timer.invalidate()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...