![](/img/trans.png)
[英]How can I prevent two types of SpriteKit nodes from colliding with each other?
[英]Objects colliding with each-other when they shouldn't (SpriteKit)
我正在使用SpriteKit和Swift 2 。 我知道有很多教程,但我覺得它們必定已經過時或者我會瘋狂,因為看起來每個人對不同的物理位掩碼都有不同的看法。
我只是試圖讓兩個物體與其他物體碰撞。 這就是我所做的:
var everythingElseCategory: UInt32 = 3
var object1Category: UInt32 = 2
var object2Category: UInt32 = 4
object1.physicsBody?.categoryBitMask = object1;
object1.physicsBody?.collisionBitMask = everythingElseCategory
object2.physicsBody?.categoryBitMask = object2;
object2.physicsBody?.collisionBitMask = everythingElseCategory
everythingElse.physicsBody?.categoryBitMask = everythingElseCategory;
everythingElse.physicsBody?.collisionBitMask = 0 //its a wall
我必須把位掩碼的概念搞砸了,因為對我來說碰撞位掩碼是它碰撞的東西,但似乎我一定是錯的,因為這個解決方案不起作用。 Object2與object1沖突,但object1不與object2沖突!!!?!??!
關於我做錯了什么的想法?
謝謝!
從評論中提出這個問題。
Apple的SpriteKit物理示例可能會引起人們的興趣。
您使用的是整數值,而不是二進制值。 以下是您在二進制文件中的值:
everythingElseCategory = 0011b // I think you need the "b" somewhere to indicate binary
object1Category = 0010b
object2Category = 0100b
基本上,SK physics將在兩個對象上使用&
(binary和)運算符,如果值不為0
,它們將發生沖突。 以你的兩個對象為例:
object1.physicsBody?.categoryBitMask = object1 (0010)
object1.physicsBody?.collisionBitMask = everythingElseCategory (0011)
object2.physicsBody?.categoryBitMask = object2 (0100)
object2.physicsBody?.collisionBitMask = everythingElseCategory (0011)
object1
的位掩碼將與object2
沖突,因為0010 & 0011 == 0010
或非零。 object2
的位掩碼不會與object1
沖突,因為0100 & 0011 == 0000
零或無沖突。
解決這個問題的最簡單方法是使用位移。 語法如下所示:
value = bitValue << placesToShiftLeft
所以你的位掩碼設置看起來像這樣:
everythingElseCategory = 1 << 0 // I have this shifted by 0 just to show that you can do that
object1Category = 1 << 1
object2Category = 1 << 2
現在,當您將位掩碼設置為對象時,請使用|
(二元或)運算符來組合它們。 001 | 010 == 011
001 | 010 == 011
是它的工作原理。
object1.physicsBody?.categoryBitMask = object1Category
object1.physicsBody?.collisionBitMask = everythingElseCategory | object2Category
object2.physicsBody?.categoryBitMask = object2Category
object2.physicsBody?.collisionBitMask = everythingElseCategory | object1Category
everythingElse.physicsBody?.categoryBitMask = everythingElseCategory | object1Category | object2Category
這將防止多個object1
相互碰撞,但允許與其他所有物體發生碰撞。
另一種對碰撞位掩碼進行編碼的方法是記住,默認情況下,它設置為UInt32.max,即一切都與一切相沖突。 如果你想讓一個物體與除了特定物體之外的所有物體發生碰撞,那么它就會更容易與它碰撞,然后關閉代表你不希望它碰撞的物體的比特。
// Assign the category
object1.physicsBody?.categoryBitMask = object1Category
// Turn off collisions with object1 and object2
object1.physicsBody?.collisionBitMask &= ~(object1Category | object2Category)
您可以打開和關閉特定類別的沖突,而不會影響任何其他沖突,如下所示:
// Turn on collisions with object3
object1.physicsBody?.collisionBitMask |= object3Category
// Turn off collisions with object4
object1.physicsBody?.collisionBitMask &= ~object4Category
// Turn on collisions with object 5 & 6
object1.physicsBody?.collisionBitMask |= (object5Category | object6Category)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.