コードの記述 その5 敵機を増やそう

敵機が1機だけ降りてきても面白くはありませんので、ある時間間隔で次から次へと敵機が出現するように変更してみましょう。

まず、敵機をある時間間隔で出現させるために、タイマーをもうひとつ追加します。31行目の

    Enemy enemy = new Enemy(g);

を削除し、以下のコードに置き換えます。ここでは、すでにあるタイマー用の変数tmをtm1に変更し、もう1つの変数tm2を用意しています。

class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();
    Fighter fighter = new Fighter(g);
    Timer tm1, tm2;
    
    MainCanvas() {

次は、33行目以降のMainCanvas( )関数を以下のように書き換えます。

    MainCanvas() {
        setSoftLabel(SOFT_KEY_1, "END");
        setBackground(Graphics.getColorOfName(Graphics.BLUE));

        tm1 = new Timer();        //画面書き換え用のタイマー
        tm1.setTime(20);
        tm1.setRepeat(true);
        tm1.setListener((TimerListener)this);
        tm1.start();
        
        tm2 = new Timer();        //敵機生成用のタイマー
        tm2.setTime(900);
        tm2.setRepeat(true);
        tm2.setListener((TimerListener)this);
        tm2.start();
        
    }

tm2.setTime( )関数の引数が900ミリ秒になっているので、注意してください。以上の設定により、timerExpired( )関数が20ミリ秒ごとと、900ミリ秒ごとの二つのタイミングで呼び出されるようになります。

呼び出されるtimerExpired( )側では、どちらのタイミングで呼び出されたのかを、引数のsourceという変数で調べることができるようになっています。

では最初に、10行目に以下の行を追加します。こではJ2MEの持っているVectorという可変長のオブジェクトの配列を使いますよ。という意味になります。Vectorについては「J2MEのCLDC API仕様を参照可能に」でインストールしたCLDC Library API 仕様をWebブラウザで開いて、java.utilをクリックしてからVectorをクリックして参照してみてください。

import java.util.Vector;

次は、32行目に以下の行を追加します。enemyListという配列変数に、新しく生成した敵機を追加していくようにします。

class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();
    Fighter fighter = new Fighter(g);
    Vector enemyList = new Vector();
    Timer tm1, tm2;

次に、96行目以降のtimerExpired( )関数を以下のように書き換えていきましょう。

    public void timerExpired(Timer source) {
        if (source == tm1) {
            // tm1からの呼び出しで、画面を書き換える
            int id;
            
            g.lock();
            g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
            fighter.move();
            
            for (id = 0; id < enemyList.size(); id++) {
                Enemy enemy = (Enemy)enemyList.elementAt(id);
                boolean f = enemy.move();
                if (! f) {        //画面の外にはみ出したら
                    enemyList.removeElementAt(id);    //敵機をリストから削除
                }
            }
            
            g.unlock(true);
        } else if (source == tm2) {
            //tm2からの呼び出しで、敵機を生成する
            Enemy enemy = new Enemy(g);
            enemyList.addElement(enemy);
        }
    }

ここまで来たら、ここでいったんソースコードを保存し、「ビルド」、「実行」してみましょう。「ビルド」でエラーが出るようでしたら、ソースコードを良く見なおしてください。エラーが出ずに「実行」ができたら、今度は、敵機が次から次へと降り注いでくる画面が表示されるように待ったはずです。

画面イメージ

なんとなく、ゲームっぽくなってきましたね。