swift - 标签未显示(Swift 4 SpriteKit)

标签 swift sprite-kit swift4

我正在使用 Swift 4 SpriteKit 在 Xcode 中制作游戏。我的崩溃检测工作正常,但是当我尝试在播放器崩溃时让文本出现在屏幕上时,文本没有出现。我的游戏基本上是使用控制火箭飞船来躲避 meteor ,玩家也有发射子弹的能力。我已经检测到火箭飞船何时撞上了 meteor ,但无法让文本出现在屏幕上。我知道崩溃检测是有效的,因为每当我在 didBegin 函数中添加打印语句时,打印语句就会执行。所以它一定是我显示标签的方式,但我不确定我对标签做错了什么。 这是我的代码:

import SpriteKit
import GameplayKit
import UIKit



class GameScene: SKScene, SKPhysicsContactDelegate{

    let player = SKSpriteNode(imageNamed: "spaceship")
    let stars = SKSpriteNode(imageNamed: "stars")
    let meteor = SKSpriteNode(imageNamed: "meteor")


    override func didMove(to view: SKView) {
        physicsWorld.contactDelegate = self
        print(frame.size.width)
        print(frame.size.height)

        stars.position = CGPoint(x:0, y:0)
        stars.zPosition = 1

        player.position = CGPoint(x:0, y:-320)
        player.zPosition = 4
        player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width / 2)
        player.physicsBody?.affectedByGravity = false
        player.physicsBody?.isDynamic = false

        player.physicsBody?.categoryBitMask = 2
        player.physicsBody?.collisionBitMask = 1
        player.physicsBody?.contactTestBitMask = 1



        self.addChild(player)
        self.addChild(stars)

        self.addMeteor()


    }

    func didBegin(_ contact: SKPhysicsContact) {
        gameOver()

    }

    func addMeteor() {
        meteor.physicsBody = SKPhysicsBody(circleOfRadius: meteor.size.width / 2)
        meteor.physicsBody?.affectedByGravity = false
        meteor.setScale(0.50)
        meteor.position = CGPoint(x:Int(arc4random()%300),y:Int(arc4random()%600))
        //meteor.position = CGPoint(x:0 , y:0)
        meteor.zPosition = 4

        meteor.physicsBody?.categoryBitMask = 1
        meteor.physicsBody?.collisionBitMask = 0
        meteor.physicsBody?.contactTestBitMask = 2

        self.addChild(meteor)
    }

    func fireBullet() {
        let bullet = SKSpriteNode(imageNamed: "bullet")
        bullet.position = player.position
        bullet.setScale(0.5)
        bullet.zPosition = 3
        self.addChild(bullet)
        let moveBullet = SKAction.moveTo(y: self.size.height + bullet.size.height, duration: 1)
        let deleteBullet = SKAction.removeFromParent()
        let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
        bullet.run(bulletSequence)


    }

    func gameOver() {
        print("Game Over!")
        var gameOverLabel: SKLabelNode!
        gameOverLabel = SKLabelNode(fontNamed: "Chalkduster")
        gameOverLabel.text = "Game Over! You lost!"
        gameOverLabel.horizontalAlignmentMode = .right
        gameOverLabel.position = CGPoint(x: 0, y:0)
        self.addChild(gameOverLabel)
        print("Label added")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        fireBullet()
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch:  AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let previousPointOfTouch = touch.previousLocation(in: self)
            let amountDragged = pointOfTouch.x - previousPointOfTouch.x
            player.position.x += amountDragged
        }

    }



    override func update(_ currentTime: TimeInterval) {
        meteor.position.y -= 6
        if meteor.position.y < player.position.y - 300{
            meteor.removeFromParent()
            addMeteor()

        }
    }
}

不确定我做错了什么?我在 didBegin 中调用 gameOver() 函数,它应该在每次检测到碰撞时执行。但是什么也没发生? meteor 只是经过火箭飞船。如果有人能帮助我,那就太棒了!

最佳答案

正如我所见,您正在尝试将标签居中放置在屏幕上,您可以尝试在游戏结束时将其添加到您的代码中:

1.试试把位置改成这个

gameOverLabel.position = CGPoint(x: (self.scene!.frame.width / 2) - (self.scene!.frame.width * self.scene!.anchorPoint.x) / 2, y:(self.scene!.frame.height / 2) - (self.scene!.frame.height * self.scene!.anchorPoint.y))

2.我不知道你是否有什么东西超出了标签并影响了它的 View ,所以尝试:

gameOverLabel.zPosition = 10 //A number higher than any other zPosition 

3.标签可能太小了...试试:

gameOverLabel.fontSize = 30 //Adjust it to what you want

4.小提示:

移动:

var gameOverLabel: SKLabelNode! 

到下一行

let meteor = SKSpriteNode(imageNamed: "meteor") 

这样您将拥有一个通用标签,而不必每次都重新生成标签。

如果你这样做,只是最后一个提示......我不知道你是否有像 gameRestart() 或类似的函数......但请确保当你重新启动游戏时,你删除了标签:

gameOverLabel.removeFromParent()

如果您不这样做,当应用再次尝试添加标签时它会崩溃!

希望对您有所帮助!

关于swift - 标签未显示(Swift 4 SpriteKit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823230/

相关文章:

ios - 如何使用 SpriteKit 以编程方式快速更改背景颜色

swift - NSTableCellView View 中的 NSPopupButton 导致泄漏

ios - 在获取数据 Firebase/Swift 之前加载 TableView

ios - 使用 Swift 3 显示来自核心数据的随机数据

ios - 如何将 TripAdvisor 与 IOS APP 集成?

ios - 有没有办法使用 SpriteKit 获取屏幕上所有触摸的 NSSet?

ios - Sprite 与屏幕底部碰撞?

Swift TableView 不返回numbersOfRow

swift 4 : pattern match an object against a tuple (Tuple pattern cannot match values of the non-tuple type)

ios - 无法分配给属性 : 'item' is a 'let' constant (Swift 4)