swift - SpriteKit 避免两个节点之间的碰撞
问题描述
期望的行为
- 红色节点(玩家手臂)通过固定关节连接到蓝色节点。
- 红色节点有一个
physicsBody
因为:1)如果蓝色节点移动,它应该移动,2)它应该与世界其他地方碰撞,但不与蓝色形状碰撞 - 反之亦然:蓝色节点(玩家身体)应该与世界其他地方发生碰撞——但显然不会与红色节点发生碰撞。
问题
节点和关节设置良好(见左图),但它们physicsBody
确实相互交互(右图):
请注意:为了获得正确的关节,我必须将一个子节点(圆圈)添加到红色形状(玩家手臂)。所以我们在这里总共讨论三个节点。
最近的尝试
尝试了一堆东西。在Apples 的文档和这个线程之后,我了解到这可以通过正确组合categoryBitMask
和来解决collisionBitMask
。
位掩码:
struct Category {
static let none: UInt32 = 0
static let all: UInt32 = UInt32.max
static let playerBody: UInt32 = 0b1 // 1
static let playerArm: UInt32 = 0b10 // 2
static let regularObject: UInt32 = 0b100 // 4
}
蓝色形状:
body.categoryBitMask = Category.playerBody
body.collisionBitMask = Category.all
红色形状(以及它的关节子节点):
body.categoryBitMask = Category.playerArm
body.collisionBitMask = Category.none
...但这并没有解决问题。
现在连续三天挣扎。我知道这类问题已经被问了很多次,但没有一个能引导我走向正确的方向。非常感谢任何建议!
解决方案
这来自 Apple 文档:collisionBitMask(但对于 Scenekit,可能在 Spritekit 中是一样的)
该键的值是一个包含 NSUInteger 值的 NSNumber 对象。SceneKit 仅测试其 categoryBitMask 属性与此位掩码重叠的物理实体的接触。默认值为 all,指定搜索应测试所有物理实体 ,而不管其类别如何。
所以你不应该使用 Category.all
推荐阅读
- python - 你可以重新训练 RAKE 吗?
- javascript - 我无法停止执行功能
- emacs - 如果所有子 TODO 都已完成,如何归档组织模式 TODO 条目?
- java - 搜索从 @MappedSuperclass 扩展的所有表
- java - 映射 JPA Spring
- mysql - 列 'ip' 不能为空(SQL:插入到 `logins` (`ip`, `steamid`, `time`)
- java - 选择正确的资源包:JAVA SE 8
- python - 根据另一列python pandas的计数用一个填充列
- r - 如何根据R中的条件减去多列
- android - 复制资源/android/icon/mdpi-foreground.png 时出错