ios - 相同类别的 SpriteKit/SKPhysics radialGravityField 总是相互吸引?

标签 ios swift sprite-kit skphysicsbody skfieldnode

尝试在 SpriteKit 中使用径向重力场时遇到问题

我不希望同类对象(由categoryBitMask定义)相互吸引

这是我的做法:

struct PhyscisCategory {
    static let None : UInt32 = 0
    static let All : UInt32 = UInt32.max
    static let Star : UInt32 = 0b1
    static let Planet : UInt32 = 0b10
}
<....>
 Planet1.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet1.physicsBody!.fieldBitMask = PhyscisCategory.Star

 Planet2.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet2.physicsBody!.fieldBitMask = PhyscisCategory.Star

无论我尝试什么,行星总是相互吸引(除非我将 fieldBitMask 设置为 0,但它们当然也不再被 Star 吸引)!我期望这两行代码只有恒星重力场才会对行星产生影响......

来自文档:

“字段位掩码: 定义哪些类别的物理场可以对该物理体施加力的掩码。 当物理体位于 SKFieldNode 对象的区域内时,该场节点的 categoryBitMask 属性通过执行逻辑 AND 运算与该物理体的 fieldBitMask 属性进行比较。如果结果是非零值,则场节点的效果将应用于物理体。”

我做错了什么吗?

最佳答案

你的面具坏了。在二进制中,它们看起来像这样:

0000 0000 1011 0001 (stars)
0000 1011 0001 0000 (planets)

这两者的逻辑 AND 产生一个非零值:

0000 0000 0001 0000

因此,如果 SpriteKit 评估您星球的字段位掩码与另一个星球的类别位掩码,它们将相互吸引。试试这些面具:

static let Star : uint32_t = 0x1 << 0
static let Planet : uint32_t = 0x1 << 1

(不确定那是否是有效的 swift 代码,但你明白了)。您可以通过始终向左移动一位来扩展掩码。如果被 AND 编辑,这些掩码将始终产生零值。

关于ios - 相同类别的 SpriteKit/SKPhysics radialGravityField 总是相互吸引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32740601/

相关文章:

ios - 我无法从 App Store Connect 和 Xcode 下载 dSYM 文件

objective-c - Objective C - dealloc 委托(delegate)上的调用方法

ios - native ios 应用程序的 Django 模板

ios - 关于 sender.tag 按钮

ios - SpriteKit,使用加速度计返回前景时, Sprite 移动得非常快

ios - 如何停止/取消 PlaySoundFileNamed?

ios - self.scene.view.paused = YES 在更新中

ios - 如何在纵向方向上关闭 UISplitController 的模态呈现

ios - 如何从 firebase 错误中获取更多信息?

json - 在 Swift 中映射复杂的 JSON 模型?