sprite-kit
SKNode टक्कर
खोज…
टिप्पणियों
स्प्राइट किट टक्कर और संपर्क घटना प्रसंस्करण के निर्धारकों संबंध सेटिंग्स, के, आप के द्वारा बनाई गई हैं categoryBitMask
, collisionBitMask
और contactTestBitMask
अपने बातचीत वस्तु प्रकारों में से प्रत्येक के लिए। संपर्कों और टकरावों से अपने वांछित परिणामों की सेवा में तर्कसंगत रूप से इन्हें निर्धारित करके, आप यह निर्धारित करते हैं कि कौन से प्रकार टकरा सकते हैं और दूसरों के साथ संपर्कों की सूचना दे सकते हैं, और अवांछित टकराव, संपर्क और भौतिकी प्रसंस्करण के ऊपरी हिस्से से बच सकते हैं।
प्रत्येक प्रकार की 'इकाई' के लिए आप तीनों सेट कर सकते हैं:
-
categoryBitMask
: इस प्रकार के नोड के लिए विशिष्ट श्रेणी -
collisionBitMask
: एक टक्कर विभेदक, ऊपर से अलग हो सकता है -
contactTestBitMask
: एक संपर्क विभेदक, ऊपर से दोनों से भिन्न हो सकता है
टकराव और संपर्कों को लागू करने के लिए सामान्य कदम हैं:
- भौतिक शरीर का आकार, आकार और (कभी-कभी) द्रव्यमान निर्धारित करें
- ऊपर श्रेणी, टकराव और संपर्क से अपने नोड प्रकार के लिए आवश्यक बिटमैक्स जोड़ें
- एक संपर्क प्रतिनिधि के रूप में दृश्य सेट करें यह टकराव और संपर्कों की जांच करने और सूचित करने में सक्षम बनाता है
- भौतिकी की घटनाओं के लिए संपर्क संचालकों और किसी अन्य प्रासंगिक तर्क को लागू करें
भौतिकी विश्व को सक्षम करें
// World physics
self.physicsWorld.gravity = CGVectorMake(0, -9.8);
कॉल करने के लिए नोड सक्षम करें
सबसे पहले, हम नोड श्रेणी निर्धारित करते हैं
let groundBody: UInt32 = 0x1 << 0
let boxBody: UInt32 = 0x1 << 1
फिर ग्राउंड टाइप नोड और बॉक्स टाइप नोड जोड़ें।
let ground = SKSpriteNode(color: UIColor.cyanColor(), size: CGSizeMake(self.frame.width, 50))
ground.position = CGPointMake(CGRectGetMidX(self.frame), 100)
ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size)
ground.physicsBody?.dynamic = false
ground.physicsBody?.categoryBitMask = groundBody
ground.physicsBody?.collisionBitMask = boxBody
ground.physicsBody?.contactTestBitMask = boxBody
addChild(ground)
// Add box type node
let box = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(20, 20))
box.position = location
box.physicsBody = SKPhysicsBody(rectangleOfSize: box.size)
box.physicsBody?.dynamic = true
box.physicsBody?.categoryBitMask = boxBody
box.physicsBody?.collisionBitMask = groundBody | boxBody
box.physicsBody?.contactTestBitMask = boxBody
box.name = boxId
let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)
box.runAction(SKAction.repeatActionForever(action))
self.addChild(box)
संपर्क संभालें
प्रतिनिधि के रूप में दृश्य सेट करें
//set your scene as SKPhysicsContactDelegate
class yourScene: SKScene, SKPhysicsContactDelegate
self.physicsWorld.contactDelegate = self;
फिर आपको संपर्क कार्यों में से एक या दूसरे को लागू करना होगा: वैकल्पिक फंक डिबगिन (संपर्क :) और / या वैकल्पिक निधि didEnd (संपर्क :) अपने संपर्क तर्क में भरने के लिए विधि जैसे
//order
let bodies = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? (A:contact.bodyA,B:contact.bodyB) : (A:contact.bodyB,B:contact.bodyA)
//real handler
if ((bodies.B.categoryBitMask & boxBody) == boxBody){
if ((bodies.A.categoryBitMask & groundBody) == groundBody) {
let vector = bodies.B.velocity
bodies.B.velocity = CGVectorMake(vector.dx, vector.dy * 4)
}else{
let vector = bodies.A.velocity
bodies.A.velocity = CGVectorMake(vector.dx, vector.dy * 10)
}
}
वैकल्पिक किया
यदि आप सरल श्रेणियों का उपयोग कर रहे हैं, तो प्रत्येक भौतिक विज्ञान में केवल एक श्रेणी का शरीर है, तो इस वैकल्पिक रूप से किया गया BBeginContact अधिक पठनीय हो सकता है:
func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case categoryBitMask.player | categoryBitMask.enemy:
print("Collision between player and enemy")
let enemyNode = contact.bodyA.categoryBitMask == categoryBitMask.enemy ? contact.bodyA.node! : contact.bodyB.node!
enemyNode.explode()
score += 10
case categoryBitMask.enemy | categoryBitMask.enemy:
print("Collision between enemy and enemy")
contact.bodyA.node.explode()
contact.bodyB.node.explode()
default :
//Some other contact has occurred
print("Some other contact")
}
}
टकराव, संपर्क और स्पर्श घटनाओं को दिखाने वाला साधारण स्प्राइट किट प्रोजेक्ट।
यहाँ एक सरल स्प्राइट-किट GameScene.swift है। एक नया, खाली स्प्रिटकिट प्रोजेक्ट बनाएं और इसके साथ GameScene.swift को बदलें। फिर बनाएँ और चलाएँ।
उन्हें ले जाने के लिए स्क्रीन पर किसी भी ऑब्जेक्ट पर क्लिक करें। लॉग और टिप्पणियों की जाँच करें कि कौन सा टकराता है और कौन से संपर्क बनाते हैं।
//
// GameScene.swift
// bounceTest
//
// Created by Stephen Ives on 05/04/2016.
// Copyright (c) 2016 Stephen Ives. All rights reserved.
//
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
let objectSize = 150
let initialImpulse: UInt32 = 300 // Needs to be proportional to objectSize
//Physics categories
let purpleSquareCategory: UInt32 = 1 << 0
let redCircleCategory: UInt32 = 1 << 1
let blueSquareCategory: UInt32 = 1 << 2
let edgeCategory: UInt32 = 1 << 31
let purpleSquare = SKSpriteNode()
let blueSquare = SKSpriteNode()
let redCircle = SKSpriteNode()
override func didMove(to view: SKView) {
physicsWorld.gravity = CGVector(dx: 0, dy: 0)
//Create an boundary else everything will fly off-screen
let edge = frame.insetBy(dx: 0, dy: 0)
physicsBody = SKPhysicsBody(edgeLoopFrom: edge)
physicsBody?.isDynamic = false //This won't move
name = "Screen_edge"
scene?.backgroundColor = SKColor.black
// Give our 3 objects their attributes
blueSquare.color = SKColor.blue
blueSquare.size = CGSize(width: objectSize, height: objectSize)
blueSquare.name = "shape_blueSquare"
blueSquare.position = CGPoint(x: size.width * -0.25, y: size.height * 0.2)
let circleShape = SKShapeNode(circleOfRadius: CGFloat(objectSize))
circleShape.fillColor = SKColor.red
redCircle.texture = view.texture(from: circleShape)
redCircle.size = CGSize(width: objectSize, height: objectSize)
redCircle.name = "shape_redCircle"
redCircle.position = CGPoint(x: size.width * 0.4, y: size.height * -0.4)
purpleSquare.color = SKColor.purple
purpleSquare.size = CGSize(width: objectSize, height: objectSize)
purpleSquare.name = "shape_purpleSquare"
purpleSquare.position = CGPoint(x: size.width * -0.35, y: size.height * 0.4)
addChild(blueSquare)
addChild(redCircle)
addChild(purpleSquare)
redCircle.physicsBody = SKPhysicsBody(circleOfRadius: redCircle.size.width/2)
blueSquare.physicsBody = SKPhysicsBody(rectangleOf: blueSquare.frame.size)
purpleSquare.physicsBody = SKPhysicsBody(rectangleOf: purpleSquare.frame.size)
setUpCollisions()
checkPhysics()
}
func setUpCollisions() {
//Assign our category bit masks to our physics bodies
purpleSquare.physicsBody?.categoryBitMask = purpleSquareCategory
redCircle.physicsBody?.categoryBitMask = redCircleCategory
blueSquare.physicsBody?.categoryBitMask = blueSquareCategory
physicsBody?.categoryBitMask = edgeCategory // This is the edge for the scene itself
// Set up the collisions. By default, everything collides with everything.
redCircle.physicsBody?.collisionBitMask &= ~purpleSquareCategory // Circle doesn't collide with purple square
purpleSquare.physicsBody?.collisionBitMask = 0 // purpleSquare collides with nothing
// purpleSquare.physicsBody?.collisionBitMask |= (redCircleCategory | blueSquareCategory) // Add collisions with red circle and blue square
purpleSquare.physicsBody?.collisionBitMask = (redCircleCategory) // Add collisions with red circle
blueSquare.physicsBody?.collisionBitMask = (redCircleCategory) // Add collisions with red circle
// Set up the contact notifications. By default, nothing contacts anything.
redCircle.physicsBody?.contactTestBitMask |= purpleSquareCategory // Notify when red circle and purple square contact
blueSquare.physicsBody?.contactTestBitMask |= redCircleCategory // Notify when blue square and red circle contact
// Make sure everything collides with the screen edge and make everything really 'bouncy'
enumerateChildNodes(withName: "//shape*") { node, _ in
node.physicsBody?.collisionBitMask |= self.edgeCategory //Add edgeCategory to the collision bit mask
node.physicsBody?.restitution = 0.9 // Nice and bouncy...
node.physicsBody?.linearDamping = 0.1 // Nice and bouncy...
}
//Lastly, set ourselves as the contact delegate
physicsWorld.contactDelegate = self
}
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case purpleSquareCategory | blueSquareCategory:
print("Purple square and Blue square have touched")
case redCircleCategory | blueSquareCategory:
print("Red circle and Blue square have touched")
case redCircleCategory | purpleSquareCategory:
print("Red circle and purple Square have touched")
default: print("Unknown contact detected")
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let touchedNode = selectNodeForTouch(touch.location(in: self))
if let node = touchedNode {
node.physicsBody?.applyImpulse(CGVector(dx: CGFloat(arc4random_uniform(initialImpulse)) - CGFloat(initialImpulse/2), dy: CGFloat(arc4random_uniform(initialImpulse)) - CGFloat(initialImpulse/2)))
node.physicsBody?.applyTorque(CGFloat(arc4random_uniform(20)) - CGFloat(10))
}
}
}
// Return the sprite where the user touched the screen
func selectNodeForTouch(_ touchLocation: CGPoint) -> SKSpriteNode? {
let touchedNode = self.atPoint(touchLocation)
print("Touched node is \(touchedNode.name)")
// let touchedColor = getPixelColorAtPoint(touchLocation)
// print("Touched colour is \(touchedColor)")
if touchedNode is SKSpriteNode {
return (touchedNode as! SKSpriteNode)
} else {
return nil
}
}
//MARK: - Analyse the collision/contact set up.
func checkPhysics() {
// Create an array of all the nodes with physicsBodies
var physicsNodes = [SKNode]()
//Get all physics bodies
enumerateChildNodes(withName: "//.") { node, _ in
if let _ = node.physicsBody {
physicsNodes.append(node)
} else {
print("\(node.name) does not have a physics body so cannot collide or be involved in contacts.")
}
}
//For each node, check it's category against every other node's collion and contctTest bit mask
for node in physicsNodes {
let category = node.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let name = node.name != nil ? node.name! : "Category \(category)"
let collisionMask = node.physicsBody!.collisionBitMask
let contactMask = node.physicsBody!.contactTestBitMask
// If all bits of the collisonmask set, just say it collides with everything.
if collisionMask == UInt32.max {
print("\(name) collides with everything")
}
for otherNode in physicsNodes {
if (node.physicsBody?.dynamic == false) {
print("This node \(name) is not dynamic")
}
if (node != otherNode) && (node.physicsBody?.isDynamic == true) {
let otherCategory = otherNode.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let otherName = otherNode.name != nil ? otherNode.name! : "Category \(otherCategory)"
// If the collisonmask and category match, they will collide
if ((collisionMask & otherCategory) != 0) && (collisionMask != UInt32.max) {
print("\(name) collides with \(otherName)")
}
// If the contactMAsk and category match, they will contact
if (contactMask & otherCategory) != 0 {print("\(name) notifies when contacting \(otherName)")}
}
}
}
}
}
बहु श्रेणी स्प्रिट से निपटने के लिए संपर्क करने के लिए वैकल्पिक
let bodies = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? (A:contact.bodyA,B:contact.bodyB) : (A:contact.bodyB,B:contact.bodyA)
switch (bodies.A.categoryBitMask,bodies.B.categoryBitMask)
{
case let (a, _) where (a && superPower): //All we care about is if category a has a super power
//do super power effect
fallthrough //continue onto check if we hit anything else
case let (_, b) where (b && superPower): //All we care about is if category b has a super power
//do super power effect
fallthrough //continue onto check if we hit anything else
case let (a, b) where (a && groundBody) && (b && boxBody): //Check if box hit ground
//boxBody hit ground
case let (b, _) where (b && boxBody): //Check if box hit anything else
//box body hit anything else
default:()
}
संपर्कों और टकराव के बीच अंतर
स्प्राइट-किट में, टकराव की अवधारणा है जो एसके भौतिकी इंजन को संदर्भित करती है जो यह बताती है कि भौतिकी की वस्तुएं कैसे टकराती हैं जब वे टकराते हैं यानी जो दूसरे को उछालते हैं।
इसमें संपर्कों की अवधारणा भी है, जो कि वह तंत्र है जिसके द्वारा आपके कार्यक्रम को सूचित किया जाता है जब 2 भौतिकी ऑब्जेक्ट्स प्रतिच्छेद करते हैं।
ऑब्जेक्ट टकरा सकते हैं, लेकिन संपर्क उत्पन्न नहीं कर सकते, बिना टकराने के संपर्क उत्पन्न कर सकते हैं, या टकरा सकते हैं और संपर्क उत्पन्न कर सकते हैं (या न तो और न ही अंतःक्रिया करें)
टकराव भी एक तरफा हो सकते हैं अर्थात ऑब्जेक्ट A टकरा सकता है (ऑब्जेक्ट को उछाल सकता है), जबकि ऑब्जेक्ट B को ले जाता है, हालांकि ऐसा कुछ भी नहीं हुआ था। यदि आप एक दूसरे को उछालने के लिए 2 ऑब्जेक्ट चाहते हैं, तो उन्हें दोनों को एक दूसरे से टकराने के लिए कहा जाना चाहिए।
संपर्क हालांकि एकतरफा नहीं हैं; यदि आप यह जानना चाहते हैं कि ऑब्जेक्ट A स्पर्श वाली (कॉन्टैक्टेड) ऑब्जेक्ट B है, तो ऑब्जेक्ट B के संबंध में ऑब्जेक्ट A पर संपर्क का पता लगाने के लिए पर्याप्त है। आपको ऑब्जेक्ट A के लिए ऑब्जेक्ट B पर संपर्क का पता लगाने की आवश्यकता नहीं है।
विशिष्ट संपर्क और टकरावों को सक्षम / अक्षम करने के लिए कॉन्टैक्टटेस्ट और कोलिसन बिटकॉम्स को जोड़ते हुए।
इस उदाहरण के लिए, हम 4 निकायों का उपयोग करेंगे और सादगी के लिए बिट मास्क के केवल अंतिम 8 बिट्स दिखाएंगे। 4 निकाय 3 SKSpriteNodes हैं, जिनमें से प्रत्येक एक भौतिक शरीर और एक सीमा है:
let edge = frame.insetBy(dx: 0, dy: 0)
physicsBody = SKPhysicsBody(edgeLoopFrom: edge)
ध्यान दें कि 'एज' भौतिकी शरीर दृश्य का भौतिक शरीर है, नोड नहीं।
हम 4 अद्वितीय श्रेणियों को परिभाषित करते हैं
let purpleSquareCategory: UInt32 = 1 << 0 // bitmask is ...00000001
let redCircleCategory: UInt32 = 1 << 1 // bitmask is ...00000010
let blueSquareCategory: UInt32 = 1 << 2 // bitmask is ...00000100
let edgeCategory: UInt32 = 1 << 31 // bitmask is 10000...00000000
प्रत्येक भौतिकी निकाय को वह श्रेणियां सौंपी जाती हैं जो इसके अंतर्गत आती हैं:
//Assign our category bit masks to our physics bodies
purpleSquare.physicsBody?.categoryBitMask = purpleSquareCategory
redCircle.physicsBody?.categoryBitMask = redCircleCategory
blueSquare.physicsBody?.categoryBitMask = blueSquareCategory
physicsBody?.categoryBitMask = edgeCategory // This is the edge for the scene itself
यदि किसी बॉडी के टकराव में बिटबैमस्क 1 पर सेट होता है, तो यह किसी भी बॉडी से टकराता है (उछलता है) जिसकी श्रेणीबिटमास्क में समान स्थिति में '1' है। इसी तरह contactTestBitMask के लिए।
जब तक आप अन्यथा निर्दिष्ट नहीं करते हैं, तब तक सब कुछ सब कुछ के साथ टकराता है और कोई संपर्क उत्पन्न नहीं होता है (आपके कोड को तब सूचित नहीं किया जाएगा जब कुछ और कुछ भी संपर्क करता है):
purpleSquare.physicsBody.collisonBitMask = 11111111111111111111111111111111 // 32 '1's.
प्रत्येक स्थिति में प्रत्येक बिट '1' है, इसलिए जब किसी अन्य श्रेणीबिटमास्क की तुलना में, स्प्राइट किट में '1' मिलेगा तो टक्कर होगी। यदि आप नहीं चाहते हैं कि यह निकाय एक निश्चित श्रेणी से टकराए, तो आपको कोलिसिट बिटकैश में सही बिट सेट करना होगा '0'
और इसका contactTestbitMask
सभी 0
s पर सेट है:
redCircle.physicsBody.contactTestBitMask = 00000000000000000000000000000000 // 32 '0's
टकराव के अलावा के रूप में ही, उलट को छोड़कर।
निकायों के बीच संपर्क या टकराव को बंद किया जा सकता है (मौजूदा संपर्क या टक्कर को अपरिवर्तित छोड़कर) का उपयोग करते हुए:
nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
हम तार्किक रूप से और नोडा के टक्कर बिट मास्क को व्युत्क्रम (तार्किक नहीं, ~ ऑपरेटर) के साथ नोडबी की श्रेणी बिटमास्क को उस बिट नोड के बिटमास्क को 'बंद' करने के लिए करते हैं। लाल वर्ग को बैंगनी वर्ग से टकराने से रोकने के लिए उदाहरण:
redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~purpleSquareCategory
जिसे छोटा किया जा सकता है:
redCircle.physicsBody?.collisionBitMask &= ~purpleSquareCategory
स्पष्टीकरण:
redCircle.physicsBody.collisonBitMask = 11111111111111111111111111111111
purpleSquareCategory = 00000000000000000000000000000001
~purpleSquareCategory = 11111111111111111111111111111110
11111111111111111111111111111111 & 11111111111111111111111111111110 = 11111111111111111111111111111110
redCircle.physicsBody.collisonBitMask now equals 11111111111111111111111111111110
RedCircle अब निकायों के साथ टकराता है .... 0001 (बैंगनी रंग)
अलग-अलग बिट्स को कोलशेंबामैस्क में बंद करने के बजाय, आप इसे सीधे सेट कर सकते हैं:
blueSquare.physicsBody?.collisionBitMask = (redCircleCategory | purpleSquareCategory)
यानि blueSquare.physicsBody?.collisionBitMask = (....00000010 OR ....00000001)
जो blueSquare.physicsBody?.collisionBitMask = ....00000011
बराबर होता है। blueSquare.physicsBody?.collisionBitMask = ....00000011
BlueSquare केवल श्रेणी या ..01 या ..10 वाले निकायों से टकराएगा
किसी भी बिंदु पर 2 निकायों के बीच संपर्क या टकराव चालू (बिना किसी मौजूदा संपर्क या टकराव को प्रभावित किए) किया जा सकता है:
redCircle.physicsBody?.contactTestBitMask |= purpleSquareCategory
हम तार्किक रूप से और RedCircle के बिटमास्क को पर्पलसक्वेयर की श्रेणी बिटमास्क के साथ 'बिट ऑन' करते हैं जो कि रेडक्रैक्ले के बिटमास्क में है। यह किसी भी अन्य बिट्स को RedCircel के बिटमास में अप्रभावित छोड़ देता है।
आप यह सुनिश्चित कर सकते हैं कि हर आकृति एक स्क्रीन बढ़त को 'बंद' कर देती है:
// Make sure everything collides with the screen edge
enumerateChildNodes(withName: "//*") { node, _ in
node.physicsBody?.collisionBitMask |= self.edgeCategory //Add edgeCategory to the collision bit mask
}
ध्यान दें:
टकराव एकतरफा हो सकते हैं अर्थात ऑब्जेक्ट A टकरा सकता है (ऑब्जेक्ट को उछाल सकता है), जबकि ऑब्जेक्ट B को ले जाता है, हालांकि ऐसा कुछ भी नहीं हुआ है। यदि आप एक दूसरे को उछालने के लिए 2 ऑब्जेक्ट चाहते हैं, तो उन्हें दोनों को एक दूसरे से टकराने के लिए कहा जाना चाहिए:
blueSquare.physicsBody?.collisionBitMask = redCircleCategory
redcircle.physicsBody?.collisionBitMask = blueSquareCategory
संपर्क हालांकि एकतरफा नहीं हैं; यदि आप यह जानना चाहते हैं कि ऑब्जेक्ट A स्पर्श वाली (कॉन्टैक्टेड) ऑब्जेक्ट B है, तो ऑब्जेक्ट B के संबंध में ऑब्जेक्ट A पर संपर्क का पता लगाने के लिए पर्याप्त है। आपको ऑब्जेक्ट A के लिए ऑब्जेक्ट B पर संपर्क का पता लगाने की आवश्यकता नहीं है।
blueSquare.physicsBody?.contactTestBitMask = redCircleCategory
हमें redcircle.physicsBody?.contactTestBitMask= blueSquareCategory
आवश्यकता नहीं है redcircle.physicsBody?.contactTestBitMask= blueSquareCategory
उन्नत उपयोग:
यहां कवर नहीं किया गया है, लेकिन भौतिकी निकाय एक से अधिक श्रेणी के हैं। उदाहरण के लिए, हम अपने गेम को इस प्रकार सेट कर सकते हैं:
let squareCategory: UInt32 = 1 << 0 // bitmask is ...00000001
let circleCategory: UInt32 = 1 << 1 // bitmask is ...00000010
let blueCategory: UInt32 = 1 << 2 // bitmask is ...00000100
let redCategory: UInt32 = 1 << 3 // bitmask is ...00001000
let purpleCategory: UInt32 = 1 << 4 // bitmask is ...00010000
let edgeCategory: UInt32 = 1 << 31 // bitmask is 10000...0000000
प्रत्येक भौतिकी निकाय को वह श्रेणियां सौंपी जाती हैं जो इसके अंतर्गत आती हैं:
//Assign our category bit masks to our physics bodies
purpleSquare.physicsBody?.categoryBitMask = squareCategory | purpleCategory
redCircle.physicsBody?.categoryBitMask = circleCategory | redCategory
blueSquare.physicsBody?.categoryBitMask = squareCategory | blueCategory
उनकी श्रेणी के नाम अब हैं:
purpleSquare.physicsBody?.categoryBitMask = ...00010001
redCircle.physicsBody?.categoryBitMask = ...00001010
blueSquare.physicsBody?.categoryBitMask = ...00000101
यह प्रभावित करेगा कि आप बिट फ़ील्ड में कैसे हेरफेर करते हैं। यह उपयोगी हो सकता है (उदाहरण के लिए) यह इंगित करने के लिए कि एक भौतिक शरीर (जैसे एक बम) किसी भी तरह बदल गया है (उदाहरण के लिए यह 'सुपर' क्षमता प्राप्त कर सकता है जो एक अन्य श्रेणी है, और आप जांच सकते हैं कि एक निश्चित वस्तु (एक विदेशी मां)