2017-01-01 34 views
0

我現在有什麼:除了boxNode與floorNode接觸外,我當前的大多數Sprite節點碰撞都按照他們應該的方式工作。我有3個精靈節點:floorNode,playerNode和boxNode。當用戶點擊屏幕時,playerNode在空中彈跳,boxNode從天花板上產生並下落,直到與floorNode接觸。斯威夫特3 Sprite節點接觸/碰撞行爲不正常

問題:Im有問題的碰撞是當boxNode與floorNode發生碰撞時。當boxNode與floorNode接觸時,遊戲結束,當發生的一切是boxNode在與floorNode碰撞時消失。

playerNode與floorNode =遊戲碰撞過

boxNode與playerNode =遊戲碰撞過

boxNode與floorNode =(當該碰撞發生時,遊戲結束)碰撞不應導致遊戲結束。

這是我當前的代碼

import UIKit 
import SpriteKit 
import SceneKit 
import Foundation 
import CoreData 
import GameplayKitstruct 

ColliderType { 

static let blueBallCategory: UInt32 = 0x1 << 0 
static let floorNode: UInt32 = 0x1 << 1 
static let firstBody: UInt32 = 0x1 << 2 
static let secondBody: UInt32 = 0x1 << 3 
static let boxNodeCategory: UInt32 = 0x1 << 4 

} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

floorNode.contactTestBitMask = 0 
floorNode.categoryBitMask = ColliderType.floorNodeCategory 
floorNode.collisionBitMask = ColliderType.playerNodeCategory | ColliderType.boxNodeCategory 
self.physicsBody = floorNode 
self.physicsBody?.friction = 0 

playerNode.physicsBody?.categoryBitMask = ColliderType.playerNodeCategory 
playerNode.physicsBody?.contactTestBitMask = 0 
playerNode.physicsBody?.collisionBitMask = ColliderType.floorNodeCategory 

boxNode.physicsBody?.categoryBitMask = ColliderType.boxNodeCategory 
boxNode.physicsBody?.contactTestBitMask = ColliderType.playerNodeCategory | ColliderType.floorNodeCategory 
boxNode.physicsBody?.collisionBitMask = 0 



func didBegin(_ contact:SKPhysicsContact) { 

       let firstBody = contact.bodyA 
       let secondBody = contact.bodyB 


if firstBody.categoryBitMask == ColliderType.playerNodeCategory || secondBody.categoryBitMask == ColliderType.boxNodeCategory{ 

       self.boxNode.removeFromParent() 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 


}else if firstBody.categoryBitMask == ColliderType.floorNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory { 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 

}else if firstBody.categoryBitMask == ColliderType.boxNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory{ 


       self.boxNode.removeFromParent() 



}else if contact.bodyA.categoryBitMask == ColliderType.boxNodeCategory{ 

       contact.bodyA.node!.removeFromParent() 

}else if contact.bodyB.categoryBitMask == ColliderType.boxNodeCategory{ 

       contact.bodyB.node!.removeFromParent() 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 


} 

} 

} 
+0

您的代碼片段令人困惑,因爲縮進被搞砸了(可能在您複製它時),但它看起來也是部分的。請發佈您的完整聯繫人處理委託方法,即, func didBegin(_ contact:SKPhysicsContact){... –

+0

Hi @AliBeadle,我更新了我的代碼並修復了縮進,所以希望現在它更容易閱讀。謝謝您的回覆。 –

回答

0

這個問題似乎已不是事實,該方法didBegin(接觸:) bodyA和bodyB可以以任何順序正確覈算。例如,如果物理體X與物理體Y發生碰撞,則可以使用bodyA = X和bodyB = Y調用方法didBegun(contact :),方法bodyA = Y和bodyB = X。你的代碼需要考慮到這一點,目前它沒有。

具體來說,bodyA是floor和bodyB是box的情況:除了最後一個條件 - 這會終止遊戲,這將失敗。

+0

對不起,遲到了,我在工作上比平常忙。是否有可能創造更多的聯絡機構?例如:讓thirdBody = contact.bodyC。我仍然很快學習,有沒有一種方法可以將bodyA和bodyB分配給特定的病例/情況? –

+0

@ p.dane我不太確定我的理解。請注意,Swift只是語言。 SpriteKit是一個獨立於Swift語言的API提供的精靈,物理體等。每個Sprite都可以有自己的物理體。只要你喜歡,你可以有許多精靈(有物理機構)。每個物理機構都有一個類別 - 類別是32位掩碼,因此您可以有多達32個不同的類別。 –

+0

對於我可能造成的任何混淆,我感到抱歉。你已經提到bodyA和bodyB可以是任意順序。但在這種情況下,bodyA需要分配給指定給boxNode的floorNode和bodyB。有沒有一種方法可以將一個物體分配給特定的節點? –