【问题标题】:SpriteKit avoid collision between two nodesSpriteKit 避免两个节点之间的碰撞
【发布时间】:2020-05-24 08:18:03
【问题描述】:

期望的行为

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

问题

节点和关节设置良好(见左),但physicsBody 确实相互交互(右):

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

最近的尝试

尝试了很多东西。在Apples’ documentationthis thread 之后,我了解到这可以通过categoryBitMaskcollisionBitMask 的正确组合来解决。

位掩码:

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

...但这并没有解决问题。

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

【问题讨论】:

标签: swift sprite-kit skspritenode skphysicsbody skscene


【解决方案1】:

这是来自 Apple 文档:collisionBitMask(但对于 Scenekit,可能在 Spritekit 中是一样的)

这个键的值是一个包含 NSUInteger 的 NSNumber 对象 价值。 SceneKit 仅测试与物理实体的接触 categoryBitMask 属性与此位掩码重叠。默认 value 是 all,指定搜索应该测试所有物理实体 无论其类别如何

所以你不应该使用 Category.all

【讨论】:

  • 感谢您的回复——它在 SpriteKit 中的行为似乎有所不同。来自 Apple 文档:Every physics body in a scene can be assigned to up to 32 different categories, each corresponding to a bit in the bit mask. You define the mask values used in your game. In conjunction with the collisionBitMask and contactTestBitMask properties, you define which physics bodies interact with each other and when your game is notified of these interactions.
  • 我认为您对此的解释不正确 - 默认 一切都与一切发生冲突,所以它不会;不管是什么类别和对象,都会发生碰撞。这与说您不应该使用类别不同,因为 a) 您可能想要关闭各种对象之间的碰撞,并且 b) 类别也用于联系人。
【解决方案2】:

原来我为红色形状打开了错误的physicsBody,所以代码更改影响了错误的节点?

它现在基本上按照我在原始问题中描述的方式工作。

但是——如果你像我一样不熟悉这个话题:我能找到的最好的解释是this one(尤其是“问你自己”部分)。祝大家编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2013-07-29
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2022-01-09
    相关资源
    最近更新 更多