コードの記述 その4 敵機の定義

ここでは敵機を定義していきます。ファイターを定義した時と同様に、まず開発ツールの「プロジェクト」メニューから「ソースファイルの新規作成」を選択してください。

画面イメージ

続けて、「ソースファイルの新規作成」ダイアログが出ますので、ソースファイル名に「Enemy.java」と入力し、「テンプレートを利用する」のチェックを外し、「作成」ボタンを押してください。

画面イメージ

Notepad++の画面が出てきましたが、今回もEnemy.javaの中身は空っぽになっています。ではまた、がんばってコードを入力していきましょう。

/*
 * Enemy.java
 */
 
import com.nttdocomo.ui.*;
 
public class Enemy {
    int xpos = Display.getWidth() / 2;
    int ypos = 0;
    int dx = 0;
    int dy = 0;
    Graphics g = null;
    Image enemyImage = null;
    
    // 敵機の左右と上下の動きの定義
    int [] xDelta = {0, 1, 1, 1, 0, -1, -1, -1, 0, 0, 1, 0, 1, -1, 0, 1, 0, 1, 1, 0};
    int [] yDelta = {1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    
    int count = 0;        // move()関数が呼び出された回数
    
    Enemy(Graphics g) {
        this.g = g;
        
        try {
            MediaImage m = MediaManager.getImage("resource:///enemy.gif");
            m.use();
            enemyImage = m.getImage();
        } catch(Exception e) {
            System.out.println("enemy.gifイメージが見つかりません");
        }
    }
    
    public boolean move() {
        count++;
        int tick = 10;    // tickの回数分同じ動きをする
        int xid = (count / tick) % xDelta.length;    // xDeltaのid番目のデータ
        int yid = (count / tick) % yDelta.length;    // yDeltaのid番目のデータ
        
        xpos += xDelta[xid];    // x方向の増分を加える
        ypos += yDelta[yid];    // y方向の増分を加える
        
        // はみだしチェック x方向
        if (xpos < -3) {
            xpos = -3;
        } else if (xpos > Display.getWidth() - enemyImage.getWidth() + 3) {
            xpos = Display.getWidth() - enemyImage.getWidth() + 3;
        }
        
        // はみ出しチェック y方向
        if (ypos < 0) {
            ypos = 0;
        }
        
        if (ypos > Display.getHeight()) {    // 下側に消えていった
            return false;
        } else {    // まだいるぞ
            g.drawImage(enemyImage, xpos, ypos);
            return true;
        }
    }
}

ほとんどFighter.javaファイルと一緒ですので、Enemy.javaファイルにあってFighter.javaファイルにないコードについてのみ説明していきます。

16,17行目のxDeltaとyDeltaは要素数20個の整数の配列変数です。xDeltaは敵機のx方向の増分を定義しています。yDeltaは敵機のy方向の増分を定義しています。このxDeltaとyDeltaの組み合わせで、敵機の画面上での動きを定義しています。

34行目のcount変数は、move( )関数が呼び出されるごとにインクリメントしていきます。ちなみにcount++はcount = count + 1と同じ意味になります。

36,37行目はxDelta配列とyDelta配列の何番目のデータを取り出すかを計算しています。xidもyidもtick回のあいだは、同じ値となるようにしています。そうして、39,40行目でx方向の増分とy方向の増分をそれぞれxposとyposに追加しています。

43行目から47行目までは、x方向のはみだしチェックをしています。ファイターの時と違って、±3だけはみだしを許しています。

45行目から59行目までは、敵機が下りてきて下のほうへ消えていくかどうかのチェックをしています。まだ消えていなかったら敵機を新しい位置に表示してtrueを返してmove( )関数は終了します。敵機が消えてしまったら、表示は行わないでfalseを返してmove( )関数を終了します。move( )関数がtrueを返すのかfalseを返すのかは呼び出し元である判断に使う予定です。

ここで、Enemy.javaファイルを保存しておきましょう。

StarJet.javaファイルにも、ファイターの時と同じように2行ほどコードの追加があります。まず31行目に次のように1行追加します。

class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();
    Fighter fighter = new Fighter(g);
    Enemy enemy = new Enemy(g);
    
     MainCanvas() {

次に92行目以降のtimerExpired( )関数にも1行追加します。

    public void timerExpired(Timer source) {
        g.lock();
        g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
        fighter.move();
        enemy.move();
        g.unlock(true);
    }

ここまできたら、いつものように保存して「ビルド」、「実行」の手順を繰り返します。エミュレータには、下のような表示がなされ、敵機が1機だけ上から下にフラフラしながら降りて行ったはずです。

画面イメージ