SpriteKit避免两个节点之间的冲突

时间:2020-02-08 11:18:39

标签: swift sprite-kit skspritenode skphysicsbody skscene

期望的行为

enter image description here

  • 红色节点(玩家手臂)通过固定接头连接到蓝色节点。
  • 红色节点有一个physicsBody,因为:1)如果蓝色节点存在,它应该移动; 2)它应该与世界其他地方发生碰撞,但与蓝色形状碰撞
  • 反之亦然:蓝色节点(玩家身体)应与世界其他地方碰撞-但显然不会与红色节点碰撞

问题

节点和关节的设置都很好(见左),但是physicsBody确实可以互相影响(右):

enter image description here

请注意:为了获得正确的关节,我必须在红色形状(玩家手臂)上添加一个子节点(圆圈)。因此,我们在这里谈论总共三个节点。

最近尝试

尝试了一堆东西。在Apples’ documentationthis thread之后,我了解到可以使用categoryBitMaskcollisionBitMask的正确组合来解决。

BitMask:

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

...但是这并不能解决问题。

现在连续三天挣扎。我知道这种问题已经被问过无数次了,但是没有一个引导着我走向正确的方向。非常感谢任何建议!

2 个答案:

答案 0 :(得分:0)

这是来自Apple文档:冲突BitMask(但对于Scenekit,可能在Spritekit中是相同的)

此键的值是一个包含NSUInteger的NSNumber对象 值。 SceneKit仅测试与物理物体之间的接触 categoryBitMask属性与此位掩码重叠。默认值 值是全部,指定搜索应测试所有物理体 不论其类别

因此您不应该使用Category.all

答案 1 :(得分:0)

结果是我为红色形状解开了错误的physicsBody,因此代码更改影响了错误的节点?

现在基本上可以按照我在原始问题中描述的方式进行操作了。

但是-如果您是像我这样的新手,我可以找到的最好的解释是this one(尤其是“问问自己”部分)。祝大家编码愉快!

相关问题