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

时间:2017-01-15 12:11:11

标签: ios swift sprite-kit skspritenode

假设以下内容:

  • 视图中有无数SKSpriteNode个。
  • 当用户点击屏幕时,您希望在特定位置/附近的任何精灵都能进行动画制作。

问题:如何在没有循环遍历所有精灵的情况下找出哪个SKSpriteNode位于特定位置

为此,我实施了一个SKSpriteNode,它是透明的,具有覆盖特定位置范围的纹理,并相应定位。

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

问题:如何让SKSpriteNode报告与之交叉的精灵(如果有的话)?再次,没有循环遍历每个精灵。如果两个精灵与 box 相交,则只返回与 box 最突出相交的那个。

图: 这不是我的实际用例,但说明了这一点。有很多精灵(超过下面可视化的)并且有一个感兴趣的领域:

  • 如果用户触摸,
  • 精灵在该区域

我想知道那里有精灵。

enter image description here

3 个答案:

答案 0 :(得分:2)

如果没有SOMETHING循环遍历sprite,就没有办法做到这一点。那是:

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

GameplayKit提供了一些关于做这类事情的优化:https://developer.apple.com/reference/gameplaykit/gkrtree

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以使用SKPhysicsContactDelegate来检测碰撞(重叠)。

将物理实体分配给所有sknodes,在要检测内部sknodes的区域上动态添加一个,处理{{1}},再次移除主体