Использование тела SKPhysics для обнаружения столкновений - PullRequest
0 голосов
/ 04 ноября 2018

Итак, я создаю игру, и я просто хочу обнаружить столкновение между узлом игрока и пулей, выпущенной врагом. Поэтому я установил правильные параметры, а также CategoryBitMask и contactTestBitMask для каждого игрока и пуль.

Реализуя функции didBegin и didEnd, я хочу выполнить некоторый код, когда столкновение начинается и заканчивается. Проблема в том, что когда я строю и запускаю проект, физическая подсистема перемещает пулю вокруг игрока, а не через игрока. Это связано с тем, что свойство isDynamic слишком велико для игрока, маркера или для обоих. Очевидно, что первое, что нужно попробовать, это установить для свойства isDynamic значение false; однако, когда я делаю это, обратный вызов отсутствует, когда происходит столкновение, и функция didBegin / didEnd не выполняется.

У кого-нибудь есть идеи как это исправить?

Код для настройки тела игрока и пули; а также функция didBegin ниже для вашей справки

    playerNode!.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: playerNode!.size.width/2, height: playerNode!.size.height/2))  //sets the physics body for the player
    playerNode!.physicsBody!.isDynamic = false                                                                                        //we dont want the physics to be simulated by the subsystem
    playerNode!.physicsBody!.affectedByGravity = false
    playerNode!.physicsBody!.pinned = false
    playerNode!.physicsBody!.allowsRotation = false
    playerNode!.physicsBody!.categoryBitMask = PhysicsCategory.Player
    playerNode!.physicsBody!.contactTestBitMask = PhysicsCategory.Bullet

    self.bullet?.physicsBody = SKPhysicsBody(circleOfRadius: bullet!.size.width * 0.5)
    self.bullet?.physicsBody?.isDynamic = true
    self.bullet?.physicsBody?.pinned = false
    self.bullet?.physicsBody?.allowsRotation = false
    self.bullet?.physicsBody?.affectedByGravity = false
    self.bullet?.physicsBody?.categoryBitMask = PhysicsCategory.Bullet
    self.bullet?.physicsBody?.contactTestBitMask = PhysicsCategory.Player

func didBegin(_ contact: SKPhysicsContact) {
    let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    if collision == PhysicsCategory.Player | PhysicsCategory.Bullet {
        print("There was a collision with the player and a bullet")
    }
}

//Defines the physics category for the game
struct PhysicsCategory {
    static let None: UInt32   = 0
    static let Player: UInt32 = 0b1
    static let Bullet: UInt32 = 0b10
}

1 Ответ

0 голосов
/ 04 ноября 2018

Пуля «движется» вокруг игрока, а не через него, потому что у вас включены столкновения. По умолчанию все физические тела сталкиваются со всеми остальными, тогда как по умолчанию контакты между физическими телами не зарегистрированы.

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

playerNode.physicsBody?.collisionBitMask &= ~physicsCategory.bullet bullet.physicsBody?.collisionBitMask &= ~physicsCategory.player

Редактировать: мое пошаговое руководство по столкновениям и контактам: https://stackoverflow.com/a/51041474/1430420

Руководство по битовым маскам при столкновении и при контакте: https://stackoverflow.com/a/40596890/1430420

Управление битовыми масками для включения и выключения отдельных столкновений и контактов. https://stackoverflow.com/a/46495864/1430420

...