我正在尝试为我的第一款iPhone游戏写一个通用的Alien
'蓝图'课程。该类将包含一些属性和方法,这些属性和方法将由所有实际的外来子类继承。也就是说,Alien
实际上不应该有纹理,也不应该有自己的一组定义值。
//Generic alien type: a blue-print of sorts
class Alien:SKSpriteNode{
let velocityVector:CGVector
let startPos:CGPoint
init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
self.velocityVector = normalizeVector(velocityVector)
self.position = position
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
每次我尝试设置时,都会遇到一些错误,例如:
"Use of instance member 'normalizeVector' on type GameScene; did you mean to use a value of type GameScene instead?"
normalizeVector
是一个写在Alien
类之上的函数(在GameScene中)。我不确定这意味着什么,因为这是GameScene中的正常功能。如果我删除这个位,我仍然会收到错误:
"Property self.velocityVector is not initialized at super.init call"
我很困惑,因为我认为super.init()
只是必要的,因为我正在创建SKSpriteNode的子类,并且不需要将子类特定的属性传递给它。
最后,有没有办法在没有实际纹理的情况下调用super.init()
,因为这个蓝图类不会被“显示”?
在查看关于类/初始化的Apples文档后,我仍然卡住了。任何帮助都会很棒,谢谢。
答案 0 :(得分:2)
您有几个问题,首先,正如错误消息所示,您需要在致电super.init
之前初始化所有变量:
init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
self.velocityVector = Alien.normalizeVector(velocityVector)
self.startPos = startPos
super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
self.position = position
}
其次,听起来你在子类或其他地方定义normalizeVector
?我所做的是将它定义为静态方法(因为它在初始化之前使用,它不能是实例方法)然后你可以在init方法中使用它。把它们放在一起看起来像:
class Alien:SKSpriteNode {
static func normalizeVector(vector:CGVector) -> CGVector {
let len = sqrt(vector.dx * vector.dx + vector.dy * vector.dy)
return CGVector(dx:vector.dx / len, dy:vector.dy / len)
}
let velocityVector:CGVector
let startPos:CGPoint
init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
self.velocityVector = Alien.normalizeVector(velocityVector)
self.startPos = startPos
super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
self.position = position
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
答案 1 :(得分:0)
您将velocityVector
声明为非可选属性,因此当然如果您没有在初始化程序中填充它,则会出现编译错误。
这就是为什么当你评论这一行时你会得到一个编译错误。
self.velocityVector = normalizeVector(velocityVector)