Deep Side of Java〜Java 言語再入門 第4回 〜 アプレット、スレッド、AWT

Appletサンプル neco

さて、実例としてお見せするのは、いわゆる「neco」〜マウスを画像が追いかける、というお楽しみプログラムである。このプログラムの動作は基本的に次の通りである。



  1. トップレベルであるFrame Widgetの中に Canvas Widgetが入っており、この Canvas Widgetは画像を表示する。

  2. Canvas Widgetはマウスの移動に関するイベントを受け取るが、自分では処理をせずに単にマウス位置を保持する。

  3. 別個に起動しているスレッドが、適当な間隔でマウス位置を Canvas Widgetにポーリングし、マウス位置に合わせて適切な位置に移動する画像を貼るように、Canvas Widgetに命令する。

  4. Canvas Widgetは適切な準備をして、repaint() を呼び出す。

  5. そうすると、マウスの移動に合わせて画像が貼り付けられる。

この時、背景画像、移動画像共に大きさは任意である。だから、ひょっとすると repaint() に手間がかかるかもしれない。そうすると、画像がチラつくことになる。これを避けるために、クリッピングを行う。クリッピングとは、repaint() の際に、書き換えるエリアを本当に書き換える必要がある部分だけに制限し、素早く再描画させることでチラツキをなくす手法である。



/* paramタグに自由に画像を指定できるわけである */
/* width, height は実際に使う背景画像のサイズを調べてセットするのが良かろう*/
<applet code="NecoApplet" archive="sub/NecoApplet.jar" width=413 height=258>
<param name="backImage" value="sub/ano.gif">
<param name="foreImage" value="sub/greenon.gif">
</applet>

存在しない背景・移動画像URLを指定した場合の対策もちゃんと講じてある。自分で確認されたい。

また、スタンドアロンのプログラムは次のように実行すれば良い。プログラム内容はほとんど変わらない。

% java Neco 背景画像ファイル 移動画像ファイル



copyright by K.Sugiura, 1996-2006