【发布时间】:2018-10-04 15:24:10
【问题描述】:
我一直在学习旧的 Ray Wenderlich 教程:https://www.raywenderlich.com/1514-introduction-to-the-sprite-kit-scene-editor,但遇到了问题。我已经多次遇到这个问题,甚至在 stackoverflow 网站上找到了一个“解决方案”:Passing Data Between Scenes (SpriteKit)
这与教程的代码相同(在 Swift 2 中进行了一些调整)。我觉得这是一个非常简单优雅的解决方案,并且没有使用 NSdefaults 等充满代码。
这是对新场景的调用,请注意 soundToPlay 对象:
func gameOver(didWin: Bool) {
let menuScene = MenuScene(size: self.size)
menuScene.scaleMode = .aspectFill
menuScene.soundToPlay = didWin ? "fear_win.mp3" : "fear_lose.mp3"
let transition = SKTransition.flipVertical(withDuration: 1.0)
self.view?.presentScene(menuScene, transition: transition)
}
这就是我要召唤的场景:
import SpriteKit
class MenuScene: SKScene {
var soundToPlay: String!
override func sceneDidLoad() {
self.backgroundColor = SKColor(red: 0, green:0, blue:0, alpha: 1)
// Setup label
let label = SKLabelNode(fontNamed: "AvenirNext-Bold")
label.text = "Press anywhere to play again!"
label.fontSize = 55
label.horizontalAlignmentMode = .center
label.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addChild(label)
// Play sound
if let soundToPlay = soundToPlay {
run(SKAction.playSoundFileNamed(soundToPlay, waitForCompletion: false))
}
}
数据从不传递,对象的值为nil
我怀疑这在 Swift 中发生了一些变化,因为教程已经很老了,就像上一个 stackoverflow 问题中建议的“解决方案”一样。
如果是这样,现在最好的方法是什么?
【问题讨论】:
-
还有什么东西可以访问 soundToPlay 吗?从我所看到的情况来看,它不应该对你失败,所以要么你有不同的 MenuScene,要么有其他东西正在访问 soundToPlay。顺便说一句,您可以使用
userData并避免为您的菜单创建自定义类。除非您计划添加功能,否则请避免使用自定义类。由于教程不好,有一个怪癖让我很恼火。let menuScene = MenuScene(size: self.size); menuScene.scaleMode = .aspectFill是丑陋的代码。我建议设置一个恒定的静态大小或加载一个 SKS 文件。当您能够创建聊天室时,我可以解释原因。 2) -
我刚刚检查过,它只用于我剪切和粘贴的代码。这是一个非常基本的游戏,它教如何使用场景编辑器,不幸的是,场景编辑器错误导致我在向颜色精灵节点添加纹理时遇到问题,导致我编写所有精灵而不是场景编辑器。您的其他评论很有趣,因为所有教程(我已经做了很多)都有您指出的丑陋代码。在我的无知中,我避免使用 SKS 文件并尝试以编程方式完成所有操作。谢谢
-
很多教程都犯了同样的错误。不幸的是,他们更关心让事情正常工作,而不是充分利用 API。即使是官方的苹果样品也有罪。
-
是的,一旦您了解了基础知识,如果有一个网站可以列出快速约定和最佳编程实践,那就太好了。我从 Apple 自学了每个人都可以编写代码,并花更多时间解决按照教程引入的错误。谢天谢地,stackoverflow
-
不管怎样,在你的sceneDidLoad中添加一个打印语句来检查它被调用了多少次
标签: ios swift sprite-kit skscene