2012-06-01 83 views
1

我有一個遊戲,在其中一個關卡中,羊可能被地雷炸燬。爆炸動畫是由一個png包含512x515 png文件中的4x4陣列爆炸圖像來控制的,參見下文。drawBitmap有問題 - 有源矩形和目標矩形

enter image description here

然後我用下面的代碼動畫爆炸:

  exp_bitmap_number_to_draw = (int)(time_since_death/100); 

      if (exp_bitmap_number_to_draw < 16) 
      { 
       explosion_dst_rect.left = b2sx(sheep_x[i]) - sheep_radius * 5; 
       explosion_dst_rect.right = b2sx(sheep_x[i]) + sheep_radius * 5; 

       explosion_dst_rect.bottom = b2sy(sheep_y[i]) + sheep_radius * 5; 
       explosion_dst_rect.top = b2sy(sheep_y[i]) - sheep_radius * 5; 

       explosion_src_rect.left = 128 * (exp_bitmap_number_to_draw % 4); 
       explosion_src_rect.top = 128 * (exp_bitmap_number_to_draw/4); 

       explosion_src_rect.right = explosion_src_rect.left + 128; 
       explosion_src_rect.bottom = explosion_src_rect.top + 128; 

       canvas.drawBitmap(explosion_bitmap, explosion_src_rect, explosion_dst_rect, null); 
      } 

凡explosion_src_rect是一個矩形和explosion_dst_rect是RectF。 b2sx()和b2sy()是將「遊戲場」上羊的絕對座標轉換爲屏幕上的座標的函數 - 它僅僅添加一個偏移量。

該代碼可以在我嘗試過的幾款手機上完美工作,包括Nexus S和Galaxy S II。但是現在,一位朋友在三星Galaxy Tab 8.9上試用了這個代碼,發現這些爆炸似乎不合時宜。他送我這部分的截屏:

enter image description here

任何想法可能是什麼造成的?

+0

您是否在較大的屏幕上使用了不同的位圖?另外,sheep_radius是如何定義的? – JRaymond

+0

只有一組位圖。它們用於所有屏幕尺寸。 float sheep_radius是畫布寬度除以40. – Mick

+1

如果您只對所有屏幕使用一組位圖,則應將其放置到res/drawable-nodpi文件夾中。然後android不會調整你的位圖。 – Nolesh

回答

4

如果資源的密度不正確,則系統會加載默認資源並根據需要將其縮放,以匹配當前屏幕的密度。 在某些情況下,您可能不希望Android預先縮放資源。避免預縮放的最簡單方法是將資源置於配置限定符爲nodpi的資源目錄中。例如: res/drawable-nodpi/icon.png。所以你必須把你的位圖放到`res/drawable-nodpi/文件夾中。 看一看:http://developer.android.com/guide/practices/screens_support.html

+0

我認爲這裏的問題是,無論他是在加載文件,Android並沒有預縮放位圖 - 使得畫面的一部分被繪製得比他需要的位圖塊更大 - 仍然是對nodpi的一個好評文件夾,但 – JRaymond

+0

一旦我有類似的問題。我將所有位圖放入res/drawable文件夾並使用係數來縮放位圖,所以當我在不同的屏幕上測試我的遊戲時,繪圖出錯了。我認爲位圖的大小更大。經過一些挖掘,我把它放入nodpi,它變得很酷! – Nolesh

0

您的目標矩形的寬度,而不是你的爆炸幀的大小,正如你所說,正在設置爲畫布的寬度/ 4。手機通常是同樣大小,但更大的平板電腦有一個更大的屏幕尺寸 - 因爲它在文件中說:

繪製指定的位圖,縮放/自動轉換,填補了目標矩形[...] 此函數忽略與位圖相關的密度。這是因爲源和目標矩形座標空間處於其各自的密度,所以必須已經具有適當的縮放因子。

所以你的位圖,而不是縮放到畫布大小,是越來越繪製開始與SRC矩形,而是擴大超過SRC的範圍,因爲它被告知,填補了DST,忽略了兩個位置的密度。

至於解決方案,我不確定,確切地說 - 可能會更好,讓所有尺寸的圖像都可以放進你的/res。根據加載位圖的方式,您可能可以獲得位圖的縮放比例,但是隨後位圖上的固定寬度轉換必須變得更加動態。

希望幫助莫名其妙:)

0

我有,我問放在這裏同樣的問題,我的答案是載入我的位圖這個樣子,而不是正常的方式:

getResources() 。openRawResource(imageId)