如何让我的计分器在SpriteKit游戏中工作

时间:2019-01-17 19:10:33

标签: sprite-kit

我正在使用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)
}

2 个答案:

答案 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,则分数将会更新。

还有一件事。如果您对无法解决的问题有一个回应,则需要提供的信息比“我尝试过但没有解决”要多。那是没有帮助的回应。您必须描述不起作用的地方,否则将会来回尝试获取相关信息,这会增加获取解决方案所花费的时间。