【问题标题】:Is there a more accurate way to see if two sprites intersect?有没有更准确的方法来查看两个精灵是否相交?
【发布时间】:2014-01-29 03:30:39
【问题描述】:
CGRect rect4 = CGRectMake(rock.position.x, rock.position.y, rock.size.width, rock.size.height);
CGRect bulletRect = CGRectMake(bullet.position.x, bullet.position.y, bullet.size.width, bullet.size.height);
if (CGRectIntersectsRect(bulletRect, rect4)) {
    NSLog(@"hit Bullet");
    //[bullet removeFromParent];
}

即使 rect 4 不在子弹附近,它似乎也“击中子弹”。 谢谢

【问题讨论】:

  • 我们需要更多信息。子弹和石头是否在同一个坐标系(节点)?子弹和石头长什么样子?
  • 岩石不是完美的盒子形状,而是不规则的多边形

标签: objective-c sprite sprite-kit cgrect skscene


【解决方案1】:

我不知道你的形状到底长什么样,但我猜它们只是松散地用一个矩形表示。

-首先检查你的 x 和 y 岩石和子弹位置是否真的是它们的左上角坐标,如果不考虑你的边界矩形的平移。

-为了提高边界形状的精度,您可以使用位于对象较小矩形边界上的点云,而不会变得太复杂。然后您将使用CGRectContainsPoint 检查形状是否相交。您应该将您的点定位在多边形边界最突出的部分。你可以得到它们相对于 rock.position.x 和 y 坐标的坐标。

例如:您知道岩石的 x 和 y。你可以用类似这样的东西来定位一个点:p1 = x+dx, y+dy。

请注意,在没有交叉点的情况下,典型的边界框方法会将其视为交叉点。

所以,在代码中:

CGPoint p1 = CGPointMake(rock.position.x+dx, rock.position.y+dy);
CGRect bulletRect = CGRectMake(bullet.position.x, bullet.position.y, bullet.size.width, bullet.size.height);
if (CGRectContainsPoint(bulletRect, p1)) {
    NSLog(@"hit Bullet");
}

当然,积分越多,精度越高。只需循环一个点数组和break,如果你有一个真实的。

另一个更复杂和准确的选项可能是图形引擎,例如Box2D

希望对您有所帮助。

F


编辑


Dx 和 Dy 是您的已知点(rock.position.x、rock.position.y)与要测试的点(此处为 p1)之间的差异。

【讨论】:

  • 哇.. 非常感谢您抽出宝贵时间来做这件事!一个问题,什么是“dx and dy”?
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多