我只是想提出兩個精靈從一開始重疊,併爲我檢測到接觸。下面是代碼:
import SpriteKit
struct Collider {
static let SmallSquare : UInt32 = 1 << 0
static let BigSquare : UInt32 = 1 << 1
}
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
self.physicsWorld.contactDelegate = self
let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50))
smallSquare.zPosition = 2
smallSquare.position = CGPoint(x: frame.midX, y: frame.midY)
smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size)
smallSquare.physicsBody?.affectedByGravity = false
smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare
smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare
smallSquare.physicsBody?.collisionBitMask = 0
addChild(smallSquare)
let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200))
bigSquare.zPosition = 1
bigSquare.position = CGPoint(x: frame.midX, y: frame.midY)
bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size)
bigSquare.physicsBody?.affectedByGravity = false
bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare
bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare
bigSquare.physicsBody?.collisionBitMask = 0
addChild(bigSquare)
}
func didBeginContact(contact: SKPhysicsContact) {
print("Contact detected")
}
}
後來,適當地檢測某些團體之間的接觸,你應該做這樣的事情:
func didBeginContact(contact: SKPhysicsContact) {
var firstBody, secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 &&
(secondBody.categoryBitMask & Collider.BigSquare != 0)) {
print ("Contact detected")
}
}
但即使沒有,將要打印的消息時遊戲第一次開始,因爲無論如何物理世界都會檢測到接觸。
不錯的問題,我猜sprite節點開始遊戲觸摸不適用於didBeginContact。我認爲你唯一的選擇是didEndContact,但這似乎並不是你想要的。 – Steve
如果didBeginContact被調用2個已經接觸的物體,你測試了嗎?從邏輯上講,我認爲在場景第一遍時,如果物理引擎發現2個物理體重疊,它將調用didBeginContact。然後,它們會將這些物體添加到列表中,如果它們仍然觸摸,則不會在下一個通道中調用didBeginContact,但如果它們不再接觸並將它們從列表中移除,則調用didEndContact。 –
感謝您的回答,不幸的是didBeginContact沒有被調用。我的確如你所說的那樣做了! – Oscar