how can i save the high score?

121 views Asked by At

Before i get any help i want to clarify that Im not an expert as you'll see. I'm a complete beginner in programming. now with that said.

How can i manage to save the high score after the game ends? in the following code I'm using NSUserDefaults but I'm having a problem in it that i can't fix. once i run the game and i get a score of 30 once the countdown hits 0 for example and then i try to play it again and i get a 12 for example it automatically 12 is the new high score to 12 which is totatly wrong but i can't fix it.

class Game: SKScene, SKPhysicsContactDelegate {

    let Ball = SKSpriteNode(imageNamed: "Red.png")

    var QuitOption = SKLabelNode()
    var ScoreLabel = SKLabelNode()

    var timesecond = Int(60)

    var locked = false

    var loseOption = SKLabelNode()
    var scorePoints = SKLabelNode()


    var score = Int()


    let whiteBall = SKSpriteNode(imageNamed: "fingerPointingDown.png")

    var caseForScoreOne = SKLabelNode()
    var caseForScoreTwo = SKLabelNode()


    struct PhysicsCategory {
        static let Ball: UInt32 = 0b1
        static let whiteBall: UInt32 = 0b10
    }


    override func didMoveToView(view: SKView) {


        backgroundColor = SKColor.whiteColor() // background for the display

        self.physicsWorld.gravity = CGVectorMake(0, -9.8)
        self.physicsWorld.contactDelegate = self

        let SceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        SceneBody.friction = 0
        self.physicsBody = SceneBody

        scorePoints = SKLabelNode(fontNamed: "Noteworthy-Light")
        scorePoints.text = "0"
        scorePoints.fontColor = SKColor.blackColor()
        scorePoints.fontSize = 35
        scorePoints.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height*1 - 120)
        scorePoints.name = "Points"


        addChild(scorePoints)

        Ball.size = CGSize(width: 82, height: 82)
        Ball.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height*0.1 - 60)
        Ball.physicsBody = SKPhysicsBody(circleOfRadius: 41)
        Ball.physicsBody?.affectedByGravity = true
        Ball.physicsBody?.density = 10
        Ball.physicsBody?.restitution = 0.1
        Ball.physicsBody?.linearDamping = 0
        Ball.name = "Ball"
        Ball.physicsBody?.usesPreciseCollisionDetection = true
        Ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball
        Ball.physicsBody?.contactTestBitMask = PhysicsCategory.whiteBall
        Ball.physicsBody?.collisionBitMask = PhysicsCategory.whiteBall

        self.addChild(Ball)

        QuitOption.text = "Quit"
        QuitOption.fontName = "Noteworthy-Light"
        QuitOption.fontColor = SKColor.purpleColor()
        QuitOption.fontSize = 35
        QuitOption.position = CGPoint(x: self.frame.size.width/2 - 160, y: self.frame.size.height*1 - 110)
        QuitOption.name = "Quit"

        addChild(QuitOption)

        ScoreLabel = SKLabelNode(fontNamed: "Noteworthy-Light")
        ScoreLabel.fontColor = SKColor.redColor()
        ScoreLabel.fontSize = 35                 // The + will move it to the right side and - to the left side for more accuracy.
        ScoreLabel.position = CGPoint(x: self.frame.size.width/2 + 160, y: self.frame.size.height/1 - 115) // position of ScoreLabelNode
        ScoreLabel.name = "Score+"
        ScoreLabel.hidden = false

        self.addChild(ScoreLabel)

        whiteBall.size = CGSize(width: 55, height: 55)
        whiteBall.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height*0.8 - 30)
        whiteBall.name = "whiteBall"
        whiteBall.physicsBody = SKPhysicsBody(circleOfRadius: 25)
        whiteBall.physicsBody?.dynamic = false
        whiteBall.physicsBody?.restitution = 0.1
        whiteBall.physicsBody?.usesPreciseCollisionDetection = true
        whiteBall.physicsBody?.categoryBitMask = PhysicsCategory.whiteBall
        whiteBall.physicsBody?.contactTestBitMask = PhysicsCategory.Ball
        whiteBall.physicsBody?.collisionBitMask = PhysicsCategory.Ball

        self.addChild(whiteBall)


        caseForScoreOne = SKLabelNode(fontNamed: "Noteworthy-Light")
        caseForScoreOne.fontColor = SKColor.blackColor()
        caseForScoreOne.fontSize = 25
        caseForScoreOne.position = CGPoint(x: self.frame.size.width/2 - 160, y: self.frame.size.height*1 - 175)

        caseForScoreOne.name = "caseOne"

        addChild(caseForScoreOne)

        caseForScoreTwo = SKLabelNode(fontNamed: "Noteworthy-Light")
        caseForScoreTwo.fontColor = SKColor.blackColor()
        caseForScoreTwo.fontSize = 25
        caseForScoreTwo.position = CGPoint(x: self.frame.size.width/2 + 160, y: self.frame.size.height/1 - 175)

        caseForScoreTwo.name = "caseTwo"

        addChild(caseForScoreTwo)

    }

    // Making the ball jump after user touches ball

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


        var touch = touches.first as! UITouch
        var location = touch.locationInNode(self)
        var node = self.nodeAtPoint(location)


        if (node.name == "Quit"){

            let myScene = GameScene(size: self.size)
            myScene.scaleMode = scaleMode
            let reveal = SKTransition.fadeWithDuration(1)
            self.view?.presentScene(myScene, transition: reveal)

        }

        if (node.name == "Ball"){

            for touch: AnyObject in touches {


                Ball.physicsBody?.allowsRotation = true
                Ball.physicsBody?.velocity = CGVectorMake(0, 0)
                Ball.physicsBody?.applyImpulse(CGVectorMake(0, 450))

            }

        }

        if(!self.locked){

            self.locked = true

            var actionrun = SKAction.waitForDuration(0.5)
            var actionwait = SKAction.runBlock({

                self.timesecond--

                if self.timesecond == 60 {self.timesecond = 0}

                self.ScoreLabel.text = "\(self.timesecond)"

                if (self.timesecond == 0){

                   self.saveHighScore(0)

                    if self.score > self.highScore() {

                        self.saveHighScore(self.score)

                        self.caseForScoreTwo.text = "N.H.S = " + self.highScore().description

                    } else if (self.score > self.highScore()) {

                        self.caseForScoreOne.text = "N.H.S = " + self.score.description
                    }



                }

            })


            let loopAction = SKAction.repeatAction(SKAction.sequence([actionwait, actionrun]), count: 60)

            ScoreLabel.runAction(loopAction, withKey: "scoreAction")


        }


    }

    func didBeginContact(contact: SKPhysicsContact) {

        let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

        if collision == PhysicsCategory.Ball | PhysicsCategory.whiteBall {

            score++

            scorePoints.text = "Score: \(score)"

        }

    }

    func saveHighScore(high:Int) {
        NSUserDefaults.standardUserDefaults().setInteger(high, forKey: "highscore")
    }
    func highScore() -> Int {
        return NSUserDefaults.standardUserDefaults().integerForKey("highscore")
    }
    func resetHighScore() {
        NSUserDefaults.standardUserDefaults().removeObjectForKey("highscore")
    }

}
1

There are 1 answers

0
Leo Dabus On BEST ANSWER
func saveHighScore(high:Int) {
    if high > highScore() {
        NSUserDefaults().setInteger(high, forKey: "highscore")
        println("highscore saved")
    } else {
        println("not a highscore")
    }
}