私は、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);
なぜこれが起こっているのか、誰かが手がかりを持っていますか?