gpt4 book ai didi

swift - 无法理解冲突位掩码的工作原理

转载 作者:IT王子 更新时间:2023-10-29 05:23:38 26 4
gpt4 key购买 nike

我正在尝试在 Swift 中使用碰撞位掩码和接触测试位掩码,我希望两个对象不会碰撞在一起,所以我正在做:

firstNode.physicsBody?.collisionBitMask = 0b01
secondNode?.collisionBitMask = 0b10

由于 SpriteKit 对这两个数字执行 AND 运算,结果不应该是 00 因为 10 & 01 = 00 吗?

那么为什么会发生碰撞呢?

谢谢。

最佳答案

这不是碰撞处理的工作方式。当两个物体相交时,物理引擎在当前物体 collisionBitMask 和其他物体 categoryBitMask 之间执行逻辑 AND 运算符:

When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a nonzero value, this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.

source .

因此结果取决于您如何在这两个主体上设置 categoryBitMaskcategoryBitMask 的默认值为 0xFFFFFFFF,表示已设置所有位。因此,当您在 0xFFFFFFFF0b100b01 之间执行 & 时,结果将是非零值,因此会发生冲突。

例如,像这样设置你的 body :

spriteA.physicsBody?.categoryBitMask = 0b01
spriteA.physicsBody?.collisionBitMask = 0b01

spriteB.physicsBody?.categoryBitMask = 0b10
spriteB.physicsBody?.collisionBitMask = 0b10

会给你想要的结果。此外,这可能不是您需要的确切设置,它只是一个简单的示例,您必须根据需要更改值。在这种情况下,spriteA 只会与 categoryBitMask 设置为 0b01 的物体发生碰撞。 spriteB 也是如此,它会与 categoryBitMask 设置为 0b10 的物体发生碰撞。

此外,如果您不希望这些 Sprite 与任何东西发生碰撞,只需将它们的 collisionBitMask 属性设置为 0。

关于swift - 无法理解冲突位掩码的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39063949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com