Это еще не ответ.Это имеет проблемы, которые все еще идут вместе с ним, описанные в редактировании (ях) ниже исходного ответа.
Из-за хранимые свойства в расширениях Swift не разрешены (что приводит к небольшому значению в Objective-C), это было сделано немного сложнее.Однако после некоторого исследования и тестирования я нашел решение, которое на данный момент хорошо работает:
import SpriteKit
// Key to access the stored properties
private var minimumSpeedAssociatedKey: UInt8 = 0
extension SKPhysicsBody {
// Minimum speed for each node
var minimumSpeed: CGFloat? {
get { return objc_getAssociatedObject(self, &minimumSpeedAssociatedKey) as? CGFloat }
set(newValue) { objc_setAssociatedObject(self, &minimumSpeedAssociatedKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
}
// Update the speed for each node
func updateSpeed() {
guard let safeMinimumSpeed = minimumSpeed else {
assert(false, "You have tried to update an object speed, without setting the minimum for the node: \"\(self.node?.description ?? "Unavailable")\".")
}
let currentSpeed = sqrt(pow(velocity.dx, 2) + pow(velocity.dy, 2))
if currentSpeed < safeMinimumSpeed && currentSpeed > 0 {
angularVelocity = 0
velocity = CGVector(dx: 0, dy: 0)
}
}
}
Поместите это в файл Swift в своем проекте.Затем вы можете установить минимальную скорость:
ballNode.physicsBody?.minimumSpeed = 30
Затем переопределите функцию обновления следующим образом:
override func didFinishUpdate() {
ballNode.physicsBody?.updateSpeed()
}
В результате шар теперь больше не катится ниже скорости30
, и он останавливается вместо этого.Остановка по-прежнему почти незаметна, так как предыдущий мяч шел очень медленно в течение 5-секундного периода.Это результаты, которые я искал.
Я надеюсь, что это поможет людям, и если вы нашли лучшее решение (или Apple добавляет новое свойство), пожалуйста, оставьте свой собственный ответ.:)
Редактировать 1:
Теперь у меня изменяемая местность.Однако, это вызывает странную физику, когда мяч откатывается назад, когда он ударяет по холму.Поэтому это не полностью решенная проблема.