didBeginContact ложно срабатывает

В моей игре есть лазеры, которые стреляют вперед из точки. Я использую этот код, чтобы растянуть лазерный спрайт и переместить его для имитации движения в функции обновления:

let height = size.height
yScale += travelSpeed * CGFloat(time)
let difference = size.height - height
let xMove = sin(-zRotation) * difference * 0.5
let yMove = cos(-zRotation) * difference * 0.5
position = CGPoint(x: position.x + xMove, y: position.y + yMove)

Все выглядит отлично - лазер стреляет из точки, и физический контур тела из view.showPhysics следует точно. Однако didBeginContact иногда ложно срабатывает, когда игрок не контактирует с лазером. Почему это происходит?

Редактировать:

Лазерная Физика Тела:

    physicsBody = SKPhysicsBody(texture: texture!, size: size)
    physicsBody!.affectedByGravity = false
    physicsBody!.linearDamping = 0
    physicsBody!.collisionBitMask = 0
    physicsBody!.categoryBitMask = 1

Физика тела игрока:

    physicsBody = SKPhysicsBody(circleOfRadius: 5)
    physicsBody!.affectedByGravity = false
    physicsBody!.linearDamping = 0
    physicsBody!.collisionBitMask = 0
    physicsBody!.contactTestBitMask = 1

Таким образом, они настроены так, что didBeginContact вызывается, когда они сталкиваются, и это происходит. У меня проблема в том, что didBeginContact также иногда вызывается, когда игрок не находится в контакте. Мое текущее предположение состоит в том, что мой код движения смещает физическое тело лазера на невидимое мгновение или что-то в этом роде.

Я установил точку останова внутри didBeginContact и сделал снимок экрана. Объекты, которые столкнулись, - это корабль и лазер, идущие через угол.

1 ответ

Решение

Оказывается, физическое тело становится немного неточным, если вы попытаетесь растянуть спрайт примерно в 100 раз по сравнению с его первоначальным размером. К сожалению.

Я попытался просто повторно применить новое физическое тело в обновлении, которое, кажется, работает.

Другие вопросы по тегам