Как заставить мой счетчик очков работать в игре SpriteKit - PullRequest
0 голосов
/ 17 января 2019

Я использую 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 голосов
/ 18 января 2019

У вас две проблемы. Во-первых, вы никогда не получите доступ к scoreLabel за пределами didMove, поэтому метка счета никогда не изменится. Вы должны написать код, чтобы обновить метку счета, как продемонстрировал Александру в своем ответе.

Ваша вторая проблема заключается в том, что у вас есть две scoreLabel переменные, глобальная переменная и локальная scoreLabel переменная let в функции 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.

scoreLabel = SKLabelNode(fontNamed: "Chalkduster")

Теперь значение scoreLabel будет сохраняться после завершения загрузки сцены. Если вы обновите scoreLabel в adjustScore, счет должен обновиться.

Еще одна вещь. Если у вас есть ответ о том, что что-то не работает, вам нужно предоставить больше информации, чем «Я попробовал это, и это не сработало». Это не полезный ответ. Вы должны описать, что не сработало, иначе придется много взад и вперед пытаться получить соответствующую информацию, увеличивая время, необходимое для получения решения.

0 голосов
/ 18 января 2019

Когда снаряд поражает монстра, вы обновляете счет, но не обновляете метку.В этом случае метка всегда будет равна начальному значению, которое вы установили в начале игры

Когда вы увеличиваете счет, вам также следует обновить score_label.

func adjustScore(by points: Int) 
{
    score += points
    score_label.text = "Points = \(score)"
}
...