swift - 标签未显示(Swift 4 SpriteKit)
问题描述
我正在使用 Swift 4 SpriteKit 在 Xcode 中制作游戏。我的崩溃检测工作正常,但是当我尝试在播放器崩溃时让文本出现在屏幕上时,文本不会出现。我的游戏基本上有使用控制必须躲避流星的火箭飞船,玩家也有发射子弹的能力。我已经检测到火箭飞船何时撞击流星,但无法让文本出现在屏幕上。我知道崩溃检测是有效的,因为每当我在 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() 函数,该函数应该在每次检测到碰撞时执行。但是什么都没有发生?流星只是经过火箭飞船。如果有人可以帮助我,那就太棒了!
解决方案
正如我看到你试图在屏幕上居中标签,你可以尝试将它添加到你的代码,在gameover func:
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.我不知道您是否有超出标签并影响其视图的东西,因此请尝试:
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()
如果你不这样做,当应用再次尝试添加标签时,它会崩溃!
希望能帮助到你!
推荐阅读
- mysql - 如何在 MYSQL 的 where 子句中使用 Concat?
- java - NetBeans 不工作,Linux 上的新项目
- unity3d - unity:如何在没有 VIVE 设备的情况下为 HTC VIVE Pro 开发
- javascript - 使用用户选择更新多个下拉列表
- java - 使用 PDF2Dom 从 PDF 中提取字体大小和粗体
- mysql - 尝试从 Mysql 导出到 CSV 时出错
- python - 如何将 QLabel 值检索为整数
- python - CodecRegistryError:在 PyCharm 中运行 Nosetests 时,模块“encodings.ascii”中的编解码器不兼容
- javascript - 按 ID 删除一行中的特定 DIV
- python - 将两个数据框与python合并时的MemoryError