1

我正在使用 opengl es 2.0 为 android 开发游戏,我使用高度图位图来创建地形。这行得通。

在游戏过程中,我有代表游戏中实体的类,这些实体在它们的实例中存储它们的 (x,y) 位置。为了获得 z 值,我使用了一种查询高度图位图的方法。

这是方法:

public float zAt(float pos[]){
    float xPos = pos[0] + terrainWidth/2;
    float yPos = height-(pos[1] + terrainHeight/2);

    int bitMapWidth = zMap.getWidth();
    int bitMapHeight = zMap.getHeight();

    int pixelX= (int) (((bitMapWidth-1)  * xPos) / terrainWidth);
    int pixelY = (int) (((bitMapHeight-1) * yPos) / terrainHeight);

    if(pixelX < 0 || pixelX >= bitMapWidth || pixelY < 0 || pixelY >= bitMapHeight)
        return 0;
    else{
        System.out.println("DEBUG! >> "+"("+pixelX+","+pixelY+"):"+zMap.getPixel(pixelX, pixelY)+" <<");
        float toReturn = ((zMap.getPixel(pixelX, pixelY) & 0xFF)-(255f/2f))/zDiv;

        return toReturn;
    }
}

当游戏开始时,一切都很好。但是在一些游戏循环之后,我注意到我在游戏中的对象总是停留在 z=0 中。我去检查 zAt 方法,将 println 扔在那里,我验证了事实上,在一段时间后(每次运行游戏时这个时间都不同),zMap.getPixel 开始返回 0。

这是一个奇怪的问题,因为我在游戏过程中没有改变我的位图。

有时它甚至会闪烁一下,即 getPixel 返回 0,然后返回正确的值,然后再次返回 0……大多数时候最终总是返回 0。

这就是我加载位图的方式:

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;

    Bitmap terrainBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.heightmap, options);

有人知道为什么会这样吗?

4

1 回答 1

0

如果 pixelX 或 pixelY 值大于位图的相应尺寸,则返回 0。在进入此代码部分之前验证 pixelX 和 pixelY 值:

if(pixelX < 0 || pixelX >= bitMapWidth || pixelY < 0 || pixelY >= bitMapHeight)
    return 0;
于 2012-09-16T17:57:45.387 回答