为什么我的动态物理体通过我的静态物理体?

时间:2014-10-24 16:40:32

标签: ios xcode swift sprite-kit skphysicsbody

我有一个名为“bo”的动态物理主体和一个名为“leftBumper”的物理主体。当它们碰撞时,我希望保险杠留在原地,我希望Bo从保险杠上弹开。

相反,当它们发生碰撞时,Bo继续移动,保险杠从屏幕上飞出。看来它们都是动态的。这是我的代码:

BO:

    bo.physicsBody?.dynamic = true
    bo.physicsBody?.categoryBitMask = boCategory // 3
    bo.physicsBody?.contactTestBitMask = chainsawCategory // 4
    bo.physicsBody?.collisionBitMask = noneCategory & bumperCategory
    addChild(bo)

保险杠:

 leftBumper.physicsBody?.dynamic = false
    leftBumper.physicsBody = SKPhysicsBody(rectangleOfSize: leftBumper.size)
    leftBumper.physicsBody?.categoryBitMask = bumperCategory
    leftBumper.physicsBody?.collisionBitMask = boCategory

    leftBumper.zPosition = 10

    addChild(leftBumper)

1 个答案:

答案 0 :(得分:1)

这不会起作用:

leftBumper.physicsBody?.dynamic = false
leftBumper.physicsBody = SKPhysicsBody(rectangleOfSize: leftBumper.size)

您可以在physicsBody为零(或上一个正文)的时间设置标志,然后创建一个新的正文实例,默认情况下将动态标志设置为true。首先,创建主体,然后更改其属性。

其次,在设置位掩码之前,尝试在没有它们的情况下使其工作。您应该查看documentation它们的工作原理。位掩码经常被误解。

在这种情况下,bo和bumper都有自己的类别,但是它们不会产生联系事件,因为bo的联系位掩码被设置为保险杠根本不使用的电锯类别。如果您希望它们与碰撞,则bo需要在其接触和碰撞位掩码中具有缓冲器类别,而缓冲器需要在其接触和碰撞位掩码中具有bo类别。