コードの記述 その7 ぶつかり判定

敵機とファイターが接触したら、やっぱり爆発してほしいですよね。というわけで、次は敵機とファイターのぶつかり判定と、爆発シーンの追加になります。

ぶつかり判定を行うには、ファイターの左上のポジションとその幅と高さ、および敵機の左上のポジションとその幅と高さの情報が必要になります。ファイター、敵機とも左上のポジションは(fighter.xpos, fighter.ypos)および (enemy.xpos, enemy,ypos)で取り出せますが、どちらも幅と高さを取り出すことができません。よって、Fighter.javaとEnemy.javaに幅と高さを取り出すための関数を追加してやります。

まず、Fighter.javaの編集に入ります。Notepad++のFighter.javaのタブをクリックしてください。Fighter.javaファイルの30行目近辺のFighter( )関数とmove( )関数の間に、以下の2つの関数を追加します。

    public int getWidth() {     //イメージの幅を返す
        return fighterImage.getWidth();
    }
    
    public int getHeight() {     //イメージの高さを返す
        return fighterImage.getHeight();
    }

同様に、Enemy.javaの編集に入ります。Enemy.javaファイルの60行目近辺にも、以下の2つの関数を追加します。

    public int getWidth() {    //イメージの幅を返す
        return enemyImage.getWidth();
    }
    
    public int getHeight() {    //イメージの高さを返す
        return enemyImage.getHeight();
    }

次に、StarJet.javaファイルに、ぶつかり判定を入れましょう。StarJet.javaファイルの最後の閉じ括弧の直前の行に、hitCheck( )関数を追加します。

        }
    }
    
    private boolean hitCheck() {
        int id;
        int fighterWidth = fighter.getWidth();
        int fighterHeight = fighter.getHeight();

        for (id = 0; id < enemyList.size(); id++) {
            Enemy enemy = (Enemy)enemyList.elementAt(id);
            int enemyWidth = enemy.getWidth();
            int enemyHeight = enemy.getHeight();
            
            //敵機を1つずつ、ファイターとぶつかっていないかどうかを調べる
            if (enemy.xpos + enemyWidth - 4 > fighter.xpos 
                    && enemy.xpos < fighter.xpos + fighterWidth - 4
                    && enemy.ypos + enemyHeight - 4 > fighter.ypos 
                    && enemy.ypos < fighter.ypos + fighterHeight - 6) {
                return true;    //ぶつかった
            }
        }
        
        return false;        //一つもぶつからなかった
    }
}

敵機とファイターがぶつかったときの、爆発イメージを読み込むコードを追加しましょう。まず先に、爆発イメージを格納する変数を用意します。MainCanvas( )関数の手前に以下の行を追加してください。

    Timer tm1, tm2;
    int appearTerm = 900;
    Image bangImage;
    
    MainCanvas() {

次にMainCanvas( )関数内で、爆発のイメージを読み込みます。MainCanvas( )関数内部のタイマー設定の直前に、次のコードを追加してください。

    MainCanvas() {
        setSoftLabel(SOFT_KEY_1, "END");
        setBackground(Graphics.getColorOfName(Graphics.BLUE));
        
        //爆発イメージの読み込み
        try {
            MediaImage m = MediaManager.getImage("resource:///bang.gif");
            m.use();
            bangImage = m.getImage();
        } catch(Exception e) {
            System.out.println("bang.gifが見つかりません");
        }

        tm1 = new Timer();        //画面書き換え用のタイマー

最後に、timerExpired( )関数の中に、hitCheck( )関数を呼び出し、もしぶつかっていたら爆発イメージを表示するコードを追加します。g.unlock(true);の直前の行に、以下のコードを追加してください。

            //ぶつかったら、爆発シーンを表示してゲームオーバー
            if (hitCheck()) {
                tm1.stop();        //tm1タイマーを止める
                tm2.stop();        //tm2タイマーを止める
                g.drawImage(bangImage, fighter.xpos - 4, fighter.ypos - 4);
            }
            
            g.unlock(true);

では、ソースコードを保存して、「ビルド」、「実行」と進めましょう。敵機とぶつかってしまったら、また「実行」ボタンを押してください。はじめからやり直しになります。

画面イメージ

どうでしょうか、それなりに遊べるゲームになってきたのではないでしょうか。