【问题标题】:Differentiating Between Different Bitmasks区分不同的位掩码
【发布时间】:2017-08-16 19:06:51
【问题描述】:

我无法弄清楚如何区分不同的位掩码。

我希望这种情况发生:

 /*func didBegin(_ contact: SKPhysicsContact) {
if (spaceship1 collides with spaceship2) {
    print("contact between 1 and 2")
    }
if (spaceship1 collides with spaceship3) {
print("contact between 1 and 3")
    }
}
*/

这是我尝试过的代码:

    func didBegin(_ contact: SKPhysicsContact) {
    if (contact.bodyA.categoryBitMask = enemyCategory && contact.bodyB.categoryBitMask = enemy2Category) {
        print("contact between 1 and 2")
    }
}

我能得到一些帮助吗?

编辑:这是其他代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

let enemy2Category: UInt32 = 1

let enemyCategory: UInt32 = 2

let enemy3Category: UInt32 = 3

var spaceship1: SKSpriteNode!
var spaceship2: SKSpriteNode!
var spaceship3: SKSpriteNode!

override func didMove(to view: SKView) {
    self.physicsWorld.contactDelegate = self
    spaceship1 = SKSpriteNode(imageNamed: "Spaceship");
    spaceship1.setScale(CGFloat(0.1))
    spaceship1.position = CGPoint(x: self.frame.width / 2, y: (self.frame.height / 2));
    spaceship1.name = "spaceship1";


    spaceship1.physicsBody = SKPhysicsBody(circleOfRadius: spaceship1.size.width / 2);
    spaceship1.physicsBody?.isDynamic = true // apply gravity, friction, and collision
    spaceship1.physicsBody?.affectedByGravity = true;
    spaceship1.physicsBody?.allowsRotation = false
    spaceship1.physicsBody = SKPhysicsBody(circleOfRadius: spaceship1.size.width / 2);
    spaceship1.physicsBody?.categoryBitMask = enemy2Category
    spaceship1.physicsBody?.collisionBitMask = enemyCategory
    spaceship1.physicsBody?.contactTestBitMask = enemyCategory

    spaceship2 = SKSpriteNode(imageNamed: "Spaceship");
    spaceship2.setScale(CGFloat(0.1))
    spaceship2.position = CGPoint(x: self.frame.width / 2, y: (spaceship1.position.y + 300));
    spaceship2.name = "spaceship2";

    spaceship2.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width / 2);
    spaceship2.physicsBody?.isDynamic = true // apply gravity, friction, and collision
    spaceship2.physicsBody?.affectedByGravity = false;
    spaceship2.physicsBody?.allowsRotation = false
    spaceship2.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width / 2);
    spaceship2.physicsBody?.categoryBitMask = enemyCategory
    spaceship2.physicsBody?.collisionBitMask = enemy2Category
    spaceship2.physicsBody?.contactTestBitMask = enemy2Category

    spaceship3 = SKSpriteNode(imageNamed: "Spaceship");
    spaceship3.setScale(CGFloat(0.1))
    spaceship3.position = CGPoint(x: self.frame.width / 2, y: (spaceship1.position.y + 300));
    spaceship3.name = "spaceship3";

    spaceship3.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width / 2);
    spaceship3.physicsBody?.isDynamic = true // apply gravity, friction, and collision
    spaceship3.physicsBody?.affectedByGravity = false;
    spaceship3.physicsBody?.allowsRotation = false
    spaceship3.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width / 2);
    spaceship3.physicsBody?.categoryBitMask = enemy3Category
    spaceship3.physicsBody?.collisionBitMask = enemy2Category | enemyCategory
    spaceship3.physicsBody?.contactTestBitMask = enemy2Category | enemyCategory


    addChild(spaceship1)

}


        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    addChild(spaceship3)
}

    override func update(_ currentTime: TimeInterval) {
        spaceship1.physicsBody?.affectedByGravity = false;
}

}

我只是想弄清楚如何检测哪些位掩码相互接触。就像如果 spaceship1 与 spaceship2 接触,它会打印 yay,但如果 spaceship1 与 spaceship 3 接触,它会打印“wow”

【问题讨论】:

    标签: swift3 sprite-kit physics


    【解决方案1】:

    有一篇文档文章试图解释 Sprite-Kit 碰撞和接触中使用的位掩码,但我无法再链接到它。尝试找到“文档”页面,标记“Sprite-Kit”,然后找到“操纵接触测试和碰撞位掩码以启用/禁用特定接触和碰撞”。 'SKNode Collision'下的文章。

    一个明显的问题是这一行:

    let enemy3Category: UInt32 = 3
    

    所有位掩码必须被认为是二进制,而二进制 3 是 11。这是“1”位和“2”位都设置为 1。类别定义 应该只将 1 位设置为 1,您可以通过对类别使用 2 的精确幂来确保这一点 - 1、2、4、8、16、32 等。

    场景中需要碰撞/接触的对象最初应该只属于一个类别。对于更高级的接触和碰撞,一个精灵可以属于多个类别。

    【讨论】:

      【解决方案2】:

      您的 if 语句中缺少一个 =。

      func didBegin(_ contact: SKPhysicsContact) {
          if (contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == enemy2Category) {
              print("contact between 1 and 2")
          }
      }
      

      【讨论】:

      • @G.L.您的接触位掩码设置正确吗?在声明位掩码的位置发布代码。
      • 是的,冲突有效,但我希望它根据位掩码做不同的事情
      • 我会尝试更好地解释我想要什么。
      • 假设我有 3 个不同的位掩码。我希望位掩码#1 在触及位掩码#3 时打印“a”。我希望位掩码#2 在触及位掩码#1 时打印“e”。如何检测哪些位掩码相互接触以区分结果?
      【解决方案3】:

      这会将 firstBody 设置为较小的位掩码,并将 secondBody 设置为较大的位掩码

              var firstBody = SKPhysicsBody()
              var secondBody = SKPhysicsBody()
      
              if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
                  firstBody = contact.bodyA
                  secondBody = contact.bodyB
              }else{
                  firstBody = contact.bodyB
                  secondBody = contact.bodyA
              }
      

      假设 bitmask1 小于 2 和 3。

              if firstBody.categoryBitMask == bitMask1 && secondBody.categoryBitMask == bitMask.bitmask3 {
                  print("a")
      
              //If ball hits a pad, activate the pad
              }else if firstBody.categoryBitMask == bitMask1 && secondBody.categoryBitMask == bitMask.bitmask2 {
                  print("e")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多