给出以下课程,
<Employee>
<Name>abc</Name>
<Number number_type = "Id">123</Number>
<Number number_type = "dept">456</Number>
</Employee>
似乎没有调用class Spaceship {
var position: CGPoint! {
didSet {
node.position = position
}
}
var node: SKSpriteNode!
init(frame: CGRect) {
node = SKSpriteNode(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
}
属性的didSet
观察者。
由于position
属性更改时didSet
观察者应该设置SpriteKit节点的位置,因此我认为,与其使用position
块中包含的同一行代码,我可以触发后者,但是似乎不起作用;创建场景时(在主GameScene中,该场景仅创建了didSet
对象,并将Spaceship
添加到场景的节点子对象中),spaceship.node
的位置似乎是{{ 1}}。
关于为什么会发生这种情况的任何线索?谢谢。
更新:尽管node
语句有效,但是该分配不允许使用它。
答案 0 :(得分:3)
与其使用didSet
更新节点,不如直接将查询转发给它:
class Spaceship {
let node: SKSpriteNode
init(frame: CGRect) {
self.node = SKSpriteNode(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
var position: CGPoint {
get { return node.position }
set { node.position = newValue }
}
}
答案 1 :(得分:1)
在调用超类初始化器之后,在子类初始化器中设置属性时,将调用超类属性的willSet和didSet观察器。 在超类初始化程序被调用之前,类在设置自己的属性时不会被调用。
一个可能的解决方案是在position
的初始化程序之外设置Spaceship
属性,或者直接设置node
的位置。
答案 2 :(得分:0)
我个人只是将飞船归类为SKSpriteNode。太空飞船似乎并不是一个复杂的对象,它涉及到继承之上的合成。
class Spaceship : SKSpriteNode {
convenience init(frame: CGRect) {
self.init(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
}
现在我不确定您为什么要像这样传递帧...。我假设帧是您的场景?如果是这种情况,当锚点不是(0,0)时,您将遇到问题。