Sprite Kit 接触检测
Posted
技术标签:
【中文标题】Sprite Kit 接触检测【英文标题】:Sprite Kit Contact Detection 【发布时间】:2017-04-20 13:59:03 【问题描述】:基本上我有地面、玩家(雷蒙德)和硬币。 当玩家触地时什么都不会发生,游戏会照常进行。当玩家与硬币接触时,我希望它打印到控制台“硬币与玩家接触”。
enum ColliderType: UInt32
case Raymond = 1
case Object = 2
case Coin = 3
雷蒙兹物理学
raymond.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2)
raymond.physicsBody!.dynamic = true
raymond.physicsBody!.categoryBitMask = ColliderType.Raymond.rawValue
raymond.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue
raymond.physicsBody?.collisionBitMask = ColliderType.Object.rawValue
硬币物理
coin.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2)
coin.physicsBody!.dynamic = true
coin.physicsBody!.categoryBitMask = ColliderType.Coin.rawValue
coin.physicsBody?.contactTestBitMask = ColliderType.Raymond.rawValue
coin.physicsBody?.collisionBitMask = ColliderType.Object.rawValue
如果你需要地面物理
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
ground.physicsBody!.dynamic = false
ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
ground.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue
ground.physicsBody?.collisionBitMask = ColliderType.Object.rawValue
这是我的联系功能,我知道它错了,我需要有关如何检测硬币和雷蒙德触摸的帮助。
func didBeginContact(contact: SKPhysicsContact)
print("coin contact with player")
提前致谢。
【问题讨论】:
你能添加更多代码吗,最好是在你陈述物理时 @OrenEdrich 完成。 您没有正确使用位掩码,3 表示 00000000000000000000000000000011 真正表示 Object & Raym0nd。您需要以 2 的幂次方工作,因此下一个可行的数字是 4 (1,2,4,8,16,32) 如果您想让它可读,请使用 (1 【参考方案1】:确实有几种方法可以检查这一点,这里有两种最基本的方法可以帮助您入门。第一个检查联系人的姓名,第二个检查 CategoryBitMask。值得注意的是,如果您的 PhysicsBodies 位掩码设置不正确,则可能永远不会报告 2 个对象之间的接触。
编辑确保场景符合 SKPhysicsContactDelegate
class GameScene: SKScene, SKPhysicsContactDelegate
...
func didBegin(_ contact: SKPhysicsContact)
let contactAName = contact.bodyA.node?.name
let contactBName = contact.bodyB.node?.name
if (contactAName == "raymond") || (contactBName == "raymond")
if (contactAName == "coin") || (contactBName == "coin")
print("coin contact with player")
return
//or
if contact.bodyA.categoryBitMask == ColliderType.Coin || contact.bodyB.categoryBitMask == ColliderType.Coin
if contact.bodyA.categoryBitMask == ColliderType.Raymond || contact.bodyB.categoryBitMask == ColliderType.Raymond
print("coin contact with player")
return
【讨论】:
感谢您的快速回答,我的 Physicsbodies 设置正确吗? 他们似乎是。不过,你最后不需要 rawValue 好吧,好吧,当雷蒙德和硬币接触时,它不会打印到控制台。 检查我的编辑,看起来你的 didBegin 函数有错字 我已经这样了,GameScene 类:SKScene, SKPhysicsContactDelegate以上是关于Sprite Kit 接触检测的主要内容,如果未能解决你的问题,请参考以下文章