предотвратить столкновение узлов Spritekit с той же Catagorymask - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть проект Spritekit, над которым я работаю, где есть узел игрока, который вы перемещаете по экрану, а затем есть пули, которые стреляют в вас.Моя проблема в том, что пули попадают не только в игрока, но и в других.Я дал игроку и пулям свою собственную категорию / коллизию / маски контакта.

Я указываю здесь все различные маски категорий (некоторые из них можно игнорировать):

enum CategoryMask : UInt32 {
    case playeragain = 11
    case player = 1
    case GBullet = 2
    case BBullet = 3
    case enemyships = 4
    case coin = 5
    case boss = 6
}

BBullet - это пули, которые стреляют в вас, а игрок - это узел, который контролирует пользователь..

Затем я присваиваю эти маски каждому узлу:

    player.physicsBody?.categoryBitMask = CategoryMask.player.rawValue
    player.physicsBody?.collisionBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue
    player.physicsBody?.contactTestBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue


    bullet.physicsBody?.categoryBitMask = CategoryMask.BBullet.rawValue
    bullet.physicsBody?.collisionBitMask = CategoryMask.player.rawValue
    bullet.physicsBody?.contactTestBitMask = CategoryMask.player.rawValue

Столкновение между пулями и игроком работает нормально, и я настроил, как обрабатывать каждое столкновение, в разделе «Началось»контактная функция.Я хотел бы указать, что я не хочу, чтобы пули сталкивались друг с другом.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Просто добавьте к ответу выше, с вашим определением масок битов категории как:

case playeragain = 11 (binary 1011)
case player = 1            (Binary 0001)
case GBullet = 2.          (Binary 0010)
case BBullet = 3.         (Binary 0011)
case enemyships = 4. (Binary. 0100)
case coin = 5.              (Binary 0101)
case boss = 6.             (Binary 0110)

Единственные уникальные значения, которые у вас есть (т.е. с одним набором битов), это player, GBullet и вражеские корабли.,Все, что определено как BBullet, будет соответствовать как игрок или GBullet;Монета будет идентифицировать вражеские корабли или игрока и босса как вражеские корабли или GBullet и playeragain как нечто неопределенное (1000), GBullet или Player.

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

0 голосов
/ 03 февраля 2019

Это битовая маска в двоичном формате.

Так что лучше использовать какой-нибудь битовый оператор:

enum CategoryMask : UInt32 {
case playeragain = 0b00000001
case player = 0b00000010
case GBullet = 0b00000100
case BBullet = 0b00001000
case enemyships = 0b00010000
case coin = 0b00100000
case boss = 0b01000000
  }



   // case playeragain = 1<<0 //1
   // case player = 1<<1    // 2
    // case GBullet = 1<<2  // 4
   // case BBullet = 1<<3   //8
   // case enemyships = 1<<4 //16
   // case coin = 1<<5 //32
   // case boss = 1<<6 //64

  //

Это должно дать вам то, что вы на самом деле.

Это пример из Apple Document, и красный шар ударится о землю, а синий - нет.

    let ground = SKShapeNode()

      redBall.physicsBody?.collisionBitMask = 0b0001
      blueBall.physicsBody?.collisionBitMask = 0b0010
      ground.physicsBody?.categoryBitMask = 0b0001
...