2

是否可以在基于视图的应用程序中进行像素完美碰撞?我一直在寻找示例代码,但没有运气......你也可以使用彩色位图来表示某种颜色的碰撞吗?

4

1 回答 1

2

你可以。不过,如果您使用CGImage,它看起来是最简单的。

您可以创建一个 2D 布尔数组来读取像素值以构建一个命中网格(基本上是一个 2x2 矩阵),然后将其与您的游戏对象类一起存储。

您需要直接访问 CGImage 的像素数据(代码在此处),然后使用 for 循环,将像素数据读入数组布尔值:

BOOL pixelGrid[xPixels][yPixels];
for (int i = 0; i < xPixels; i++) {
    for (int j = 0; j < yPixels; j++) {
        pixelGrid[i][j] = pixelIsOpaque(i, j);
    }
}

上面的方法 pixelIsOpaque() 显然不存在,只需替换为示例代码为您提供的任何内容即可提取像素值。您正在存储像素是否存在(基本上检查像素是否不透明度> 0)

一旦你有了这个网格(在程序开始时生成一次并将生成的二维数组存储在游戏对象中),那么你需要一个碰撞检测方法。

BOOL detectCollision( BOOL *pixelGrid1, BOOL *pixelGrid2 ) {
BOOL result = NO;  
    for (int i = 0; i < xPixels; i++) {
        for (int j = 0; j < yPixels; j++) {
            if ( pixelGrid1[i][j].opacity != 0 && pixelGrid2[i][j].opacity != 0] ) {
                result = YES; break;
            }

    }
}
return result;
}

我只是在运行中编写了这段代码,所以我可能不是 100% 可编译的,但我希望它能给你这个想法。您可以轻松地修改它,而不是与不透明度进行比较,只需再次与像素颜色值进行比较,请参阅此处获取原始颜色数据。

于 2009-09-06T17:57:31.683 回答