无法理解碰撞位掩码的工作原理 [英] Can't understand how collision bit mask works

查看:18
本文介绍了无法理解碰撞位掩码的工作原理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to use collision bit masks and contact test bit masks in Swift, I want two objects not to collide together, so I am doing :

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

由于 SpriteKit 对这两个数字进行 AND 操作,结果不应该是 00,因为 10 &01 = 00 ?

Since SpriteKit does an AND operation on those two numbers, shouldn't the result be 00 since 10 & 01 = 00 ?

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

So why are collisions happening anyway ?

谢谢.

推荐答案

这不是碰撞处理的工作原理.当两个物体相交时,物理引擎在当前物体collisionBitMask和其他物体categoryBitMask之间进行逻辑AND操作:

That is not how collision handling works. When two bodies are in intersection, physics engine performs logical AND operator between current's body collisionBitMask and other's body categoryBitMask:

当两个物理体相互接触时,可能会发生碰撞.将此主体的碰撞掩码与其他主体的类别进行比较通过执行逻辑与运算来屏蔽.如果结果是非零值,这个物体会受到碰撞的影响.每个身体独立选择是否要被对方影响.为了例如,您可以使用它来避免碰撞计算对身体的速度进行微不足道的变化.

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.

来源.

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

So the result depending on how you set categoryBitMask on those two bodies. A default value for categoryBitMask is 0xFFFFFFFF, means all bits set. So when you perform & between 0xFFFFFFFF and 0b10 or 0b01, the result would be non-zero value, thus the collision.

例如,像这样设置你的身体:

So for example, setting your bodies like this:

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

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

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

will give you the result you want. Also, this is probably not the exact setup you need, it is just a simple example, and you will have to change values according to your needs. In this case, spriteA will collide only with bodies which have categoryBitMask set to 0b01. Same goes for spriteB, it will collide with bodies which have categoryBitMask set to 0b10.

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

Also, in the case if you don't want these sprites to be able to collide with anything, simply set their collisionBitMask properties to 0.

这篇关于无法理解碰撞位掩码的工作原理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆