■キャラクタのアニメーション処理

ここでは、Javaゲーム−>インベーダのプログラム説明の部分で説明したキャラクタ表示を一歩進めて、PackManを例にとって、キャラの向きによるアニメーション切り替えの方法を説明します。ここで行っている処理は、方向とアニメーションイメージのこま数で2次元配列とした方法です。

↑元ネタファイルはこちら

STEP.1 イメージ領域を準備します。

 方法はインベータと同じですが、イメージ領域を2次元配列で取得しています。


Image PackImage[][] = new Image[4][5]; PackManのイメージ領域です。
Image[方向][こま数]で定義されています。
int dir PackMan方向です。



STEP.2 用意したイメージ領域にイメージファイルを読み込みます。

 インベーダと同じように、イメージファイルを読み込む為、dataload()を作っています。

public void dataload() {
  MediaTracker mt = new MediaTracker(this);
  for (int j =0; j<4; j++){
     for (int i =0;i<5; i++){
      PackImage[j][i] = getImage(getCodeBase(),"image/packman"+j+i+".gif");
      mt.addImage(PackImage[j][i], 0);
    }
  }
}


で、それぞれに以下のイメージを読み込みます。

PackImage[J][I]に、以下の
イメージを読み込んでいます
J
0 1 2 3 4
I 0
1
2
3

  try{ //データを読み込むまで
    mt.waitForID(0); //処理を止めています。
    } catch(InterruptedException e) { //
    showStatus(""+e); //
    }
  }

  try以下も忘れずに付けておきましょう。


STEP3.実際に表示する。

 インベータで行っていた処理の復習ですが、表示部が少しだけ違います。

 先ず、イメージ領域uraを宣言します。

 Image ura;   //イメージ領域「ura」の宣言
 Graphics gc2; //Graphics オブジェクトを宣言
ura= createImage(300,400); //裏のイメージ領域「ura」のサイズを決める
gc2= ura.getGraphics(); //裏のイメージ領域「ura」に絵を描けるようにする

 ここで作ったイメージ領域に、グラフィックデータなどを書き込んでいきます。

 public void paint(Graphics gc){


 たとえばUfoの表示は以下の様になります
if (life == 1) { ココではlifeというパラメータが'1'の場合だけ、パックマンを表示するようになっています。
尚、左のものは例なので、実際の添付ファイルとは少し異なります。
g.drawImage(pack.PackImage[dir][status],px,py,this);
}

 最後に、正規のイメージ領域にUraをコピーして表示が完成します。

 gc.drawImage(ura, 0, 0, this); // 実際に表示するところ

 ここで、dir処理はマウス入力処理からもらっています。また、アニメーションのstatus処理は、
 statusをインクリメントすることでイメージを切り替えます。

 status++;

 statusは、4より大きくなるとだめなので、クリアを入れます。

 if (status >4){
  status = 0;
 }

この部分は、ソフト的には難しくないと思います。むしろイメージファイルを用意するほうが大変です。
Copyright (C) 錬金術師Masa
更新:2005年05月10日
http://www.katch.ne.jp/~mh524-1997/