人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

エイリアン襲来

エイリアン

f:id:aidiary:20090901211805g:plain

を実装します。

invader04.jar

まずはエイリアンの属性と機能をまとめたAlienクラスを作ります。エイリアンの属性として

    private int speed;   // 移動スピード
    private int x;       // プレイヤーの位置(x座標)
    private int y;       // エイリアンの位置(y座標)
    private int width;   // エイリアンの幅
    private int height;  // エイリアンの高さ
    private Image image; // エイリアンの画像

などが考えられます。どこかで見たことありますよね。実はPlayerクラスやShotクラスとほぼ同じです。プレイヤーもエイリアンも元をたどれば兄弟ってことですね(笑)

プレイヤー、エイリアン、弾などはスプライトと呼ばれ、共通した属性を持ちます。このように共通した属性を持つクラスは継承を使って書くほうがスマートです。たとえば、上に挙げた属性を持つSpriteクラスを作り、Player、Shot、Alienは Spriteを継承するように書くといいでしょう。継承については後で取り上げます。

あとエイリアンに使うイメージですが、エイリアンのイメージを使いました(自作です^^)。よく見るともぞもぞ動いていますね。プログラム中で複数の画像を切り替えることによってアニメーションさせることもできますが、ここではもっと簡単なGIFアニメーションを使っています。 JavaでGIFアニメーションを描画すると自動的にアニメーション表示してくれて便利です。GIFアニメーションの作り方はまた別の機会に取り上げます。

次にエイリアンの移動処理です。プログラムを実行してもらうとわかりますが、エイリアンは左右に移動しています。ある区間を往復運動するわけです。この処理を実現するためにエイリアンの移動範囲を指定する必要があります。

    // エイリアンの移動範囲
    private int left;
    private int right;
    
    public Alien(int x, int y, int speed, MainPanel panel) {
        ・・・
         
        // エイリアンの初期位置から移動範囲を求める
        left = x;
        right = x + MOVE_WIDTH;
        
        ・・・
    }

左端(left)はコンストラクタの引数xで右端(right)はxにMOVE_WIDTH足した値になっています(下図)各エイリアンはコンストラクタで指定されたxの値が違うので移動範囲も当然変わります。下図ではエイリアン1とエイリアン2の移動範囲をそれぞれ赤と青で表しています。

f:id:aidiary:20090901212423g:plain

エイリアンは自分の移動範囲内を往復運動します。

    /**
     * エイリアンを移動する
     * 
     */
    public void move() {
        x += speed;

        // 移動範囲を超えていたら反転移動
        if (x < left) {
            speed = -speed;
        }
        if (x > right) {
            speed = -speed;
        }
    }

移動範囲の左端leftを超えたらspeedの符号を反対にしています。こうすると逆方向に移動するわけです(跳ね返り処理)右端rightを超えた場合も同様です。

これでエイリアンを表すクラスができました。このクラスを使って実際にエイリアンを作成しているのはMainPanelクラスです。ここは特に解説する必要はないかと思います。

実行するとわかりますが、エイリアンは無敵です。絶対に倒せません(笑)弾があたったとき倒せるようにするには弾とエイリアンの衝突検出を実装する必要がありますね。次回取り上げます。