我正在使用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);
有人知道为什么会这样吗?
答案 0 :(得分:0)
如果pixelX或pixelY值大于位图的相应尺寸,则返回0。在进入此代码段之前验证pixelX和pixelY值:
if(pixelX < 0 || pixelX >= bitMapWidth || pixelY < 0 || pixelY >= bitMapHeight)
return 0;