【发布时间】:2016-10-28 12:25:11
【问题描述】:
我想创建一个比 SpriteNode 的 touchesBegan 更高级别的 SKShapeNode,所以当我想从这个 sprite 上的 touchesBegun 事件将 SKShapeNode 添加到屏幕时,形状已经存在,我只需将它添加到touchesBegan 覆盖中的屏幕。
TL;DR,在我的 SKSpriteNode 中,我正在尝试预先构建 SKShapeNode,当 Sprite 被触摸时将用作动画环。
我想用变量/常量创建 SKShapeNode,所以我可以轻松地编辑它的值...
所以在子类的根中,我有颜色、大小和线宽的变量,准备好用于创建 SKShapeNode...
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
....
再往下,但仍然是类的根,我创建了我的环:
let ring = SKShapeNode(circleOfRadius: ringSize)
我立即以可爱的神秘方式迎接:
不能在属性初始化器中使用实例成员“ringSize”, 属性初始化程序在 'self' 可用之前运行。
很好。行。我得到它。您想认为应该在将值分配给 self 之前完成对类的功能调用以创建属性。无论是在这里还是那里,我都觉得我越来越狡猾了,可以通过将所有内容包装在一个函数中来解决这个问题:
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
var myRing = SKShapeNode()
func createRing() -> SKShapeNode{
let ring = SKShapeNode(circleOfRadius: ringSize)
ring.strokeColor = ringColor
ring.lineWidth = ringWidth
return ring
}
这不会产生任何错误,而且我的兴奋感越来越强。
所以我添加了另一行来创建实际的环: ....
myRing = createRing()
又死了:
!预期的 声明
我完全不知道这意味着什么,并开始随机尝试奇怪的事情。
其中一个正在进入我已经很乱的便利初始化程序,并在其中添加 myRing = createRing()...这可行!
这是如何以及为什么起作用的,这是绕过初始化消耗的最佳/正确/正确方法吗?
:: EDIT:: UPDATE :: 完整代码上下文 ::
这是我奇怪和被误解的初始化程序的完整课程。
import SpriteKit
class Circle: SKSpriteNode {
var ringSize: CGFloat = 96
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 8
var myRing = SKShapeNode()
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
}
convenience init() {
self.init(color: SKColor.clear, size: CGSize(width: 100, height: 100))
myRing = createRing()
addChild(myRing)
print("I'm on the screen")
explodeGroup = create_explosionActionGroup()
}
convenience init(color: UIColor, size: CGSize, position: CGPoint) {
self.init(color: color, size: size)
self.position = position
myRing = createRing()
explodeGroup = create_explosionActionGroup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createRing() -> SKShapeNode{
let ring = SKShapeNode(circleOfRadius: ringSize)
ring.strokeColor = ringColor
ring.lineWidth = ringWidth
return ring
}
【问题讨论】:
-
我的猜测是你在初始化类 Balls 之前使用了 var ringSize。如果你想这样做,你必须声明 static var ringSize 和 static other var。或者,如果您需要实例 var,您可以在 Balls init() func 中执行此操作
-
在 Balls init() 中执行此操作的问题在于,在 Balls 的 touchesBegan 函数中没有任何可用的内容。 @SimonePistecchia
-
如果我使用静态,优雅就没有了,如果我想随时更改任何值,对于任何给定的实例,我需要创建一个新变量。
-
和静态变量或者让我们不解决“预期声明”问题
-
init 是执行此操作的正确位置。如果你想在类中全局创建它,那么你需要声明你的变量,比如
ringSizestatic,因为你的实例在创建之前不知道ringSize是什么。仅仅因为您在代码中将ringSize放在ring之前并不意味着编译器会按此顺序创建这些变量。
标签: swift sprite-kit initialization subclass skspritenode