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 и сделал снимок экрана. Объекты, которые столкнулись, - это корабль и лазер, летящий за угол.


person Zek    schedule 06.01.2017    source источник
comment
Вам нужно предоставить пример, который мы можем проверить, что он не работает, ваш код ничего не показывает   -  person Knight0fDragon    schedule 06.01.2017
comment
Как правило, если didBegin(contact:) запускается, для этого есть веская причина. Как сказал KoD, нам понадобится больше кода (определение тела физики, категория и битовые маски contactTest, а также ваш код didBegin(contact:). Также точное описание того, какой узел предположительно ошибочно связывается с какими другими.   -  person Steve Ives    schedule 07.01.2017
comment
«пусть высота = размер.высота» и «пусть разница = размер.высота - высота» делает «разницу» всегда равной 0.   -  person Emptyless    schedule 07.01.2017
comment
yScale изменяет высоту, поэтому size.height отличается от высоты объекта раньше. Он получает разницу между старой и новой высотой, поэтому я могу перемещать его вдвое меньше, чтобы 1 конечная точка лазера оставалась в одном и том же месте.   -  person Zek    schedule 07.01.2017
comment
возможно, связано (хотя решения нет) /а>   -  person CupawnTae    schedule 07.01.2017


Ответы (1)


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

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

person Zek    schedule 08.01.2017