在本节中,我们将实施评分系统。此功能将允许我们收集珠宝并将计数器的数量增加1.当满足一定数量时,我们会将我们的玩家发送到下一级别。
要学习本教程,您将需要Xcode 9,您可以下载最终项目,以帮助您与自己的进度进行比较。
让我们声明变量。在度量Measure之后 ,为Score添加新注释。然后,声明scoreLabel和** score**。
// Score
let scoreLabel = SKLabelNode()
var score = 0
在didMove函数中,初始化位置,字体颜色,大小,字体和标签的对齐方式。然后,将节点添加到摄像机。
scoreLabel.position = CGPoint(x: (cameraNode?.position.x)! + 310, y: 140)
scoreLabel.fontColor = #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1)
scoreLabel.fontSize = 24
scoreLabel.fontName = "AvenirNext-Bold"
scoreLabel.horizontalAlignmentMode = .right
scoreLabel.text = String(score)
cameraNode?.addChild(scoreLabel)
现在我们有标签集,我们需要一个函数来增加数量。在操作标记中,声明一个新函数并将其命名为:rewardTouch。在函数内部,让我们将得分+1并调用得分。
func rewardTouch() {
score += 1
scoreLabel.text = String(score)
}
类似于玩家和陷阱之间的碰撞,当玩家触摸珠宝时,存在多个接触并且得分将增加超过一个的量。我们需要将碰撞限制在一个,所以每次玩家接触到宝石时,每个宝石的分数都会增加一个。在布尔分区中,声明一个变量并将其命名为:rewardIsNotTouched。
var rewardIsNotTouched = true
在Game Loop部分中,将此新变量设置为true。
在碰撞标记中,在玩家和奖励之间添加新的碰撞匹配。声明if语句,如果节点名为jewel且rewardIsNotTouched为true,则插入rewardTouch函数。将rewardIsNotTouched设置为false。
if collision.matches(.player, .reward) {
if contact.bodyA.node?.name == "jewel" {
contact.bodyA.node?.physicsBody?.categoryBitMask = 0
contact.bodyA.node?.removeFromParent()
}
else if contact.bodyB.node?.name == "jewel" {
contact.bodyB.node?.physicsBody?.categoryBitMask = 0
}
if rewardIsNotTouched {
rewardTouch()
rewardIsNotTouched = false
}
}
在GameScene.sks中,移动玩家前面的宝石并更换其掩码。
宝石:
运行模拟器,将玩家移动到宝石上,您将看到评分系统正常工作!
你可能已经注意到宝石仍在那里,即使它被触摸了。我们需要调用removeFromParent方法。在玩家和宝石之间的碰撞中,调用if语句中的方法。您需要尝试这两种情况之一并运行模拟器。当玩家触摸珠宝时,宝石将消失,而不是玩家。
在本节中,我们学习了如何实施评分系统。您可以将此系统用于多个可数的功能,例如:健康,法力,经验,货币,积分......