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 раз по сравнению с его первоначальным размером. К сожалению.
Я попытался просто повторно применить новое физическое тело в обновлении, которое, кажется, работает.