在我的游戏中,当游戏开始时,一些节点已经联系但我找不到如何检测这些联系人。我只能成功检测节点移动时发生的联系,并在游戏过程中使用函数didBeginContact进行联系。
有人知道如何检测这些联系人吗?
如果需要,这是我的didBeginContact:
func didBeginContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
contactsList.append([firstBody.node!,secondBody.node!])
}
}
答案 0 :(得分:1)
我刚刚尝试从一开始就让两个精灵重叠,并为我检测到接触。这是代码:
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")
}
}
但即使没有这个,当游戏第一次启动时,将会打印该消息,因为物理世界会检测到接触。