在Cocos2D中,如何检查与用户绘制的任意形状的碰撞?


10

我想检测精灵与用户生成的某种形状之间的碰撞。

例如。屏幕上有3个对象。用户握住手指,在两个对象周围绘制异常形状。我需要检测这两个对象。

用户形状为紫色,游戏对象为绿色和红色

如何使用Cocos2D有效地解决此问题?

Answers:


10

该特定示例有一个非常简单的解决方案。

我假设您的任意形状只是一系列点。

从每个对象的任何方向绘制射线。如果它与形状上的线段相交的次数是偶数(包括零),则表示您不在形状之外。

如果相交的次数为奇数,则说明您位于对象内部。

射线/线段碰撞是一种很容易找到/实现的算法。


3

当然,我必须为我的游戏Star Catch弄清楚这一点。也许有更好的方法可以做到,但这就是我的方法。我实际上是在网上找到算法的(对不起,我不记得源代码了),我进行了搜索以检测多边形内的点。

我创建了一个NSMutableArray来说明我的观点。我在触摸事件中添加了点。

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

让我知道这是否有帮助。



0

对于像素碰撞检查,XNA开发人员站点上有一个不错的教程系列。
http://creators.xna.com/zh-CN/tutorial/collision2dperpixeltransformed

您可以使用的那些优化中没有使用的一种优化(非常奇怪)是,在大多数情况下,仅需检查轮廓,从而节省宝贵的周期。

编辑添加:糟糕的答案,误读了问题。如果您想阅读每个像素的小结,这些教程仍然相当不错。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.