【问题标题】:How can I position two SKSpritenodes on top of each other, if they both have an SKPhysicsBody set?如果两个 SKSpritenode 都设置了 SKPhysicsBody,我如何将它们放在彼此之上?
【发布时间】:2020-08-04 05:36:50
【问题描述】:

我在一个简单的游戏上工作,处于初学者的水平。我有插槽,每个插槽有五个球。

这个想法是球进入插槽,是的,球的 zPosition 比插槽高一个。但它们都是下面隐形插槽支架的孩子。

如果插槽或球都没有设置physicsBody,则球可以放入插槽。但如果我给他们一个physicsBody,他们就会互相推开。

所以显然我还有一些我不理解的物理属性。如果有人能给我指路吗?

【问题讨论】:

    标签: swift sprite-kit skphysicsbody


    【解决方案1】:

    您在这 2 个物体之间启用了碰撞。

    碰撞由物理引擎处理,当两个物体相互反弹时发生碰撞。设置为碰撞的物体不能占据相同的空间。当它们被设置为碰撞时,将 2 个节点放在彼此的顶部,它们将被推开,直到不再碰撞。

    联系是指您希望在 2 个机构联系时通知您的代码。实体可以设置为接触但不碰撞、碰撞但不接触、碰撞注册接触或两者都不接触。此外,一个物体可以与第二个物体发生碰撞,而第二个物体不会与第一个物体发生碰撞(第二个物体的运动不会受到碰撞的影响,而第一个物体可能会飞走)。

    如果您在创建 Sprite Kit 环境时什么都不做,所有物体之间的碰撞都会启用(所有物体都会从物体上反弹)并且任何物体都不会启用接触(物体接触时您的代码将永远不会被调用),因此在设置期间通常必须关闭 某些碰撞并打开 on 某些接触。

    可以使用以下方法关闭物体之间的碰撞(保持现有碰撞不变):

    nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
    

    我们将 nodeA 的冲突位掩码与 nodeB 的类别位掩码的逆(逻辑非,~ 运算符)逻辑与,以“关闭”该位 nodeA 的位掩码。例如阻止红色圆圈与“插槽”碰撞:

    redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~slotCategory
    

    可以简写为:

    redCircle.physicsBody?.collisionBitMask &= ~slotCategory
    

    这假定 redCircle 和 slotCategory 是您用于节点和类别位掩码的名称。

    这将阻止红色圆圈“反弹”插槽,但不会阻止“插槽”从红色圆圈反弹,因此您可能还需要:

    slotX.physicsBody?.collisionBitMask &= ~circleCategory
    

    对于每个位置并假设每个圈子共享相同的类别。

    更多信息在这里:

    我的碰撞和接触分步指南: https://stackoverflow.com/a/51041474/1430420

    以及碰撞和接触测试位掩码指南: https://stackoverflow.com/a/40596890/1430420

    操作位掩码以关闭和打开单独的碰撞和接触。 https://stackoverflow.com/a/46495864/1430420

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多