如何在事件发生后在给定约束内返回 SKSpriteNode?

Posted

技术标签:

【中文标题】如何在事件发生后在给定约束内返回 SKSpriteNode?【英文标题】:How to return the SKSpriteNode within given constraints following an event? 【发布时间】:2017-01-15 12:11:10 【问题描述】:

假设如下:

您的视图中有无数的SKSpriteNodes。 当用户点击屏幕时,您希望位于/靠近特定位置的任何精灵执行动画。

问题:如何确定SKSpriteNode 位于特定位置 不遍历所有精灵?

为此,我实现了一个SKSpriteNodebox,它是透明的,并且具有覆盖特定位置跨度的纹理,并进行相应定位。

SKSpriteNode 方法 containsintersects 看起来很有希望,但要求我分别传递一个点或一个精灵。

问题:我如何获得SKSpriteNode 来报告它与哪个精灵(如果有)相交?同样,没有循环遍历每个精灵。如果两个精灵与 box 相交,则只返回与 box 最显着相交的精灵。

图表: 这不是我的实际用例,但说明了这一点。有很多精灵(比下面显示的更多),并且有一个感兴趣的领域:

如果用户触摸,并且 一个精灵在那个区域

我想知道那里有什么精灵。

【问题讨论】:

等等,所以当用户点击时,可能会发生两件事。他点击了一个精灵,或者他点击了一个虚空,对吗?在第一种情况下,你很好。你得到你的精灵,对吧?所以第二种情况是有问题的,因为您不想循环遍历所有精灵并根据它们与触摸点的距离,返回满足某些标准(距离标准)的第一个节点? 你总是需要遍历所有的精灵。不检查每一个精灵,你怎么知道一个节点是否与盒子相交? 还有几个问题... 1) 当你说 SKSpriteNode 框时,你的意思是你做了象限之类的东西(为了检查与当前象限中可以找到的精灵的交集)? 2)精灵是否改变了它们的位置,例如。从一个象限移动到另一个象限? 3)循环实际上有什么问题,你有性能问题吗?还要记住,与循环遍历整个节点树相比,在数组中包含精灵并循环遍历它会更加简洁。不过,就您而言,这对我来说听起来像是过早的优化。 @Sweeper 我希望附加一个事件,然后在精灵位于该位置时触发事件,而不是必须不断查看所有精灵。尤其是因为它们很多。 你能画出你想要描述的图表吗?很难从文字中概念化这一点,而且我认为伟大的作家也无济于事。我认为这是一件非常直观的事情。 【参考方案1】:

如果没有 SOMETHING 循环通过 sprite,就无法做到这一点。要么:

Stoneburner 建议的物理引擎 场景,通过 update() 在 sprite 中设置标志 地区 处理触摸的代码,在区域中搜索精灵

GameplayKit 对执行此类操作提供了一些优化:https://developer.apple.com/reference/gameplaykit/gkrtree

【讨论】:

【参考方案2】:
    UITapGestureRecognizer 附加到视图 在点击状态 UIGestureRecognizerStateRecognized 使用CGPoint pointInView = [tapper locationInView:mySKScene.view]获取点击的位置 使用CGPoint pointInScene = [mySKScene convertPointFromView:pointInView]从视图坐标系转换为场景坐标系 通过询问场景获取该点的节点。 SKNode *touchedNode = [self nodeAtPoint:pointInScene];

【讨论】:

嘿乔恩,我想你误会了,我不希望精灵在点击位置,我希望精灵在指定位置(其他地方),如果用户在该位置有精灵水龙头。只有用户点击的实例会影响精灵是否可能在该区域中,而不是用户点击的位置。【参考方案3】:

您可以使用SKPhysicsBodies 来检测冲突(重叠)。

为所有sknodes分配physicsbody,在你想检测其中的sknodes的区域上动态添加一个,处理SKPhysicsContactDelegate,再次移除body

【讨论】:

为什么要使用 SKPhysicsBodies?这会影响精灵的运动吗? @SumNeuron 您希望避免编写循环。当时还不清楚这是您正在寻找的性能优化策略。 SKPhysics 无需使用手写循环,因为它在物理引擎中进行循环,无需您编写它。但这可能比使用 QuadTree 等 GameplayKit 优化的您自己的循环开销更大。 @SumNeuron 单独添加 SKPhysicsBodies 不会影响任何运动。

以上是关于如何在事件发生后在给定约束内返回 SKSpriteNode?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 过滤掉彼此间隔 x 时间内未发生的事件

给定具有开始和结束时间的事件,如何使用 Spark 计算同时发生的事件数?

BigQuery:如何在滚动时间戳窗口内对行进行分组和计数?

Apache Flink CEP如何检测事件是不是在x秒内没有发生?

如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点

为 SKSprite 游戏创建登录页面