我有两个节点,一个“猫”和一个“老鼠”,但由于某种原因,我无法检测到他们的碰撞。我正在使用这种方法制作面具:
enum CollisionTypes: UInt32 {
case holder = 1
case chef = 2
case powerups = 4
case ingredients = 8
case utensils = 16
case floor = 32
case bag = 64
case table = 128
case tip = 256
case rat = 512
case cat = 1024
}
这是我初始化他们的物理实体的地方:
// Cat physics body, the node's name is "cat"
public func initializeAt(position: CGPoint) {
sprite.position = position
sprite.zPosition = 5
sprite.name = "cat"
sprite.alpha = 0.7
scene.sceneContent.addChild(sprite)
sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.size)
sprite.physicsBody!.isDynamic = false
sprite.physicsBody!.categoryBitMask = CollisionTypes.cat.rawValue
sprite.physicsBody!.contactTestBitMask = CollisionTypes.rat.rawValue
sprite.physicsBody!.collisionBitMask = CollisionTypes.rat.rawValue
// Rat physics body, the nodes name is "rat"
init() {
node.name = "rat"
node.zPosition = 5
node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
node.physicsBody!.isDynamic = false
node.physicsBody!.categoryBitMask = CollisionTypes.rat.rawValue
node.physicsBody!.contactTestBitMask = CollisionTypes.cat.rawValue
node.physicsBody!.collisionBitMask = CollisionTypes.cat.rawValue
setupFrames()
}
这是我的didBegin()方法。但是,if语句都没有执行,我不知道为什么,因为我在我的项目中使用这个方法来处理其他许多事情。
func didBegin(_ contact: SKPhysicsContact) {
if let node1 = contact.bodyA.node as? SKSpriteNode,
let node2 = contact.bodyB.node as? SKSpriteNode {
if node1.name == "rat" && node2.name == "cat" {
for rat in rats {
if node1 == rat.node {
rat.die()
}
}
Cat.shared.resetPosition()
return
}
else if node1.name == "cat" && node2.name == "rat" {
for rat in rats {
if node2 == rat.node {
rat.die()
}
}
Cat.shared.resetPosition()
return
}
如果我尝试使用contactTestBitMasks并使它们像“成分”一样变得不同,那么我可以看到猫和老鼠正在与成分相互作用,但似乎它们不会互相交互。
答案 0 :(得分:1)
rats
和cats
不会互相触发联系,因为isDynamic
都设置为false
。在触发联系之前,其中至少有一个需要是动态的。
来自https://developer.apple.com/documentation/spritekit/skphysicsbody
isDynamic属性控制是否为基于卷的正文 受重力,摩擦,与其他物体碰撞的影响,以及您直接应用于物体的力或冲动。