区分不同的位掩码
Differentiating Between Different Bitmasks
我无法弄清楚如何区分不同的位掩码。
我希望这发生:
/*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"
您的 if 语句中缺少一个 =。
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == enemy2Category) {
print("contact between 1 and 2")
}
}
有一篇文档文章试图解释 Sprite-Kit 碰撞和接触中使用的位掩码,但我无法再对它进行 link。尝试找到 'Documentation' 页面,标记 'Sprite-Kit' 然后 'SKNode Collision' 下的 'Manipulating contactTest and collison bitmasks to enable/disable specific contact and collisions.' 文章。
一个明显的问题是这一行:
let enemy3Category: UInt32 = 3
所有位掩码都被认为是二进制,二进制3是11。这是'1'位和'2'位都被设置为1 . 类别定义 应仅将 1 位设置为 1,您可以通过对类别使用 2 的精确幂来确保这一点 - 1、2、4、8、16、32 等。
场景中需要 collide/contact 的对象最初应该只属于一个类别。对于更高级的接触和碰撞,一个精灵可以属于多个类别。
这会将 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
}
假设位掩码 1 小于 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")
}
我无法弄清楚如何区分不同的位掩码。
我希望这发生:
/*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"
您的 if 语句中缺少一个 =。
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == enemy2Category) {
print("contact between 1 and 2")
}
}
有一篇文档文章试图解释 Sprite-Kit 碰撞和接触中使用的位掩码,但我无法再对它进行 link。尝试找到 'Documentation' 页面,标记 'Sprite-Kit' 然后 'SKNode Collision' 下的 'Manipulating contactTest and collison bitmasks to enable/disable specific contact and collisions.' 文章。
一个明显的问题是这一行:
let enemy3Category: UInt32 = 3
所有位掩码都被认为是二进制,二进制3是11。这是'1'位和'2'位都被设置为1 . 类别定义 应仅将 1 位设置为 1,您可以通过对类别使用 2 的精确幂来确保这一点 - 1、2、4、8、16、32 等。
场景中需要 collide/contact 的对象最初应该只属于一个类别。对于更高级的接触和碰撞,一个精灵可以属于多个类别。
这会将 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
}
假设位掩码 1 小于 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")
}