仅在矩形物理体的一侧检测碰撞 - Swift3

Posted

技术标签:

【中文标题】仅在矩形物理体的一侧检测碰撞 - Swift3【英文标题】:Detecting collision on only one side of a rectangular physics body - Swift3 【发布时间】:2017-04-28 17:51:06 【问题描述】:

我目前正在使用 Swift3 编写并使用 Spritekit 的 2D 无尽跑步者。

小问题:

有没有办法只检查我角色的矩形物理体右侧的碰撞?

更多信息:

角色运行的平台由拼图组成,用户在游戏进行时在其上构建。相对于背景(从右到左),角色从左到右前进。

我希望角色在与他右侧的一块碰撞时自动跳跃。但是,玩家放在他右侧的任何棋子(与角色的 Y 值相同)与他下方的棋子属于同一类。

因此,只要游戏检测到角色和他下方的棋子之间的碰撞,同样的代码也会让他跳起来。

我还没有找到像我这样的另一个问题,因为通常其他人的角色会与他们的地面类不同类的对象发生碰撞。

谢谢!

附:我试图让我的角色成为具有两个物理主体的 SKSpriteNode,但我找不到任何有用的文档。如果有帮助的话,我的角色还会执行循环运行动画——尽管我无法想象这会伤害任何东西。

【问题讨论】:

【参考方案1】:

您可以通过检测与矩形的碰撞然后确定碰撞是否与您感兴趣的一侧来实现这一点。这是关于如何做到这一点的discussion。祝你好运!

【讨论】:

你甚至不需要做数学计算,你会得到碰撞时的接触点 感谢您的链接,在一次会议粗鲁地打断了我的极客时间之前,我已经简短地阅读了它。我会尽快回复结果! 这很有意义!这似乎与 Alain 的回答相吻合,他和 Knight 一致认为可以在没有提到的数学的情况下抓住这一点,但这让一切都变得非常清楚。谢谢!【参考方案2】:

您是否尝试过将不可见的子节点(例如 feetNode)添加到角色的 sprite 节点并为该子节点提供物理体(类)以用于地板接触?

根据您的其余逻辑,它可能允许您为角色使用不同的物理类,从而在碰撞检测方面具有更大的灵活性。

事实上,您可以在角色的 sprite 节点中对多个子节点使用这种方法,并根据击中的内容对角色进行多种碰撞行为。

【讨论】:

我实际上已经尝试创建一个不可见的节点(alpha = 0),但我不太确定如何将它添加到我的角色节点——特别是在右侧。我曾考虑过,但如果我要这样做,我需要确保节点稍微抬离地面,这样它就不会触发跳跃,对吧? 我已经得到了答案,但我仍然对你的解决方案感到好奇! SKNodes 有一个 children 属性,允许您将其他节点附加到任何节点。这些子节点(子节点)相对于其父节点的锚点定位。因此,如果您在坐标 (x:0,y:-height/2) 处添加子节点,则无论父节点位于何处,您的子节点都将位于其父节点的底部。然后可以将孩子用作检测地板接触的“脚”。 添加另一个子节点(子节点)可以让您从前面(或其他任何地方)检测其他类型的碰撞,而无需检查命中坐标。哪个子节点发生碰撞告诉你它是什么类型的碰撞。 太棒了!今晚我一定会试一试的。非常感谢。【参考方案3】:

一旦你获得了正在碰撞的 2 个物体的接触点,通过检查 categorymasks 确定哪个物体是正在碰撞的物体,然后检查它的 CGPoints x 位置。这个 x 位置可以与另一个物体的 x 位置进行比较,以准确地知道它是从哪一侧发生碰撞的。

如果 Body A 的 x 位置 > Body B 的 x 位置,Body A 在右边,如果不是,它在左边。

就这么简单。 希望这会有所帮助!

【讨论】:

嗯,我实际上不需要左侧检查,但我想我明白你在说什么。那么换句话说,当我检查碰撞点时,如果我的角色的x位置小于它,它就在角色的右侧发生碰撞,然后继续执行跳转代码?同时,让我的游戏在检测到来自下方的碰撞时什么都不做? 看完Moe链接的讨论后,我现在明白了。您的回答对我的理解很有帮助,因为我的速度往往很慢。非常感谢!

以上是关于仅在矩形物理体的一侧检测碰撞 - Swift3的主要内容,如果未能解决你的问题,请参考以下文章

低 SpriteKit FPS 会导致碰撞丢失?

如何检测我在 OnCollisionExit2D() 上退出的对象的哪一侧

android 游戏 碰撞检测

矩形碰撞检测和圆形碰撞检测。

canvas游戏和动画中的碰撞检测

矩形碰撞检测