Настройка:
Я создаю подкласс SKSpriteNode()
для создания пользовательского подкласса с именем SubNode()
.
Класс SKSPriteNode() имеет свойство physicsBody
, в котором хранится объект SKPhysicsBody()
. SKPhysicsBody
имеет свойство под названием "скорость", которое является 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(), установка физического тела, а затем скорости
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)