当前位置: 首页 > 面试题库 >

与Config.ALPHA_8的像素完美碰撞

暨成双
2023-03-14
问题内容

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

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()。)



 类似资料:
  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个

  • 我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/ 这是我的Cocos2d-x版本代码 如果我将“pp”参数发送为false,则我的代码工作正常。也就是说

  • 我需要在iPad精灵游戏中生成8个随机精灵对象。这些对象相当大,并且大小不同。它们不应该叠加。如果场景中生成的对象叠加,它将被删除(可选地,它会删除底层对象)。我一直在为Sprite Kit寻找一个像素完美的冲突检测框架或帮助类。到目前为止,我还没有找到教程或类似的东西。大多数人使用普通的冲突检测,这没有任何帮助,因为我的对象很大。我测试了标准方法,但它创建了矩形,使我的情况下的精灵区域更大。这是

  • 我目前正在开发一个自上而下的射击游戏,在碰撞方面有一些问题。我的世界是瓷砖做的(64x64)。瓦片和实体是矩形。玩家以例如2.74的速度移动(为了更平滑的移动,不以像素为单位)。但是当涉及到玩家(一个实体)和墙之间的碰撞时,我有一些问题。为了检查是否有碰撞,我用我的球员的当前位置和他的移动速度来计算他的下一个位置和是否有碰撞。但我会检查途中的每个像素,所以即使移动速度非常快,我也无法跳过障碍。假设

  • 问题内容: 如何使用Pygame的模块检测具有透明背景的两个精灵的碰撞,以便仅在实际的精灵(而不是透明背景)碰撞时返回? 问题答案: 使用该函数为您的精灵赋予属性。 然后,您可以将回调函数传递给sprite碰撞函数之一,例如,碰撞检测将是完美的像素。 这是一个完整的示例(当两个精灵碰撞时,标题会更改):

  • 我使用的是OpenJDK 11: openjdk版本“11.0.1”2018-10-16 openjdk运行时环境18.9(构建11.0.1+13) openjdk 64位服务器VM 18.9(构建11.0.1+13,混合模式) 试图让一个应用程序在JPanel中绘制一些东西,我注意到一些恼人的不准确之处。 然而,当精确度真的很重要时,如何使它像素级完美呢?