与Config.ALPHA_8的像素完美碰撞

我找到了像素完美碰撞检查的代码,并在我的代码中使用了它:

public  boolean isCollisionDetected(Bitmap bitmap1, int x1, int y1,

Bitmap bitmap2, int x2, int y2) {

Rect bounds1 = new Rect(x1, y1, x1 + bitmap1.getWidth(), y1

+ bitmap1.getHeight());

Rect bounds2 = new Rect(x2, y2, x2 + bitmap2.getWidth(), y2

+ bitmap2.getHeight());

if (Rect.intersects(bounds1, bounds2)) {

Rect collisionBounds = getCollisionBounds(bounds1, bounds2);

for (int i = collisionBounds.left; i < collisionBounds.right; i++) {

for (int j = collisionBounds.top; j < collisionBounds.bottom; j++) {

int bitmap1Pixel = bitmap1.getPixel(i - x1, j - y1);

int bitmap2Pixel = bitmap2.getPixel(i - x2, j - y2);

if (isFilled(bitmap1Pixel) && isFilled(bitmap2Pixel)) {

return true;

}

}

}

}

return false;

}

private Rect getCollisionBounds(Rect rect1, Rect rect2) {

int left = (int) Math.max(rect1.left, rect2.left);

int top = (int) Math.max(rect1.top, rect2.top);

int right = (int) Math.min(rect1.right, rect2.right);

int bottom = (int) Math.min(rect1.bottom, rect2.bottom);

return new Rect(left, top, right, bottom);

}

private boolean isFilled(int pixel) {

return pixel != Color.TRANSPARENT;

}

它运行完美,从来没有任何问题。直到我使用以下代码将图像设置为Config_Alpha_8为止(由于ram问题):

    private Bitmap convert(Bitmap bitmap, Bitmap.Config config) {

Bitmap convertedBitmap =

Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), config);

Canvas canvas = new Canvas(convertedBitmap);

Paint paint = new Paint();

paint.setColor(Color.BLACK);

canvas.drawBitmap(bitmap, 0, 0, paint);

return convertedBitmap;

}

为什么什么都不会发生,它确实被CollisioDetected装入了,我已经检查了日志!但是它不会检测到冲突。有人可以使用config_alpha_8提供工作功能来检查位图的像素完美冲突吗?

回答:

在具有ALPHA_8配置的位图上调用getPixel()将始终返回零。这似乎是一个错误

您可以通过将每个位图的像素存储为字节数组来解决此问题:

byte[] pixelData = getPixels(convert(bitmap, Bitmap.Config.ALPHA_8));

...

public byte[] getPixels(Bitmap bmp) {

int bytes = bmp.getRowBytes() * bmp.getHeight();

ByteBuffer buffer = ByteBuffer.allocate(bytes);

bmp.copyPixelsToBuffer(buffer);

return buffer.array();

}

您将需要稍微修改碰撞检测功能:

public  boolean isCollisionDetected(byte[] pixels1, Bitmap bitmap1, int x1, int y1,

byte[] pixels2, Bitmap bitmap2, int x2, int y2) {

int width1 =bitmap1.getWidth();

int height1=bitmap1.getHeight();

int width2 =bitmap2.getWidth();

int height2=bitmap2.getHeight();

Rect bounds1 = new Rect(x1, y1, x1 + width1, y1 + height1);

Rect bounds2 = new Rect(x2, y2, x2 + width2, y2 + height2);

if (Rect.intersects(bounds1, bounds2)) {

Rect collisionBounds = getCollisionBounds(bounds1, bounds2);

for (int i = collisionBounds.left; i < collisionBounds.right; i++) {

for (int j = collisionBounds.top; j < collisionBounds.bottom; j++) {

byte bitmap1Pixel = pixels1[((j - y1) * width1) + (i - x1)];

byte bitmap2Pixel = pixels2[((j - y2) * width2) + (i - x2)];

if (isFilled(bitmap1Pixel) && isFilled(bitmap2Pixel)) {

return true;

}

}

}

}

return false;

}

(…您可能希望将位图参数更改为这些位图的相应宽度和高度,然后调用recycle()。)

以上是 与Config.ALPHA_8的像素完美碰撞 的全部内容, 来源链接: utcz.com/qa/400094.html

回到顶部