如何检测其他 SKSpriteNodes 的子节点的相交节点

Posted

技术标签:

【中文标题】如何检测其他 SKSpriteNodes 的子节点的相交节点【英文标题】:How to detect intersecting nodes of children of other SKSpriteNodes 【发布时间】:2015-03-24 23:54:22 【问题描述】:

希望大家能帮忙。我正在开发棋盘游戏的应用程序。我有六角形的瓷砖,它们被随机调用并在游戏开始时布局。这些瓷砖中的每一个都有四个面,值为 1,另外两个面的值为 2 和 3。

每个图块都是一个 SKSpriteNode,边缘有透明的矩形节点。有 5 种不同类型的图块,它们需要是带有子节点的独立 Sprite,因为除了随机布局之外,它们的区域也随机旋转。所以我需要以编程方式知道哪些瓷砖边缘正在接触其他瓷砖的哪些边缘。

像这样:

https://app.box.com/s/nnym97st3xmrsx979zchowdq1qwsmpoo

(我试图发布我想要完成的工作的图片,但显然我的评分不够高。) ;-)

例如:如果一个“2”碰到一个“3”等等。

我首先尝试了碰撞检测,但当然这只适用于动态、移动的物体。

我尝试了一个 IF 语句来比较其他节点是否正在接触,然后记住了特定于父节点的坐标,所以这不起作用。

然后我尝试了 intersectsNode,但这似乎只适用于同一父节点下的节点。 我目前正在使用 convertPoint 以获得与场景匹配的坐标,从而具有可比性。但我似乎无法让它按我需要的方式工作。

一定有一些我没有看到的简单的东西。有什么想法吗?

【问题讨论】:

【参考方案1】:

当然不简单。

一种解决方案是让所有形状开始时彼此之间稍有间隔。将具有物理体的不可见子节点添加到所有六个侧面,并根据每个物理体的评级(1、2 或 3)为每个物理体分配适当的类别。

当您开始游戏时,使用您喜欢的任何移动方法将所有外部节点移动到适当的位置(侧面接触)。这将为您提供联系信息,因为每个六角边都接触到另一个。联系信息会告诉你哪个边号正在接触它的邻居。

这个想法的确切编码取决于你当前的代码、游戏玩法等......

【讨论】:

有趣。我确实尝试过类似的事情,让子节点在加载时都只移动几个像素,但它没有产生任何结果。最初放置时节点已经重叠,这会阻止碰撞检测吗?如果是这样,我可以通过调整上面的方法并简单地让子节点从十六进制的中心移动到外边缘来调整它。这可能比必须自己移动所有格子更容易。非常感谢你!我会在早上做一个测试。 ;-) @Freedlun - 移动六边形并不难。如果您知道每个人的结束位置,则可以在持续时间内使用 SKAction moveTo x,y。六边形聚集运动甚至可以为您的游戏提供看起来很酷的启动动画。 是的。事实上,这正是我所做的,尽管我是和孩子一起做的。使用 SKActions 我将边缘精灵从 (0, 0) 移动到它们的位置,并且效果很好!检测到接触。现在我可以继续游戏的其他方面了。非常感谢!

以上是关于如何检测其他 SKSpriteNodes 的子节点的相交节点的主要内容,如果未能解决你的问题,请参考以下文章

使用 SKSpritenodes/碰撞检测在 Swift 中自定义类

当他们应该检查是否接触时,SKSpriteNodes会互相反弹

检测 SKSpriteNodes 上的触摸事件

如何检测 SKSpriteNode 和 SKView SpriteKit 之间的冲突

SpriteKit/Objective-C - 节点内的触摸检测

为啥我的 SKSpriteNodes 不会出现在场景中?