「喂?」山姆拿起對講機,試著聯絡村子裡的長老。
「我在這座黑森林裡,找到很多水晶,這樣不知道可以賣多少錢?」山姆期待著長老的回應。
長老想了一下,露出慈祥(?)的微笑。
「這些水晶,我 50 收!」
PS. 這裡是開發 iOS 手機遊戲的系列文,如果還沒看過之前
劇情文章的朋友,歡迎先點這邊回顧唷!
我們用程式碼新增顯示遊戲總分的文字,放在遊戲畫面的最上方
scoreNode
,給它一個灰底顏色,寬度與螢幕同寬,高 30anchorPoint
為 CGPoint(x: 0, y: 0.5)
scoreNode
加到遊戲場景裡labelScore
,讓他顯示的文字為 Score: \(score)
,將標題與分數組合起來顯示fontColor
:設定文字顏色fontSize
:設定文字大小fontName
:設定字體position
:設定位置horizontalAlignmentMode
:設定水平對齊方式verticalAlignmentMode
:設定垂直對齊方式labelScore
加到 scoreNode
裡score
在 applySafeArea
方法裡調整位置:
scoreNode
的高topSafeArea
跟自身一半的高 (因 anchorPoint y 為 0.5)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)
}
}
}
先新增一個加分的方法 addScore(add: Int)
,改變 score
變數的值,也改變 labelScore
顯示的文字
class GameScene: SKScene {
...
func addScore(add: Int) {
self.score += add
self.labelScore?.text = "Score: \(self.score)"
}
}
主角與水晶碰觸時,加上水晶得分:10
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)
}
}
}
}
成功將分數累積在畫面上方囉!
目前我們已經可以計算得分囉~但是...
累積的得分在關閉遊戲後,就會重置了,辛苦得來的分數就這樣飛了
還缺少將最高得分紀錄起來的功能!
遊戲要能破紀錄,才會更有挑戰性~
明日會教大家如何將最高得分紀錄在本機裡。