アニメーション
スリープ
前回のアニメーションの続きです。
アニメーションを利用したサンプルとして数字をカウントするというアプレットを出しましたが、 あのアプレットでは1000万を数えるまで数十秒程度だったと思います。 これでは描画間隔が非常に短いことになってしまいます。 そこで、sleepメソッドを使ってアニメーションを停止させるということをします。
sleepメソッドは次のように記述します。
Thread.sleep(1000); /* 引数はミリ秒で指定 */
引数にはどれだけ停止させるかをミリ秒(1/1000秒)単位で指定します。 ここでは、1000 を指定しているので 1 秒停止します。
例外処理
例外処理というのは、所謂エラー処理のことです。 スレッドを停止させると、他のスレッドに割り込みをされてしまう可能性があります。 そこで、try文を利用しsleepメソッドがエラーを発生しないか監視し、 エラーが発生した場合はcatch文で例外処理を行います。
try文の中括弧の中には監視対象となる処理(ここでは sleep メソッド)を記述します。 catch文の引数は例外処理を行う例外の種類です。 sleepメソッドの場合は、InterruptedException(割り込み例外)型の変数 e を引数とします。 そして、この例外を受け取った場合に例外処理(ここでは空白)を行います。
try{
Thread.sleep(1000);
}catch (InterruptedException e){}
sleepメソッドを利用する場合は例外処理を記述しておかなければエラーが出てコンパイルが通りません。 例外処理は特に何も記述しなくても大丈夫です。
サンプル
それでは、スレッドを使ったプログラムとしてボールが動き続けるアプレットを作ってみましょう。
まずは、必要な変数を作っておきます。x、y、dは描画位置を決めるのに使います。
int x = 0, y = 150, d = 1;
Thread th = null;
paintメソッドでは一度背景を白く塗ってから円を描きます。
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0, 0, 300, 300);
g.setColor(Color.pink);
g.fillOval(x, y, 15, 15);
}
次に、runメソッドを作成します。
runメソッドの中では、変数値を変更し描画位置を変更する処理を行い再描画します。
01 while(true){ /* 無限ループ */
02 try{
03 Thread.sleep(100); /* 100ミリ秒停止する */
04 }catch (InterruptedException e){}
05
06 repaint();
07 /* 画面範囲を超えたら逆方向へ移動 */
08 if(x > 285){ d = -1; }
09 if(x < 0){ d = 1; }
10 x += d;
11 }
while文の引数をtrueとすると値が変化しないため無限ループするようになります。
スレッドの作成とスタートはinitメソッドの中で行います。
public void init(){
th = new Thread(this);
th.start();
}
あとは、stopメソッドを作成すれば完成です。
public void stop(){
th = null;
}
これが完成したアニメーションです。
Copylight (c) ガメラボ 2006 - All Rights Reserved