2017-01-06 3 views
1

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

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) 

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

Edit:

Лазерная физика тела:

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 также вызывается иногда, когда игрок не находится в контакте. Мое нынешнее предположение заключается в том, что мой код движения не вмещает физическое тело лазера в течение невидимого момента или чего-то еще.

Я установил точку останова внутри сделалBeginContact и сделал скриншот. Объектами, которые столкнулись, являются корабль, а лазер проходит через угол.

+1

Вам нужно указать пример, который мы можем проверить, не работает, ваш код ничего не показывает – Knight0fDragon

+0

Обычно, если didBegin (контакт :) запускается, для этого есть веская причина. Поскольку KoD имеет saud, нам понадобится больше кода (определение физического тела, категория & contactTest bitMasks плюс ваш код didBegin (контакт :). Также точное описание того, какой узел якобы ошибочно контактирует с другими. –

+1

'let height = size. height 'и' let difference = size.height - height 'делает «разницу» всегда 0. – Emptyless

ответ

1

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

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

Смежные вопросы