【发布时间】:2021-01-22 22:12:47
【问题描述】:
设置:
我正在继承 SKSpriteNode() 以创建一个名为 SubNode() 的自定义子类。
SKSPriteNode() 类有一个名为physicsBody 的属性,它存储一个SKPhysicsBody() 对象。 SKPhysicsBody 有一个名为“velocity”的属性,即CGVector()
目标:
在我的子类中,我希望有一个变量始终保持以前的CGVector()。例如,只要我打电话给subNode.physicsBody?.velocity = CGVector(dx: 10, dy: 10) 就意味着。 subNode.previousVelocity 应设置为之前的 subNode.physicsBody?.velocity 值。
问题
如果velocity 只是超类的继承属性,我可以只使用override 属性并附加didSet 观察者。但由于velocity 是SKPhysicsBody() 的属性,并且SKPhysicsBody() 对象在其属性之一更改时不会更改,因此didSet 不会被触发,我无法听到它的更改。
如果我的解释不清楚,请要求进一步澄清。
我的子类:
class SubNode: SKSpriteNode {
var previousVelocity: CGVector = .zero
// This doesn't get triggered because the physiceBody object doesn't change when one of its properties changes.
override var physicsBody: SKPhysicsBody? {
didSet {
previousVelocity = oldValue?.velocity
}
}
// If velocity would be a property of the superclass, this would trigger.
override var velocity: CGVector {
didSet {
previousVelocity = oldValue
}
}
}
从 SubNode() 子类创建对象 subNode,设置物理体,然后设置速度"
let subNode = SubNode()
subNode.physicsBody = SKPhysicsBody()
subNode.physicsBody?.velocity = CGVector(dx: 10, dy: 10)
subNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
//should be true: subnode.previousVelocity == CGVector(dx: 10, dy: 10)
【问题讨论】:
标签: swift inheritance overriding subclass property-observer