У обнаружения контакта SpriteKit есть небольшая задержка - PullRequest
1 голос
/ 28 апреля 2019

Я создаю маленькую игру, в которой мяч должен подпрыгивать на верхней, левой и правой стенах, а он должен остановиться, как только коснется пола.

У меня уже есть рабочий код обнаружения контакта и делегат, который вызывается в правильной ситуации и с правильным временем. Создание маленького круга в точке столкновения, найденной в 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
}

Я ожидаю, что мяч остановится, все еще касаясь пола, а не рамы после того, как он уже отскочил.

...