我正在使用SpriteKit和Xcode制作游戏,并且计数器处于“计数”状态,但是只有在游戏开始时才更新,计数器才会更新。
func adjustScore(by points: Int) {
score += points
}
func projectileDidCollideWithMonster(projectile: SKSpriteNode, monster: SKSpriteNode) {
print("Hit")
projectile.removeFromParent()
monster.removeFromParent()
monstersDestroyed += 1
adjustScore(by: 100)
if monstersDestroyed > 30 {
let reveal = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: true)
view?.presentScene(gameOverScene, transition: reveal)
}
我哪里出错了?
答案已解决,但以下是我的视图加载后的结果:
override func didMove(to view: SKView) {
background.zPosition = -1
background.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
addChild(background)
scoreLabel = SKLabelNode(fontNamed: "Chalkduster")
scoreLabel.text = "Points = \(score)"
scoreLabel.fontSize = 20
scoreLabel.fontColor = SKColor.black
scoreLabel.position = CGPoint(x: size.width/6.2, y: size.height/1.2)
addChild(scoreLabel)
HighScoreLabel = SKLabelNode(fontNamed: "Chalkduster")
HighScoreLabel.text = "High score = \(highScore)"
HighScoreLabel.fontSize = 20
HighScoreLabel.fontColor = SKColor.black
HighScoreLabel.position = CGPoint(x: size.width/5.2, y: size.height/6)
addChild(HighScoreLabel)
NewSkinLabel = SKLabelNode(fontNamed: "Chalkduster")
NewSkinLabel.text = ""
NewSkinLabel.fontSize = 20
NewSkinLabel.fontColor = SKColor.black
NewSkinLabel.position = CGPoint(x: size.width/2, y: size.height/4.4)
addChild(NewSkinLabel)
}
答案 0 :(得分:0)
当射弹击中怪物时,您会更新得分,但不会更新标签。在这种情况下,标签将始终等于您在游戏开始时设置的初始值
增加分数时,还应该更新score_label
。
func adjustScore(by points: Int)
{
score += points
score_label.text = "Points = \(score)"
}
答案 1 :(得分:0)
您有两个问题。首先,您永远不会访问scoreLabel
之外的didMove
,因此分数标签永远不会改变。正如Alexandru在他的回答中所展示的那样,您必须编写代码来更新分数标签。
第二个问题是您在scoreLabel
函数中有两个scoreLabel
变量,一个全局变量和一个局部didMove
常量。在scoreLabel
中声明didMove
时,
let scoreLabel = SKLabelNode(fontNamed: "Chalkduster")
scoreLabel.text = "Total Coins: \(score)"
scoreLabel.fontSize = 40
scoreLabel.fontColor = SKColor.black
scoreLabel.position = CGPoint(x: size.width/2, y: size.height/1.5)
addChild(scoreLabel)
当您退出scoreLabel
时,此版本的didMove
将消失。现在,如果您访问全局scoreLabel
以显示分数,则标签为空。您已在临时本地版本上加载并设置了所有内容。
解决此问题并避免混淆的最简单方法是只有一个scoreLabel
变量。摆脱全局scoreLabel
并声明scoreLabel
作为GameScene
类的属性。然后在didMove
中,删除要加载scoreLabel
的let。
scoreLabel = SKLabelNode(fontNamed: "Chalkduster")
现在,场景加载完成后,scoreLabel
的值将保持不变。如果您在scoreLabel
中更新adjustScore
,则分数将会更新。
还有一件事。如果您对无法解决的问题有一个回应,则需要提供的信息比“我尝试过但没有解决”要多。那是没有帮助的回应。您必须描述不起作用的地方,否则将会来回尝试获取相关信息,这会增加获取解决方案所花费的时间。