【发布时间】:2021-10-22 11:04:29
【问题描述】:
我有一个简单的游戏,玩家需要进行三轮比赛以获得最高分。 gameScene 存在于 SwiftUI 视图中,其创建方式如下:
var gameScene: SKScene {
let scene = NyonindoGameScene(
size: CGSize(
width: UIScreen.main.bounds.width,
height: UIScreen.main.bounds.height
)
)
scene.viewModel = self.viewModel
scene.scaleMode = .aspectFill
return scene
}
使用 SpriteView() 从视图主体(在 ZStack 内的 GeometryReader 内)调用它。代码运行良好,直到我在新的 iPhone 13 上进行测试,这给了我各种古怪和意想不到的行为。我现在不会详细说明它们,因为我已经修复了大部分,但我仍然留下了一个“幻影”开始按钮。它旨在根据正在播放的回合显示不同的文本(即:“开始”、“再试一次”、“最后机会”),使用精确计数回合的变量。但是,我在第一轮结束时得到了这个:
当这个科学怪人按钮被点击时,新一轮开始。但是,SKPhysicsContactDelegate didBegin(_:) 不会被调用并且碰撞被忽略。 (在这里我普遍感到困惑,我不知道这是一个单独的问题,还是在我解决重叠按钮问题时会消失的问题。) 无论如何,这里是 startButton 的相关代码:
func addStartButton(text: String) {
startButton.removeFromParent() // added as one of many failed remedies
let startButtonLabel = SKLabelNode(text: text)
startButtonLabel.fontName = SKFont.bold
startButtonLabel.fontSize = 40.0
startButtonLabel.fontColor = UIColor.white
startButtonLabel.position = CGPoint(x: 0, y: -12)
startButton.position = CGPoint(x:self.frame.midX, y:self.frame.midY)
startButton.zPosition = 3
startButton.addChild(startButtonLabel)
addChild(startButton)
}
在didMove(to view: SKView)中初始启动按钮是这样调用的:
if attempts == 0 {
addStartButton(text: "Start")
}
第二轮和第三轮的按钮在 gameOver() 函数中调用,如下所示:
if attempts == 1 {
startButton.removeFromParent() // again, this is overkill as it gets removed before this...
let text: String = "Try Again!"
addStartButton(text: text)
}
if attempts == 2 {
startButton.removeFromParent()
let text: String = "Last Chance!"
addStartButton(text: text)
}
我最初有一个 switch 语句而不是两个 if 语句,但这产生了同样的问题。打印到控制台的语句表明每一轮只调用一个按钮,但结果表明有些不同。 有什么线索吗? (抱歉,如果我没有提供足够的代码进行评估。)
【问题讨论】:
-
答案中的代码应该可以解决问题。 FWIW,您上面的基本问题是,每次调用
addStartButton时,您都是startButton节点的新标签节点。从其父级移除startButton并不会破坏startButton或移除它自己的子级,因此标签正在累积。
标签: swiftui sprite-kit skphysicscontact