libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

スレッドとアニメーション (7/9)

作成:2010-01-14 21:14
更新:2010-01-14 21:14

■オフスクリーンバッファに描画する

ここまでは描画メソッドを使って図形を描いてきましたが、グラフィックファイルからイメージを読み込んでも同様のことができるはずです。今度は、それについて考えてみましょう。

イメージを使って描く時、問題となるのは「描画の時間差」です。 先の例では、ごく単純に「円を描く」というだけのものでしたから、なめらかに表示されました。が、イメージを使った場合、どうなるでしょう。特に「背景に何かのイメージを表示し、その上に重ねて何かを表示する」なんて場合は?

画面をクリアし、それから背景を描き、その後で重ね合わせるイメージを描き…という処理を順番に行なっていくと、画面が妙にちらちらとしてしまうことがあります。これは「描きなおしている処理が見えてしまう」からです。例えば背景を描いてから重ねるイメージを描く場合、ほんの一瞬ですが背景だけで重ねるイメージが描かれていない状態になるわけです。これによりちらつき感が出てしまうことはあります。

また、通常のコンポーネントは、画面更新をする際にまず全体を背景色で塗りつぶしてコンポーネントの描画を行なってからpaintメソッドを呼び出します。ここでもちらつきが生じる可能性はあります。

そこで、「一度に全部表示を更新する」という処理が必要となるのです。これは、実はそう難しいものではありません。要するに、複数のイメージを順番に描くのが悪いのです。ですから、まずからっぽ(?)のイメージを1つ用意し、その中に順番に表示するものを描いていって、全部描き終えたところでこれを画面に描くようにすれば、ちらつきはなくなります。

このような「画面に表示されないイメージ」を「オフスクリーンバッファ」と呼びます。オフスクリーンバッファを使えば、画面のちらつきをおさえてきれいなアニメーションができます。

このオフスクリーンバッファというのは、特別なオブジェクトではありません。イメージに使っていたImageクラスのインスタンスをそのまま利用するのが一般的です。先にImageを使った時は、getImgeというのでイメージを読み込んでいましたが、この他にcreateImageというメソッドで、何もグラフィックのないからっぽなImageインスタンスを作ることもできるようになっています。

整理すると、オフスクリーンバッファの考え方は以下のようになります。

1.表示するイメージをgetImageでそれぞれ読み込む。
2.それとは別に、オフスクリーンバッファ用のImageをcreateImageで作る。
3. runメソッドでは、位置を動かした後、オフスクリーンバッファのImageにdrawImageで表示イメージを描いてから、repaintを呼び出す。
4.MyCanvasのpaintメソッドでは、オフスクリーンバッファのImageを丸ごとdrawImageする。

この他に、MyCanvasでupdateメソッドを修正するという作業も必要となるでしょう。前回触れたように、AWTのコンポーネントでは、repaintされた後、updateでコンポーネントを更新し、それからpaintを呼び出します。ですから、updateを、直接paintを呼び出すような形に修正すれば、更にちらつきの原因はなくなります。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る