2015-10-16 36 views
6

我開始學習使用SpriteKit在iOS上開發Swift2,並且我似乎無法檢測到我是否觸摸了我的Sprite的可見部分。使用SpriteKit檢測Sprite內邊界框(alpha掩碼)內的觸摸

我能找到這點很感動這樣的:

let touchedNode = self.nodeAtPoint(location) 

但這種檢測在精靈的觸摸。我想檢測只在精靈的「不透明」部分觸摸。

我試圖與阿爾法遮掩邊框創建PhysicsBody和測試,如果我選擇的節點的邊界框包含觸摸這樣的位置:

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size) 
sprite.physicsBody?.affectedByGravity = false 
if (touchedNode.containsPoint(location)){ 

但它並沒有幫助。如果我點擊我的精靈的透明部分,事件仍會觸發。

文檔中提到「創建了一個新的物理體,其中包含紋理中具有非零阿爾法值的所有紋理元素」,所以不應該有效嗎?

謝謝你的時間。 PS:我也試圖在我的alpha閾值上更加慷慨,但這也不起作用(如果我的透明度不夠完美)。


UPDATE:

增添了幾分更多的細節,我建立一個關卡編輯器。這意味着我將創建許多節點,具體取決於用戶選擇的內容,並且我需要能夠選擇/移動/旋轉/等這些節點。我實際上使用SKSpriteNodes,因爲我的PNG圖片以這種方式自動添加到xcassette中。我決定使用PhysicsBody的Alpha Mask邊界框,因爲這個值在場景編輯器(Xcode)中顯示,當您選擇一個節點時,並且選中時,Alpha Mask會精確地突出顯示我想要的Sprite的部分檢測內部的觸摸。

如果我使用錯誤的想法/技巧,請告訴我。這是可能的,因爲我只開始使用Swift和SpriteKit。


更新2

我質疑physicsWord(推薦),以得到正確的physicsBody,得到了這樣的連接節點的名稱:

let body = self.physicsWorld.bodyAtPoint(location) 
print(body?.node?.name) 

但是這仍然是印刷節點的名稱,即使我觸摸邊界框外面,這對我來說沒有意義。

謝謝你的幫助。

+0

您是否找到了一種很好的方法來做到這一點? – Confused

回答

2

SKPhysicsBody沒有定義SKNode的界限。您可以通過查詢bodyAtPoint來查詢您場景的SKPhysicsWorld,從而完成命中檢查。這將返回您感興趣的SKPhysicsBody

+0

在我看來,這將避免在房間裏的大象。我做錯了嗎?從邊框(alpha蒙版)檢測場景物體的觸摸有什麼好的做法?我的意思是,這個解決方案顯然是圍繞着一個更基本的問題進行破解,不是嗎?無論如何,謝謝你的耐心。 –

+0

我編輯的答案是更好的,似乎是「正確」的方式來檢測觸摸SKSpriteNodes –

+0

哼,我試着做「self.physicsWorld.bodyAtPoint(位置)」,這返回我的精靈完全一樣的方式,而不是關心即使我的邊界框是正確的(我可以通過移動對象來測試它,它使用alpha掩碼邊界框正確地與其他對象碰撞,我試圖檢測觸摸)。 –