防止Spritekit具有相同Catagorymask相撞节点

时间:2019-02-02 22:49:56

标签: swift sprite-kit collision categories skspritenode

我有一个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 :(得分:0)

它是二进制的位掩码。

因此最好使用一些位运算符:

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

答案 1 :(得分:0)

只需添加到上面的答案中,您将类别位掩码定义为:

 MyViewController *rootCtr = [[MyViewController alloc] init];

 [rootCtr.view addSubview:myView];

 window.rootViewController = rootCtr;

您拥有的唯一值(即,仅设置了一个位)是玩家,GBullet和敌对状态。任何定义为BBullet的东西都将匹配为播放器或GBullet;硬币将被识别为敌军或玩家,而上司则被识别为敌军或GBullet和玩家,再次是未定义的东西(1000),GBullet或Player。

这是冲突和contactTest位掩码的指南: https://stackoverflow.com/a/40596890/1430420