2009-08-02 65 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()