我使用形状对游戏进行原型设计,spritekit在swift之前很棒.
现在,当我尝试扩展SKSpriteNode并添加我的init函数时,我无法调用super.init(颜色,大小).
我无法调用创建形状纹理的代码.
我需要知道如何调用init函数,或者如何创建形状纹理,所以我可以覆盖指定的init,然后使用我的形状纹理调用它.
编辑:这是我正在做的确切代码,我在另一个SKSprite节点扩展类中做了几乎完全相同的事情:
class TetrisCell : SKSpriteNode
{
let length = 10;
convenience init(color:UIColor) {
var size = CGSize(width: length, height: length);
//Not allowed to call a super's convenience init, must call non-convenience init
super.init(color: color, size: size);
}
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么它不会让我,所以我正在寻找另一种方式.目前,TetrisCell没有纹理.为了方便起见,我想简单地使用形状.
据我所知,我必须调用super.init(texture:,color:,size :)来初始化我的SKSpriteNode.如果没有办法做上面的代码,那么我想知道他们将SKTexture设置为什么,所以我可以模仿它.像super.init(texture:SKTexture.blankTexture)之类的东西.无论它们是什么,因为纹理是由color:属性操纵的,而我的1x1像素似乎不受color:属性的影响.
Mik*_*e S 13
TL; DR:该texture
参数的类型的SKTexture!
.由于它被定义为隐式解包的可选项,因此您可以通过nil
.
首先,你不能只是打电话super(texture:, color, size:)
给你convenience init
,你实际上必须打电话给一个init
方法self
.所以,你必须添加override init(texture: SKTexture!, color: SKColor!, size: CGSize)
(你可以随后调用super
).
其次,你可以nil
作为texture
参数传递; SpriteKit会适当地处理它.
第三个(并且只是因为我必须进行更改才能编译),因此length
在创建size
变量时不能使用属性,因为类实例尚未初始化.相反,我建议将其声明length
为a var
并将其作为参数传递给您convenience init
.
把所有这些放在一起,你得到这样的东西:
class TetrisCell : SKSpriteNode
{
var length: CGFloat!
override init(texture: SKTexture!, color: SKColor!, size: CGSize) {
self.length = 10 // Some sort of sensible default
super.init(texture: texture, color: color, size: size)
}
convenience init(color: SKColor, length: CGFloat = 10) {
var size = CGSize(width: length, height: length);
self.init(texture:nil, color: color, size: size)
self.length = length
}
required init?(coder aDecoder: NSCoder) {
// Decoding length here would be nice...
super.init(coder: aDecoder)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9483 次 |
最近记录: |