簡體   English   中英

SpriteKit 避免兩個節點之間的碰撞

[英]SpriteKit avoid collision between two nodes

期望的行為

在此處輸入圖片說明

  • 紅色節點(玩家手臂)通過固定關節連接到藍色節點。
  • 紅色節點有一個physicsBody因為:1)如果藍色節點移動,它應該移動;2)它應該與世界其他地方碰撞,但不與藍色形狀碰撞
  • 反之亦然:藍色節點(玩家身體)應該與世界其他地方發生碰撞——但顯然不會與紅色節點發生碰撞。

問題

節點和關節設置良好(見左圖),但physicsBody確實相互交互(右圖):

在此處輸入圖片說明

請注意:為了使關節正確,我必須向紅色形狀(玩家手臂)添加一個子節點(圓圈)。 所以我們在這里總共討論三個節點。

最近的嘗試

嘗試了一堆東西。 按照Apples 的文檔這個線程,我了解到這可以通過categoryBitMaskcollisionBitMask的正確組合來解決。

位掩碼:

struct Category {
    static let none: UInt32 = 0
    static let all: UInt32 = UInt32.max
    static let playerBody: UInt32 = 0b1 // 1
    static let playerArm: UInt32 = 0b10 // 2
    static let regularObject: UInt32 = 0b100 // 4
}

🔵 藍色形狀:

body.categoryBitMask = Category.playerBody
body.collisionBitMask = Category.all

🔴紅色形狀(以及它的關節子節點):

body.categoryBitMask = Category.playerArm
body.collisionBitMask = Category.none

……但這並沒有解決問題。

現在連續三天掙扎。 我知道這種問題已經被問過很多次了,但沒有一個能引導我走向正確的方向。 真的很感激任何建議!

這是來自 Apple 文檔:collisionBitMask(但對於 Scenekit,也許在 Spritekit 中是相同的)

這個鍵的值是一個包含 NSUInteger 值的 NSNumber 對象。 SceneKit 僅測試其 categoryBitMask 屬性與此位掩碼重疊的物理體的接觸。 默認值為 all ,指定搜索應測試所有物理體,而不管其類別如何

所以你不應該使用 Category.all

事實證明,我為紅色形狀打開了錯誤的physicsBody ,因此代碼更改影響了錯誤的節點 🤦

它現在基本上按照我在原始問題中描述的方式工作。

但是——如果你和我一樣剛接觸這個話題:我能找到的最好的解釋就是這個(尤其是“問問你自己”部分)。 祝大家編碼愉快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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