未检测到 SpriteKit 碰撞
Posted
技术标签:
【中文标题】未检测到 SpriteKit 碰撞【英文标题】:SpriteKit collision not being detected 【发布时间】:2017-10-04 01:13:29 【问题描述】:我有两个节点,一个“猫”和一个“老鼠”,但由于某种原因,我无法检测到它们的碰撞。我正在使用这种方法制作口罩:
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 并让它们变得不同,例如“成分”,那么我可以看到猫和老鼠正在与成分相互作用,但似乎它们只是不会相互作用。
【问题讨论】:
你从来没有给你的节点一个名字,你可以声称你是,但是在提供的代码中,你没有给它们一个名字 节点名从何而来? 我确实为我的节点命名,我只是没有包括抱歉。我编辑了我的问题。但我知道这些名称工作正常,因为我用它们来测试它们是否与其他物理体交互 您的rats
数组来自哪里?参与碰撞的老鼠是否必须在这个数组中才能死亡?
【参考方案1】:
rats
和cats
不会触发相互联系,因为两者都将isDynamic
设置为false
。在触发联系人之前,其中至少一个需要是动态的。
来自https://developer.apple.com/documentation/spritekit/skphysicsbody
isDynamic 属性控制是否基于体积的主体 受重力、摩擦、与其他物体的碰撞以及您直接施加在物体上的力或脉冲的影响。
【讨论】:
我假设ingredients
精灵是动态的,所以当cat
或rat
接触ingredient
时,会为成分生成碰撞和/或接触。
太棒了,一定是它! @SteveIves 你 100% 就在这里,谢谢以上是关于未检测到 SpriteKit 碰撞的主要内容,如果未能解决你的问题,请参考以下文章