簡體   English   中英

物體在不應該碰撞時彼此碰撞(SpriteKit)

[英]Objects colliding with each-other when they shouldn't (SpriteKit)

我正在使用SpriteKitSwift 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM