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 に答える