2009-08-02 14 views
2

私は楽しみのためにオープンソースのゲームを喜んでコーディングしてきましたが、Graphics.setColor()は0xAARRGGBBを理解できません。私はいくつかの円弧(円板)を描く、より透明な色を得たいです。 http://kenai.com/projects/xplode(ロゴがあります)イメージではなく透明なアークをJ2MEに描画しますか?

画像では透明操作が可能ですが(getRGBなど)、これはサイズが大きいゲームでは非常に遅いことがわかります透明性が変化します。

JSR 184やJSR-226を使用せずに、J2MEで透過スケーラブルディスクを描画する方法はありますか?私はそれに対処するための "良い"方法があることを恐れ、私はこの効果なしで続行しますが、困ったときにはなぜ質問しませんか?

答えて

2

透過性のものは、最小限に抑えて、非常に古いハンドセットから遠ざかる限り、遅くする必要はありません。また、いくつかの実装ではアルファが無視されることがあり、醜いレベルに量子化されることがあります(モトローラの電話によってはアルファ値が最も近い2ビット値にスナップされます)。

私は、スクリーンに重ね合わせた単一の透明なレイヤーとしてこのアプローチに挑戦したいと思います。透明なピクセル(int [width * height])をプロットするスクリーンのサイズをint配列にしておきます。各フレームで、Image.createRGBImageを呼び出し、そのイメージを画面に描画します。

実験として、アルファ処理では、この配列に一定の値を入力し、それを画面にプロットすることで、アルファ処理が遅くならないようにしたい場合があります。例えば。 0x80FF0000は画面に赤い色合いを混ぜる必要があります。このアルファビジネスが選択した端末で動作可能になると、つまりフレームレートにどのように影響するかを測定できます。

次に、この配列に円をプロットする必要があります。 Bresenham's circle drawing algorithmを探し、それをピクセルのint配列にプロットするように再作成します。プロットできる半径ごとに事前に計算された半径/ sqrt(2)を持つルックアップテーブルを維持したい場合があります。

次に、色をブレンドして重なり合わせる方法です。最も単純なのは、アルファを含むカラー値をピクセルにプロットすることだけです。既にプロットされたサークルとの色のブレンドはできませんが、安くてサークルは背景と混ざります。

もう1つの方法は、カラーブレンドを無視することですが、アルファを単純にマージすることです。例えば。

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. */ 

重複円の色は、基礎となるものを支配するだろうが、それらは、少なくともプレーヤーが正しくすべてのサークルを見ることができるであろう重なる場合、アルファはより不透明になります。

正確なカラーブレンドを行う場合は、計算がずっと複雑になります。特に、アルファと1つの値をアルファとブレンドする場合は、各ピクセルのカラー寄与はアルファの割合各色。それは不可能ではありませんが、それを効率的にすることは苦痛です。私は安い選択肢に行くように誘惑されるだろう。

+0

素晴らしいアイデア、ありがとう!私はデバイスがそのようなアプローチを扱うことができるかどうかをテストするためにサンプルコードを書いていきます。 –

1

Graphicsクラスを単独で使用することで、効率的にこのようなことができるかどうかはわかりません。なぜMIDP JSR 239用のOpenGL ES仕様を試してみませんか?

1

代わりに画像にcreateRGBImage()で各フレームを作成するあなたはのgetRGB()とdrawRGB()を使用して試すことができます

関連する問題