2012-09-14 83 views
1

我正在開發一個使用opengl es 2.0的android遊戲,並使用高度貼圖位圖來創建地形。這很好。從位圖的Android getPixel隨機地開始返回黑色

在遊戲過程中,我有一些代表遊戲中存儲實體(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

是xPos和yPos總是(您是否斷言等)之間(0..1)? – mehmetminanc

+0

@Mehmet M. I. xPos和yPos不在0和1之間,他們不需要。 POS []是在遊戲/ OpenGL的座標和一系列的變換應用,你可以看到,得到相應的像素的座標到該位置。 在生成的日誌中,可以看到諸如: 'DEBUG! >>(408,300):453213 <<' ..稍後有些遊戲循環... 'DEBUG! >>(40.83萬):0 <<' 這意味着有事位圖之間,以及座標轉化爲像素不是在這種情況下'S 0問題 – jmacedo

回答

0

如果pixelX或pixelY的值大於位圖的相應尺寸,則返回0。驗證pixelX和pixelY的值,然後進入此代碼段:

if(pixelX < 0 || pixelX >= bitMapWidth || pixelY < 0 || pixelY >= bitMapHeight) 
    return 0; 
+0

,是的,但那不是問題,因爲這是期望的行爲。 正在發生的事情是有可能通過println的觀察(見我的評論,以穆罕默德的答案),它會自動確保它是這是beeing運行的其他部分。事實上,同樣的像素座標不要有始終不變的getPixel值是非常奇怪的事情。它幾乎看起來好像有人塗黑整個位圖在隨機時間程序啓動後。 – jmacedo