2011年5月10日火曜日

Androidでゲーム シューティングゲームっぽい物。      その4:弾と敵が衝突したら、爆発エフェクトを動作させる

爆発エフェクトを付けてみる。

androidのアニメーション処理に関するAPIとかを使わないで、配列とカウント変数、
それからフラグ変数を使用しての作成。

参考になるのが、サンプルコードのJetBoy。
でも、JetBoyのサンプルコードよりはシンプルに考えて見たいと思って作った。

問題は画像で、JetBoyを見ると、動作ごとに画像が1枚ずつ存在していて、1枚の画像に複数の
画像を個別に読み出す仕組みにはなっていない。
どちらかと言うと、そっちの方が楽。でも、Androidでそれが出来るのかどうかわからない。

なので、画像は各動作ごとに1枚ずつ用意した。
全部で16枚。
爆発エフェクトを作成するフリーのソフト発色弾を使用し、そこから出力された物を
ペイントソフトで全て手作業で分割。
※ペイントソフトは、背景の透過処理がきちんと行えるものであれば何でもOK。
因みに使ったソフトはGIMP2です。
なにか、いい方法があればなって考えてみたけれども、思いつきません。

最初に、エフェクト用のクラスファイルを作る。
配列を作り、その配列をカウント変数で呼び出す仕組み。
フラグ変数は、敵画像に弾画像が当たったらtrueにするフラグ変数で、これは、カウント変数を
動かす為の変数、もう1つは、
画像の枚数文呼び出したら、countの値を0(この場合、配列のインデックス番号を0番)
にするフラグ変数で、このフラグはリセットを行う。

属性で必要な物は
画像を読み込む為の変数、
複数処理用に変数を定数で設定、
こんな感じ
//爆発イメージ枚数
private static final int NUM_IMAGES=16;

爆発する位置を決める為の座標値、
画像のサイズの変数、
画像を出力する為に必要な枚数を数えるカウント変数、
カウント変数を動かす為のフラグ変数、
リセットを行う為のフラグ変数。

コンストラクタでは、
配列の初期設定を行い、配列に画像ファイルを読み込む設定、
こんな感じ
/**
 * コンストラクタ
 */
public Explosion(MainPanel panel) {

/*イメージ関連の読み込み*/
//イメージファイルの数分だけ配列に入れる
img=new Bitmap[NUM_IMAGES];

Resources r=panel.getResources();

/*読み込む画像*/
img[0]=BitmapFactory.decodeResource(r,R.drawable.e1_0);
img[1]=BitmapFactory.decodeResource(r,R.drawable.e2_0);
img[2]=BitmapFactory.decodeResource(r,R.drawable.e3_0);
img[3]=BitmapFactory.decodeResource(r,R.drawable.e4_0);
img[4]=BitmapFactory.decodeResource(r,R.drawable.e5_0);
img[5]=BitmapFactory.decodeResource(r,R.drawable.e6_0);
img[6]=BitmapFactory.decodeResource(r,R.drawable.e7_0);
img[7]=BitmapFactory.decodeResource(r,R.drawable.e8_0);
img[8]=BitmapFactory.decodeResource(r,R.drawable.e9_0);
img[9]=BitmapFactory.decodeResource(r,R.drawable.e10_0);
img[10]=BitmapFactory.decodeResource(r,R.drawable.e11_0);
img[11]=BitmapFactory.decodeResource(r,R.drawable.e12_0);
img[12]=BitmapFactory.decodeResource(r,R.drawable.e13_0);
img[13]=BitmapFactory.decodeResource(r,R.drawable.e14_0);
img[14]=BitmapFactory.decodeResource(r,R.drawable.e15_0);
img[15]=BitmapFactory.decodeResource(r,R.drawable.e16_0);

画像サイズの指定、
フラグ変数の初期状態の設定、
一応、カウント値の初期状態の設定。

描画メソッドでは、
カウント変数を動かす為のフラグ変数がtrueの場合に、
画像を呼び出す設定をする。
こんな感じ
/**
* 描画
*/
public void draw(Canvas canvas) {
/*画像の出力*/
//カウント変数を動かす為のフラグ変数がtrueの場合
//カウントしたぶんだけ出力する
if(flg1==true) 
canvas.drawBitmap(img[count], x,y,null);
}

弾画像が敵画像に当たって爆発エフェクトが表示される場所の設定を行うメソッドを作る
ここで、設定する事は、敵画像の中心に爆発画像が来るように設定する。
こんな感じ
/**
* 爆発場所の設定
* 敵の中央になるように設定する
*/
public void play(float x,float y) {
/*爆発する場所を中央になるように設定*/
//x
this.x=x-size/2;
//y
this.y=y-size/2;
//カウント変数を動かす為のフラグ変数をtrueにする
flg1=true;
}

カウントを回すメソッドの作成。
ここで設定する事は、
カウント変数を動かす為のフラグ変数がtrueの場合に、カウント変数をインクリメントし、
そして、カウント変数と複数処理用に変数を定数で設定した枚数(今回読み込む画像枚数は16枚)と、
カウント変数の値が同じになったら、カウント変数を動かす為のフラグ変数をfalseにして、
リセットを行う為のフラグ変数をtrueにする。
こんな感じ
/**
* カウントをするメソッド
*/
public void count_Up() {
//カウント変数を動かす為のフラグ変数がtrueの時
if(flg1==true) {
//countをインクリメント
count++;
}

//カウント変数の値と枚数が一致した場合
if(count==NUM_IMAGES) {
//カウント変数を動かす為のフラグ変数をfalse
//カウント変数を動かす為のフラグ変数をfalseにして、countのインクリメントを止める
flg1=false;
//flg2をtrue
//flg2をtrueにして、リセットの準備態勢に入る
flg2=true;
}
}

カウントをリセットする為のメソッドの作成。
この中で設定する事は、
リセットを行う為のフラグ変数をtrueの場合、カウント変数の値を0にして、
各フラグ変数を初期状態のfalseにする。
/**
* カウントをリセットする
*/
public void reset_Count() {
//リセットを行う為のフラグ変数がtrueの時に
if(flg2==true) {
//countに0を代入
//カウント開始時の状態に戻る
count=0;
//フラグを初期状態にする
flg1=false;
flg2=false;
}
}

そして、これらを弾と敵が衝突した時に動作をするように設定をする。
弾と敵の交差を検出した時のメソッド内に、
敵の位置を取得する設定と、弾画像が敵画像に当たって爆発エフェクトが表示される場所の
設定を行うメソッドを呼び出す。
こんな感じ
//敵の位置取得
PointF enemy1_Pos=enemy1.getPos();
//爆発アニメーション
explosion.play(enemy1_Pos.x+16, enemy1_Pos.y+16);

その他、シューティングゲーム関連


0 件のコメント:

コメントを投稿