为复杂按钮子类化 SKNode 或 SKSpriteNode
Subclassing SKNode, or SKSpriteNode for complex buttons
我正在制作具有各种状态和状态之间动画的复杂按钮,以及循环 "attract" 动画。由于阴影、高光、发光和内部视觉变化的性质,按钮非常复杂。
每个按钮都有几个用于绘制和动画的SKSpriteNodes,多个SKLabelNodes和多个SKEffectNodes,加上基于自己和他人状态的状态转换动作,以及对自己的触摸事件。
目前这些按钮是从 SKSpriteNode 子类构建和实例化的。
但我突然想到我可能正在这样做 "wrong",我应该改为子类化 SKNode。
在上述情况下,将元素堆叠到 SKNode 的子类与 SKSpriteNode 的优缺点是什么?
根据SKNode
定义:
The SKNode class does not perform any drawing of its own.
我非常同意使用 SKSpriteNode
作为按钮的子类更好,因为自定义按钮的 init 方法也可能有很大的优势,这在创建过程中会变得非常舒服一个按钮。
我写了一些代码来做一个例子:
class CoolButton: SKSpriteNode {
var isEnabled: Bool = true {
didSet {
if (disabledTexture != nil) {
texture = isEnabled ? defaultTexture : disabledTexture
}
}
}
var isSelected: Bool = false {
didSet {
texture = isSelected ? selectedTexture : defaultTexture
}
}
init(normalTexture defaultTexture: SKTexture!, selectedTexture:SKTexture!, disabledTexture: SKTexture?, size:CGSize) {
...
super.init(texture: defaultTexture, color: UIColor.white, size: size)
...
}
...
}
我看不出有什么缺点,因为 SKSpriteNode
直接继承自 SKNode
。
添加新元素作为子元素也没有困难,如[=15=]或其他SKSpriteNode
我正在制作具有各种状态和状态之间动画的复杂按钮,以及循环 "attract" 动画。由于阴影、高光、发光和内部视觉变化的性质,按钮非常复杂。
每个按钮都有几个用于绘制和动画的SKSpriteNodes,多个SKLabelNodes和多个SKEffectNodes,加上基于自己和他人状态的状态转换动作,以及对自己的触摸事件。
目前这些按钮是从 SKSpriteNode 子类构建和实例化的。
但我突然想到我可能正在这样做 "wrong",我应该改为子类化 SKNode。
在上述情况下,将元素堆叠到 SKNode 的子类与 SKSpriteNode 的优缺点是什么?
根据SKNode
定义:
The SKNode class does not perform any drawing of its own.
我非常同意使用 SKSpriteNode
作为按钮的子类更好,因为自定义按钮的 init 方法也可能有很大的优势,这在创建过程中会变得非常舒服一个按钮。
我写了一些代码来做一个例子:
class CoolButton: SKSpriteNode {
var isEnabled: Bool = true {
didSet {
if (disabledTexture != nil) {
texture = isEnabled ? defaultTexture : disabledTexture
}
}
}
var isSelected: Bool = false {
didSet {
texture = isSelected ? selectedTexture : defaultTexture
}
}
init(normalTexture defaultTexture: SKTexture!, selectedTexture:SKTexture!, disabledTexture: SKTexture?, size:CGSize) {
...
super.init(texture: defaultTexture, color: UIColor.white, size: size)
...
}
...
}
我看不出有什么缺点,因为 SKSpriteNode
直接继承自 SKNode
。
添加新元素作为子元素也没有困难,如[=15=]或其他SKSpriteNode