【问题标题】:How to detect when two objects touch in SpriteKit如何在 SpriteKit 中检测两个对象何时接触
【发布时间】:2016-04-03 04:28:50
【问题描述】:

我在互联网上没有找到任何关于如何执行此操作的信息。我只是想在物理身体触摸时运行一行代码。在这种情况下,我有一个带有物理主体的 SKSpriteNode 和另一个用于地面的 SKSpriteNode。当他们触摸它时,它应该运行代码行,这就是我到目前为止所发现的全部。

    let catGroup:UInt32 = 0x1 << 0
let groundGroup:UInt32 = 0x2 << 1
    cat.physicsBody?.categoryBitMask = catGroup
    cat.physicsBody?.contactTestBitMask = groundGroup
    ground.physicsBody?.categoryBitMask = groundGroup
    ground.physicsBody?.contactTestBitMask = catGroup

这就是我困惑的地方

    func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var 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==0 && secondBody.categoryBitMask==1 {
        print("contact")
    }

}

所以我应该用 catGroup 和 groundGroup 替换第一个主体和第二个主体吗?我不知道该怎么做

【问题讨论】:

  • 你是否设置了你有 didBeginContact 的类必须到 Physivs Contact Delegate 协议并且你设置了'delegate'属性?之后,在你的 dudBeginContact 中放置一个 print("Contact detected") 以查看它是否被调用(或者更准确地说,设置一个断点)。
  • 您还不能替换 firstBody 和 secondBody,因为您需要检查它们的 categoryBitMask 以找出哪个是猫,哪个是地面。

标签: swift sprite-kit


【解决方案1】:

不要成为一个固执己见的人,但你不应该以“我在互联网上找不到任何东西”作为问题的开头,因为这显然不是真的。作为 SpriteKit 中的基础知识之一,有一百万个关于碰撞检测的教程。

现在回答你的问题。你没有给你的精灵一个真正的物理体,你的物理类别设置得很奇怪。将您的代码更改为此

 struct PhysicsCategory {
       static let cat:UInt32 = 0x1 << 0
       static let ground:UInt32 = 0x1 << 1
 }

 class GameScene: SKScene, SKPhysicsContactDelegate {


     override func didMoveToView(view: SKView) {
     /* Setup your scene here */

         physicsWorld.contactDelegate = self


         cat.physicsBody = SKPhysicsBody(rectangleOfSize: cat.size) // FORGOT THIS
         cat.physicsBody?.categoryBitMask = PhysicsCategory.cat
         cat.physicsBody?.contactTestBitMask = PhysicsCategory.ground

         ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size) // FORGOT THIS
         ground.physicsBody?.categoryBitMask = PhysicsCategory.ground
         ground.physicsBody?.contactTestBitMask = PhysicsCategory.cat // You dont really need this line as long as you have set it on the other body.
    }

    func didBeginContact(contact: SKPhysicsContact) {
         var firstBody: SKPhysicsBody
         var 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 == PhysicsCategory.cat && secondBody.categoryBitMask == PhysicsCategory.ground {
             print("contact")
         }
     } 
 }

如果你不想让你的物体下落,你必须关闭重力,这是默认开启的。

 cat.physicsBody?.affectedByGravity = false
 ground.physicsBody?.affectedByGravity = false

希望对你有帮助

【讨论】:

  • 感谢您的帮助,但它试过了,但没有用。
  • 对不起,物理类别结构中有 1 个小错误,应该是静态让。我更新了整个答案以使其更易于阅读。告诉我进展如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2014-12-07
  • 1970-01-01
相关资源
最近更新 更多