swift 如何在SpriteKit中检测两个对象何时接触

vq8itlhq  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(83)

我在互联网上没有找到任何关于如何做到这一点。我只是试图运行一行代码时,物理身体接触。在这种情况下,我有一个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替换第一个主体和第二个主体吗?我不知道该怎么做

ulydmbyx

ulydmbyx1#

我不是一个固执的人,但你不应该以“我在互联网上找不到任何东西”作为问题的开始,因为这显然不是真的。有一百万个关于碰撞检测的教程,作为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

希望这对你有帮助

相关问题