2017-08-16 72 views
0

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

我希望这种情况发生:

/*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; 
} 

}

我只是想弄清楚如何检测其位掩码进入相互接触。就像太空飞船1与太空飞船2接触,它会打印太阳,但如果太空飞船1与太空飞船3接触,它会打印“哇”

回答

0

还有就是试图解释位掩码为雪碧-Kit的碰撞和接触使用的文档的文章,但我不能再链接到它。尝试找到'文档'页面,标记'Sprite-Kit',然后'操纵contactTest和collison位掩码来启用/禁用特定的联系和冲突。' “SKNode Collision”下的文章。

一个明显的问题是这样的线:

let enemy3Category: UInt32 = 3 

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

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

0

您在if语句中缺少=。

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

@ G.L。你的接触位掩码设置是否正确?在声明位掩码的位置发布代码。 – TheValyreanGroup

+0

是的,碰撞工作,但我希望它做不同的事情取决于哪个位掩码 –

+0

我会尽力解释我想要更好。 –

0

这设置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 
     } 

Assuiming 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") 
}