繁体   English   中英

SpriteKit 避免两个节点之间的碰撞

[英]SpriteKit avoid collision between two nodes

期望的行为

在此处输入图片说明

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

问题

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

在此处输入图片说明

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

最近的尝试

尝试了一堆东西。 按照Apples 的文档这个线程,我了解到这可以通过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

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

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

这是来自 Apple 文档:collisionBitMask(但对于 Scenekit,也许在 Spritekit 中是相同的)

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

所以你不应该使用 Category.all

事实证明,我为红色形状打开了错误的physicsBody ,因此代码更改影响了错误的节点 🤦

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

但是——如果你和我一样刚接触这个话题:我能找到的最好的解释就是这个(尤其是“问问你自己”部分)。 祝大家编码愉快!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM