从零开始的8-bit迷宫探险【Level 23】长老,这个水晶值多少钱?

「喂?」山姆拿起对讲机,试着联络村子里的长老。
「我在这座黑森林里,找到很多水晶,这样不知道可以卖多少钱?」山姆期待着长老的回应。
长老想了一下,露出慈祥(?)的微笑。
「这些水晶,我 50 收!」

今日目标

  • 计算水晶、魔幻水晶、香菇、击退怪物的得分
  • 在游戏中显示得分

PS. 这里是开发 iOS 手机游戏的系列文,如果还没看过之前 剧情 文章的朋友,欢迎先点这边回顾唷!


新增得分文字

我们用程序码新增显示游戏总分的文字,放在游戏画面的最上方

新增一个外层的节点 (SKSpriteNode)

  • 命名为 scoreNode,给它一个灰底颜色,宽度与萤幕同宽,高 30
  • 设定 anchorPointCGPoint(x: 0, y: 0.5)
  • scoreNode 加到游戏场景里

新增一个文字节点 (SKLabelNode)

  • 命名为 labelScore,让他显示的文字为 Score: \(score),将标题与分数组合起来显示
  • fontColor:设定文字颜色
  • fontSize:设定文字大小
  • fontName:设定字体
  • position:设定位置
  • horizontalAlignmentMode:设定水平对齐方式
  • verticalAlignmentMode:设定垂直对齐方式
  • labelScore 加到 scoreNode

新增一个计分的变数

  • 命名为 score

调整位置

applySafeArea 方法里调整位置:

  • mapNode:位置再往下移一个 scoreNode 的高
  • scoreNode:位置往下移 topSafeArea 跟自身一半的高 (因 anchorPoint y 为 0.5)
  • GameScene.swift
class GameScene: SKScene {
    ...
    var scoreNode: SKSpriteNode?
    var labelScore: SKLabelNode?
    var score: Int = 0
    
    override func didMove(to view: SKView) {
        ...
        self.scoreNode = SKSpriteNode(color: .darkGray, size: CGSize(width: CGFloat(self.size.width), height: CGFloat(30)))
        self.labelScore = SKLabelNode(text: "Score: \(score)")
        if let scoreNode = self.scoreNode, let labelScore = self.labelScore {
            scoreNode.anchorPoint = CGPoint(x: 0, y: 0.5)
            self.addChild(scoreNode)

            labelScore.fontColor = UIColor.white
            labelScore.fontSize = CGFloat(24)
            labelScore.fontName = "Copperplate"
            labelScore.position = CGPoint(x: 10, y: 0)
            labelScore.horizontalAlignmentMode = .left
            labelScore.verticalAlignmentMode = .center
            scoreNode.addChild(labelScore)
        }
    }
    
    func applySafeArea() {
        ...
//        if let mapNode = self.mapNode {
//            mapNode.position = CGPoint(x: 0, y: -self.topSafeArea)
//        }
        if let mapNode = self.mapNode, let scoreNode = self.scoreNode {
            mapNode.position = CGPoint(x: 0, y: -self.topSafeArea - scoreNode.size.height)
            scoreNode.position =  CGPoint(x: 0 ,y: -self.topSafeArea - scoreNode.size.height/2)
        }
    }
}

执行结果

https://imgur.com/yHMIfN0.gif


加上分数

先新增一个加分的方法 addScore(add: Int),改变 score 变数的值,也改变 labelScore 显示的文字

  • GameScene.swift
class GameScene: SKScene {
    ...
    func addScore(add: Int) {
        self.score += add
        self.labelScore?.text = "Score: \(self.score)"
    }
}

水晶

主角与水晶碰触时,加上水晶得分:10

  • GameScene.swift
class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for crystal in self.crystals where !crystal.isGotten && crystal.gridX == sam.gridX && crystal.gridY == sam.gridY {
            ...
            self.addScore(add: 10)
        }
    }
}

魔幻水晶

主角与魔幻水晶碰触时,加上魔幻水晶得分:100

class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for magicCrystal in self.magicCrystals where !magicCrystal.isGotten && magicCrystal.gridX == sam.gridX && magicCrystal.gridY == sam.gridY {
            ...
            self.addScore(add: 100)
        }
    }
}

香菇

主角与香菇碰触时,加上香菇得分:200

class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for mushroom in self.mushrooms where !mushroom.isGotten && mushroom.gridX == sam.gridX && mushroom.gridY == sam.gridY {
            ...
            self.addScore(add: 200)
        }
    }
}

击退怪物

主角与怪物碰触,且怪物模式为逃逸时,加上击退得分:50

class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for weather in self.weathers where (weather.gridX == sam.gridX && abs(weather.node.position.y - sam.node.position.y) <= CGFloat(self.gridWH + 6) || weather.gridY == sam.gridY && abs(weather.node.position.x - sam.node.position.x) <= CGFloat(self.gridWH + 6)) && (gridMapping.purpleTree.x != sam.gridX && gridMapping.purpleTree.y != sam.gridY)
        {
            if weather.mode == .ATTACK || weather.mode == .PLAY {
                ...
            } else if weather.mode == .ESCAPE {
                ...
                self.addScore(add: 50)
            }
        }
    }
}

执行结果

成功将分数累积在画面上方罗!
https://imgur.com/dey7rz5.gif

今日小结

目前我们已经可以计算得分罗~但是...
累积的得分在关闭游戏後,就会重置了,辛苦得来的分数就这样飞了 /images/emoticon/emoticon02.gif
还缺少将最高得分纪录起来的功能!
游戏要能破纪录,才会更有挑战性~
明日会教大家如何将最高得分纪录在本机里。


<<:  Day 19. v-bind - Class的绑定

>>:  Android学习笔记22

语法糖小测验: Scope functions & Extension function

最近补课的模式有了改变,大部分时间都是诗忆读着讲义,遇到问题或是想要学得更深入的时候再和唯心讨论。 ...

【day7】关於每日便当菜

其实这个系列参赛 主要是希望自己可以平日做便当、假日吃好料 但工作太忙了 还需要多一点时间调整 所以...

Day29-JDK可视化监控工具:visualVM(五)

前言 延续着上篇的介绍,这篇要来介绍visualVM的Sampler页签 Sampler 这边我延续...

D7(9/7)-91App(6741) 帮商家做电商的电商专家

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

我们的基因体时代-AI, Data和生物资讯 Day17-分析定序档案格式SAM, BAM的工具

上一篇我们的基因体时代-AI, Data和生物资讯 Day16- 视觉浏览定序档案格式SAM, BA...