Я создаю маленькую игру, в которой мяч должен подпрыгивать на верхней, левой и правой стенах, а он должен остановиться, как только коснется пола.
У меня уже есть рабочий код обнаружения контакта и делегат, который вызывается в правильной ситуации и с правильным временем.
Создание маленького круга в точке столкновения, найденной в func didBegin(_ contact: SKPhysicsContact)
, создает узел в правильном положении.
В том же методе я называю ball.physicsBody?.velocity = .zero
и ball.position = contact.contactPoint
, и мяч правильно останавливается. Проблема в том, что иногда мяч останавливает кадр слишком поздно, после того, как он уже отскочил от пола.
Мяч имеет реституцию 1, потому что я бы хотел, чтобы он отскакивал без замедления, кроме как при касании пола.
Я уже пытался установить позицию в ноль, скорость в ноль, его атрибут isDynamic
в false. Каждая из этих попыток делает то, что должна, но иногда это происходит слишком поздно.
И для мяча, и для пола свойство usesPreciseCollisionDetection
установлено на true
.
Если я попытаюсь добавить искусственную задержку, метод контакта вызывается снова (прерывая часть игрового процесса).
Вот код моего шарового узла:
class Ball: SKSpriteNode {
convenience init() {
self.init(imageNamed: "earth")
physicsBody = SKPhysicsBody(circleOfRadius: 12.5)
physicsBody?.usesPreciseCollisionDetection = true
physicsBody?.categoryBitMask = Masks.ball
physicsBody?.contactTestBitMask = Masks.floor
physicsBody?.allowsRotation = false
physicsBody?.restitution = 1
physicsBody?.friction = 0
physicsBody?.angularDamping = 0
physicsBody?.linearDamping = 0
}
}
и вот код для моего didBegin
метода:
func didBegin(_ contact: SKPhysicsContact) {
ball.physicsBody?.velocity = .zero
ball.position = contact.contactPoint
}
Я ожидаю, что мяч остановится, все еще касаясь пола, а не рамы после того, как он уже отскочил.