【问题标题】:Intersect Nodes ---- Objective-C - Swift - iOS - SpriteKit Node相交节点 ---- Objective-C - Swift - iOS - SpriteKit 节点
【发布时间】:2014-02-19 18:29:44
【问题描述】:

我想知道为什么下面的事情不能正常工作。

在绘制节点之前,我通过使用分析两个特定节点是否相交:

[[self playerSpriteNode] intersectsNode: [self pSKLabelNode]]

当 pSKLabelNode 接触到 desiredSpriteNode 时,它​​会完美运行! (通过在不相交时返回 true 或 false)

但是当它“经过”距离 SKLabel 几个像素时,它仍然相交并返回 true。

是否有一些推荐的设置来修复节点的帧大小,或者您认为可以解决问题的解决方案?

【问题讨论】:

  • 其中一个物体旋转了吗?
  • 您可以尝试继承 SKLabelNode 并覆盖“calculateAccumulatedFrame”方法。

标签: ios objective-c swift sprite-kit


【解决方案1】:

当我尝试将静态节点(位于左侧)与具有旋转(并从右侧飞行)的节点相交时,我遇到了同样的问题。我这样修复它

if ([ninja intersectsNode:node] &&
    CGRectGetMinX(node.frame) <= CGRectGetMaxX(ninja.frame) &&
    CGRectGetMaxX(node.frame) >= CGRectGetMinX(ninja.frame))
{
    //and here I have intersects
}

所以我通过添加额外的参数来修复它

【讨论】:

    【解决方案2】:

    intersectNode 方法经过优化,可在每秒进行大量迭代的设备上快速运行。因此,它实际上是基于数学“估计”碰撞,有时会在几个像素的边缘出错,特别是当我们谈到 PNG 的方角时。

    我也遇到过这个问题,因为我使用了圆圈,所以我计算了圆圈之间的距离作为第二次验证。

    因此,您可以做的是在 intersectsNode 内部进行自定义验证(如果情况)。假设您处理正方形,您可以验证 x 或 y 在 intersectNode 之后是否发生碰撞。可能是这样的:

        if([[self playerSpriteNode] intersectsNode: [self pSKLabelNode]]){
            if(distance between x1 and x2 < size1.width/2 + size2.width/2 || distance between y1 y2 < size1.height/2 + size2.height/2){
                //Your code goes here
            }
        }
    

    请注意,我们将中心 x 距离与每个宽度之和的一半进行比较。这只是一个适用于正方形和大多数通用精灵的示例。

    我想指出,虽然 intersectsNode 有点不精确,但为了快速运行您的游戏,这是必需的,因为每次更新的完美和精确计算对您的设备来说可能非常详尽。 因此,如果您进行自定义验证,请始终在 intersectsNode 返回 true 后调用它,作为第二次验证,而不是唯一一次。

    Roman 上面提供的答案与我所说的差不多,代码更短;我只是想解释一下原因。

    【讨论】:

      【解决方案3】:

      斯威夫特 2.1:

      为了增加结果,请在update( _:) 循环中检查,是下一张图之前发生的事情:

      override func update(currentTime: CFTimeInterval) {
              /* Called before each frame is rendered */
      
              if goodDude.intersectsNode(badDude){
      
                  print("bad dude v.s. Ninja")
      
              }else{
      
                  print("not dude at all")
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        相关资源
        最近更新 更多