我正在使用 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);
有人知道为什么会这样吗?