我不知道如何解决该错误。如果有人理解,请帮忙!
class GameScene: SKScene {
let player = SKSpriteNode(imageNamed: "playerShip")
let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)
var gameArea: CGRect
override init(size: CGSize)
{
let maxAspectRatio: CGFloat = 16.0/9.0
let playableWidth = size.height/maxAspectRatio
let margin = (size.width - playableWidth)/2
gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
super.init(size: size)
}
required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
我正在尝试为屏幕上的对象设置边界。当我编写super.init(size: size)
时,Xcode自动创建了必需的init?(coder aDecoder: NSCoder)
,但是运行时我得到了以下错误:
线程1:致命错误:init(coder :)尚未实现
答案 0 :(得分:0)
因为您已使用override init(size: CGSize)
方法覆盖了SKScene的指定初始化方法,因此必须实现此required init?(coder aDecoder: NSCoder)
方法以允许自定义SKScene类(您的GameScene类)进行对象序列化。
这篇较老的文章可能会帮助您解释一下:
What exactly is init coder aDecoder?
如果您尝试初始化gameArea
变量,为什么不尝试尝试在gameArea
的覆盖中设置sceneDidLoad()
之类的方法呢? (下面的代码确实很糟糕):
class GameScene: SKScene {
let player = SKSpriteNode(imageNamed: "playerShip")
let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)
var gameArea: CGRect?
override func sceneDidLoad() {
let maxAspectRatio: CGFloat = 16.0/9.0
let playableWidth = size.height/maxAspectRatio
let margin = (size.width - playableWidth)/2
gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
}
<<more of your code>>
}
并消除override init(size: CGSize)
答案 1 :(得分:0)
就像oaccamsrazor指出的那样,如果您向类添加了初始化程序,则还必须在超类中实现任何必需的初始化程序。您击中init?(coder aDecoder: NSCoder)
的事实表明init(size: ...)
未被调用,可能是因为您是从.sks
文件创建场景的。
init?(coder aDecoder: NSCoder)
文件创建场景时,会调用 .sks
,因此那里没有fatalError()
。基本上,如果您有任何要初始化的内容,则只需实际实现您的初始化程序即可。否则,请删除所有初始化程序,并且拥有init?(coder aDecoder: NSCoder)
的要求将消失。