是否可以在基于视图的应用程序中进行像素完美碰撞?我一直在寻找示例代码,但没有运气......还可以使用彩色位图来表示某种颜色的碰撞吗?
答案 0 :(得分:2)
你可以。如果使用 CGImage ,它看起来最简单。
您可以创建一个2D布尔数组来读取像素值以构建命中网格(基本上是2x2矩阵),然后将其存储在游戏对象类中。
您需要直接访问CGImage (the code is here)的像素数据,然后使用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)
一旦有了这个网格(在程序开头生成一次并将生成的2D数组存储在游戏对象中),那么你需要一个碰撞检测方法。
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%可编辑但我希望它能给你这个想法。 您可以轻松修改此项,但不要与不透明度进行比较,只需再次与像素颜色值进行比较,see here即可获取原始颜色数据。