В моей игре есть лазеры, которые стреляют вперед из точки. Я использую этот код, чтобы растянуть лазерный спрайт и переместить его, чтобы имитировать движение в функции обновления:
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 и сделал снимок экрана. Объекты, которые столкнулись, - это корабль и лазер, летящий за угол.