2009-08-02 68 views
2

我一直很開心編碼開源遊戲的樂趣,但我只是意識到,Graphics.setColor()不理解0xAARRGGBB。我想獲得更多更透明的顏色,我會繪製一些弧線(光盤)。我的目標是讓他們在這個圖像中彼此閃耀:http://kenai.com/projects/xplode(這裏的標誌)在J2ME中繪製透明弧而不是圖像?

我知道透明度處理可能與圖像(getRGB等),但這證明對於有很多大小的遊戲非常緩慢和透明度的變化。

有沒有什麼辦法可以在J2ME中繪製透明的可伸縮光盤,而無需使用JSR 184或JSR-226?我擔心現在有「好」的方式來處理它,我會繼續沒有這種效果,但爲什麼不問什麼時候有需要?

回答

2

透明度的東西不需要緩慢,只要你保持在最低限度,遠離舊手機。你還應該注意到alpha在某些實現中有時會被忽略,有時會被量化爲醜陋的級別(一些摩托羅拉手機會將alpha值捕捉到最接近的2位值Bleh)。

我很想把它作爲疊加在屏幕上的單個透明層來處理。將int數組保留爲屏幕的大小,您將在其中繪製透明像素(int [width * height])。在每一幀上,調用Image.createRGBImage並將該圖像繪製到屏幕上。

作爲一個實驗,您可能首先需要確保alpha處理不會因爲用常量值填充此數組並將其繪製到屏幕上而使您減慢速度。例如。 0x80FF0000應該在屏幕上混合紅色色調,並且如果此alpha業務可以在您選擇的手機上使用,則可以輕鬆查看,即可以測量它對幀速率的影響。

接下來,您需要將圓圈繪製到此數組中。查找Bresenham's circle drawing algorithm並將其重寫爲繪製爲像素的int數組。您可能需要維護一個查找表,該表對於您想要繪製的每個半徑都有一個預先計算的半徑/ sqrt(2)。

接下來是如何混合顏色以使它們重疊。最簡單的方法就是將alpha值的顏色值繪製到像素中。你不會與已經繪製的圓形進行顏色混合,但它會很便宜,圓圈會與背景混合。

另一種方法是忽略顏色混合,但在alpha上做一個簡單的合併。例如。

newColour = ((destColour & 0xFF000000) + 0x20000000) | srcColour; 
/* Where source colour is of the form 0x00RRGGBB. Note: Adding 0x20 to alpha each 
* time will only work for 7 overlapping circles. */ 

重疊圓圈的顏色將主導底層之一,但它們重疊這將至少允許玩家正確地看到所有的圈子的阿爾法將變得更不透明。

如果你想做一個準確的顏色混合,那麼計算就複雜得多,特別是如果你將一個值與alpha混合到另一個alpha上,因爲每個像素的顏色貢獻會隨着alpha的比例每種顏色。這不是不可能的,但使其高效是一種痛苦。我很想去找一個更便宜的選擇。

+0

好主意,謝謝!我會馬上寫一些示例代碼來測試設備是否可以處理這種方法。 – 2009-08-03 11:44:47

1

我不知道你是否可以用合理高效的方式單獨使用Graphics類來完成這樣的事情。你爲什麼不嘗試用於MIDP JSR 239的OpenGL ES規範?

1

用createRGBImage()創建每幀圖像,你可以嘗試使用getRGB()和drawRGB()