敵は、1体のみの設定で、画面右端から移動してきて、座標値X=300付近で
敵の移動を停止し、弾を発射する。
専用のクラスファイルを作り、その中で設定したこと。
変数の設定
座標値x,y
移動値move_x,move_y;
画像サイズsize
画像イメージの変数img
保管場所の設定
(定数)
private static final PointF point=new PointF(画面に描画されない場所);
コンストラクタの中身
画像の読み込み
保管場所から敵弾を呼び出してセットする。
移動設定メソッド
ここでは、弾を移動させるだけの設定と、画面左端に弾が到達したら
保管場所に移動するメソッドの呼び出しを行う。
描画メソッド
画像の描画のみ
その他
SurfaceViewを設定しているクラスファイルで呼び出すために作ったメソッドと、
同じクラスファイルの中で使用するメソッドの設定
敵の弾の位置を返す
public PointF getPos() {
return new PointF((int)x,(int y));
}
敵の弾の位置をセットする
public void setPos(float x,float y) {
this.x=x;
this.y=y;
}
敵の弾を保管場所に移動させるメソッド
保管場所にあるかどうかのチェックをするメソッド
次にSurfaceViewを設定しているクラスファイルでの設定。
設定する事は、複数処理を施すこと、連射機能をつける事。
この2つに絞って作って見る。
①複数処理について
変数の設定
複数処理は、配列の要素に複数処理用の変数を入れるので、その為の定数を作る。
private static final int NUM_ATTACKS2=5;
敵の弾を作ったクラスファイルの呼び出し
ファイルの名前は、E2_Shot.java
private E2_Shot[] attack2;
コンストラクタでは、配列の初期化を行う
attack2=new E2_Shot[NUM_ATTACKS2];
for(int i=0;i<NUM_ATTACKS2;i++)
attack2[i]=new E2_Shot(this);
描画メソッドの呼び出し
for(int i=0;i<NUM_ATTACKS2;i++)
attack2[i].draw(canvas);
敵弾の移動専用のメソッドを作成して、その中で移動メソッドを呼び出した
public void attack_Move() {
for(int i=0;i<NUM_ATTACKS2;i++)
attack2[i].move();
}
②連射機能について
連射機能は、時間を取得し、最初に発射した弾と次に発射した弾の時間を比較し、
比較した結果で次の弾を発射できるようにする設定を行う。
変数の設定
//次の発射までの時間
private static int attack2_interval=500;
//最後に発射した時間
private long attack2_lastTime;
③敵の弾の発射制御メソッドの作成
このメソッドの中身では、敵の弾が保管場所にある場合、弾をセットして1発発射したら
抜けるという仕組みのメソッド。
こんな感じ
public void tryToAttack() {
// 前との発射間隔がshot_interval以下だったら発射できない
//発射できるかどうかチェックする
//発射できない場合・・・return
if(System.currentTimeMillis()-shot_lastTime<shot_interval)
return;
//最後に発射された時間を取得する
//shot_lastTimeに入れる
shot_lastTime=System.currentTimeMillis();
for(int j=0;j<NUM_ATTACK2;j++) {
if(attack2[j].isInStorage()) {
//弾が保管庫にあれば発射できる
//弾の座標を敵の座標にセットすれば発射される
if(enemy2.flg2==true) {
//敵の位置の取得
PointF enemy2_Pos=enemy2.getPos();
//取得した敵の位置を弾の位置にセットする
attack2[j].setPos(enemy2_Pos.x+16, enemy2_Pos.y+16);
//一発発射した抜ける
break;
}
}
}
}
④runメソッドで呼び出す
①で作った、attack_Move()メソッドと、③で作ったtryToAttack()メソッドをrun()メソッドで呼び出す。
その他、シューティングゲーム関連
0 件のコメント:
コメントを投稿