如何在事件发生后在给定约束内返回 SKSpriteNode?
Posted
技术标签:
【中文标题】如何在事件发生后在给定约束内返回 SKSpriteNode?【英文标题】:How to return the SKSpriteNode within given constraints following an event? 【发布时间】:2017-01-15 12:11:10 【问题描述】:假设如下:
您的视图中有无数的SKSpriteNode
s。
当用户点击屏幕时,您希望位于/靠近特定位置的任何精灵执行动画。
问题:如何确定SKSpriteNode
位于特定位置 不遍历所有精灵?
为此,我实现了一个SKSpriteNode
,box,它是透明的,并且具有覆盖特定位置跨度的纹理,并进行相应定位。
SKSpriteNode
方法 contains
和 intersects
看起来很有希望,但要求我分别传递一个点或一个精灵。
问题:我如何获得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?的主要内容,如果未能解决你的问题,请参考以下文章
给定具有开始和结束时间的事件,如何使用 Spark 计算同时发生的事件数?
BigQuery:如何在滚动时间戳窗口内对行进行分组和计数?
Apache Flink CEP如何检测事件是不是在x秒内没有发生?