在J2ME中绘制透明弧,而不是图像?

时间:2009-08-02 22:57:59

标签: java graphics java-me mobile transparency

我很乐意为开源游戏编写乐趣,但我才意识到Graphics.setColor()不理解0xAARRGGBB。我希望得到一种越来越透明的颜色,我会在其中绘制一些弧形(圆盘)。我的目标是让它们彼此闪耀,就像在这张图片中一样:http://kenai.com/projects/xplode(那里有徽标)

我知道透明操作可以使用图像(getRGB等),但对于尺寸和透明度变化很大的游戏而言,这被证明是非常慢的。

有没有什么方法可以在J2ME中绘制透明的可扩展光盘,而不使用JSR 184和JSR-226?我担心现在有“好”的方式处理它,我会继续没有这种影响,但为什么不在需要时问?

3 个答案:

答案 0 :(得分:2)

透明度的东西不需要很慢,只要你把它保持在最低限度并远离非常旧的手机。您还应该注意,在某些实现中有时会忽略alpha,有时会将其量化为丑陋的级别(有些motorola手机将alpha值捕捉到最接近的2位值.Bleh)。

我很想把它当作叠加在屏幕上的单个透明层来处理。保持一个int数组的大小,您将在其中绘制透明像素(int [width * height])。在每个帧上,调用Image.createRGBImage并将该图像绘制到屏幕上。

作为一项实验,您可能首先要确保alpha处理不会因为使用常量值填充此数组并将其绘制到屏幕而减慢速度。例如。 0x80FF0000应该在屏幕上混合一个红色调,你可以很容易地看到这个alpha业务是否可以在你选择的手机上工作,即你可以测量它对你的帧速率的影响。

接下来,您需要将圆圈绘制到此数组中。寻找Bresenham's circle drawing algorithm并重新设计以绘制成像素的int数组。您可能希望维护一个查找表,该表具有您希望能够绘制的每个半径的预先计算的半径/ sqrt(2)。

接下来是如何混合颜色以使它们重叠。最简单的方法是将带有alpha的颜色值绘制到像素中。你不会与已经绘制的圆圈混色,但它会很便宜,圆圈会与背景混合。

另一种方法是忽略颜色混合,但在alpha上进行简单的合并。 E.g。

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上,因为每个像素的颜色贡献随每个像素的alpha比例而变化颜色。这不是不可能,但要使其高效是一种痛苦。我很想选择更便宜的选择。

答案 1 :(得分:1)

我不确定你是否可以单独使用Graphics类以合理有效的方式做这样的事情。为什么不尝试使用MIDP JSR 239的OpenGL ES规范?

答案 2 :(得分:1)

您可以尝试使用getRGB()和drawRGB()

而不是使用createRGBImage()创建每个帧的图像