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 接触检测的主要内容,如果未能解决你的问题,请参考以下文章

Sprite-Kit 为单个接触注册多个碰撞

Sprite-kit:检测左右触摸

Sprite Kit 从未检测到我的碰撞

Sprite Kit中的碰撞检测未检测到碰撞

检测 Sprite Kit 中的长触摸

Sprite Kit 碰撞检测和物理