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