在 Swift 中实例化从 SKSpriteNode 继承的基础 class
Instantiating a base class inheriting from SKSpriteNode in Swift
我正在尝试为我的第一个 iPhone 游戏编写一个通用的 Alien
'blueprint' class。这个 class 将包含一些属性和方法,这些属性和方法将被所有实际的外星子 class 继承。也就是说,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
class 之上的函数(在 GameScene 中)。我不确定这是什么意思,因为这是 GameScene 中的一个正常功能。如果我删除这个位,我仍然收到错误:
"Property self.velocityVector is not initialized at super.init call"
我很困惑,因为我认为 super.init()
只是必要的,因为我正在制作 SKSpriteNode 的 subclass 而它不需要 subclass 传递给它的特定属性。
最后,有没有办法在没有实际纹理的情况下调用 super.init()
,因为这个蓝图 class 永远不会是 "displayed"?
在 classes/initialization 上浏览了 Apples 文档后,我仍然卡住了。任何帮助都会很棒,谢谢。
您将 velocityVector
声明为非可选 属性 因此,如果您不在初始化程序中填充它,当然会出现编译器错误。
这就是为什么当您注释这一行时会出现编译错误。
self.velocityVector = normalizeVector(velocityVector)
您有几个问题,首先,如错误消息所述,您需要在调用 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")
}
}
我正在尝试为我的第一个 iPhone 游戏编写一个通用的 Alien
'blueprint' class。这个 class 将包含一些属性和方法,这些属性和方法将被所有实际的外星子 class 继承。也就是说,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
class 之上的函数(在 GameScene 中)。我不确定这是什么意思,因为这是 GameScene 中的一个正常功能。如果我删除这个位,我仍然收到错误:
"Property self.velocityVector is not initialized at super.init call"
我很困惑,因为我认为 super.init()
只是必要的,因为我正在制作 SKSpriteNode 的 subclass 而它不需要 subclass 传递给它的特定属性。
最后,有没有办法在没有实际纹理的情况下调用 super.init()
,因为这个蓝图 class 永远不会是 "displayed"?
在 classes/initialization 上浏览了 Apples 文档后,我仍然卡住了。任何帮助都会很棒,谢谢。
您将 velocityVector
声明为非可选 属性 因此,如果您不在初始化程序中填充它,当然会出现编译器错误。
这就是为什么当您注释这一行时会出现编译错误。
self.velocityVector = normalizeVector(velocityVector)
您有几个问题,首先,如错误消息所述,您需要在调用 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")
}
}