- 画像の連続
- "アニメーション"と聞くと"アニメーションgif"を連想される方が多いと思います。
- 確かに、iαppliのクラスの中にはアニメーションgifを扱えるものが用意されています。しかしそのクラスは少々使い勝手が悪く、Canvasを継承したクラスのpaint()メソッド内では扱い難いと思われます。
- そこで、アニメーションは自分で"プログラムとして"表現する事にしましょう。
- → → →
- 今回はこの4種の電光を順に表示させます。
- さて、まずはこれらの画像を持つImageオブジェクトを用意します。解り易い様に配列で4つ、作成しましょう。
/**電光イメージ配列*/
Image light[] = new Image[4];
Image light[] = new Image[4];
- 次に、リソースとして作成したイメージ画像を順に代入します。この時、ファイル名を連番にしておくとfor文を用いて作業をループ化させる事が出来ます。
- light01.gif light02.gif light03.gif light04.gif
- コンストラクタで行うループ処理です。カウンタiの使い方に注目して下さい。
for (int i = 0; i < 4; i++) {
MediaImage mediaImage = MediaManager.getImage("resource:///res/light0" + (i + 1) + ".gif");
try {
mediaImage.use();
light[i] = mediaImage.getImage();
} catch (ConnectionException e) {
} catch (UIException e) {
}
}
MediaImage mediaImage = MediaManager.getImage("resource:///res/light0" + (i + 1) + ".gif");
try {
mediaImage.use();
light[i] = mediaImage.getImage();
} catch (ConnectionException e) {
} catch (UIException e) {
}
}
- これで配列light[]はそれぞれに電光のイメージ画像を持ちました。では実際にアニメーションとしてこれらを表示させましょう。
g.drawImage(light[roll], 105, 105);
- rollは、アニメーションの速度を管理するフィールドです。0〜3迄の整数値のいずれかを持ちます。
/**アニメーション用フィールド*/
private int roll;
private int roll;
- このrollの値変動はrun()メソッド内で行う事にしましょう。参照値は時間を管理するフィールドtimeです。
public void run() {
for (;;) {
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
}
time++;
if (time % 10 == 0) {
roll++;
if (roll > 3) {
roll = 0;
}
}
}
}
for (;;) {
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
}
time++;
if (time % 10 == 0) {
roll++;
if (roll > 3) {
roll = 0;
}
}
}
}
- rollは1秒間に約3回、その値を変えます。つまりそれを参照して表示を変更させている電光イメージは3fps ―frame Par Second― でアニメーションする事になります。
- この様に、アニメーションは特に難しい処理を行う事無く表現する事が可能です。
- 参照値の変動速度を変えてみたり、フラグを用いてキー入力される迄はアニメーションしない様にする等、工夫次第では非常に面白いものが仕上がるでしょう。