コードの記述 その3 ファイターを動かす

図形の描画の章で赤丸を動かしたのと同様に、ここではファイターを動かしてみましょう。前回はキーを打つたびに上下左右に動くようにしましたが、今回はキーを押している限り上下左右に動くようにしてみましょう。

まず、StarJet.javaファイルに追加していきます。47行目から53行目までのprocessEvent( )関数を変更しましょう。

    public void processEvent(int type, int param) {
        if (type == Display.KEY_RELEASED_EVENT) {
            if (param == Display.KEY_SOFT1) {
                (IApplication.getCurrentApp()).terminate();
            }
        }
    }

48行目の次のようなコードを追加します。

    public void processEvent(int type, int param) {
        if (type == Display.KEY_PRESSED_EVENT) {
            // カーソルキーを押したとき
            switch (param) {
            case Display.KEY_LEFT:
                fighter.dx = -2;
                break;
            case Display.KEY_RIGHT:
                fighter.dx = 2;
                break;
            case Display.KEY_UP:
                fighter.dy = -2;
                break;
            case Display.KEY_DOWN:
                fighter.dy = 2;
                break;
            default:
                break;
            }
        }

        if (type == Display.KEY_RELEASED_EVENT) {
            if (param == Display.KEY_SOFT1) {
                (IApplication.getCurrentApp()).terminate();
            }
            // カーソルキーを離したとき
            switch (param) {
            case Display.KEY_LEFT:
            case Display.KEY_RIGHT:
                fighter.dx = 0;
                break;
            case Display.KEY_UP:
            case Display.KEY_DOWN:
                fighter.dy = 0;
                break;
            default:
                break;
            }
        }
    }

49行目から65行目までは、コメントにもあるとおり、上下左右のカーソルキー(矢印キーともいう)を押したときの処理を記述しています。

fighter.dxというのはFighterクラスで定義されている変数dxを差し、x座標の増分を表しています。左矢印が押されたときはx座標が-2だけ増えます。つまり左に2ピクセル分動くということですね。同様に右矢印が押されたときはx座標が2だけ増えて、右に2ピクセル分動くことになります。

Fighter.dyはy座標の増分ですから、上矢印で上へ2ピクセルだけ、下矢印で下に2ピクセルだけ動くということを表しています。

71行目から83行目までは、上下左右のカーソルキーを離したときの処理です。左右のカーソルキーのどちらかを離したらdxすなわちx方向の増分が0に、上下のカーソルキーのどちらかを離したらdyすなわちy方向の増分が0になるわけです。

次は、キー操作で動いた場所にファイターのイメージを表示するためのコードをFighter.javaファイルに追加していきます。29行目から始まるmove( )関数に以下のようにコードを追加します。

    public void move() {
        xpos += dx;
        ypos += dy;
        g.drawImage(fighterImage, xpos, ypos);
    }

xpos += dxというコードは、xposにdxを追加するという意味で、xpos = xpos + dxと同じ意味合いを持ちます。さて、ここでいったんソースコードを保存して、「ビルド」が通ったら「起動」をクリックして、エミュレータできーの入力どおりにファイターが動き回ることを確認しましょう。

あれっ、画面からはみ出しちゃいますね。これはちょっとまずいので。はみ出さないように修正をかけていきましょう。

    public void move() {
        xpos += dx;
        ypos += dy;
        
        // はみだしチェック x方向
        if (xpos < 0) {
            xpos = 0;
        } else if (xpos > Display.getWidth() - fighterImage.getWidth()) {
            xpos = Display.getWidth() - fighterImage.getWidth();
        }
        // はみ出しチェック y方向
        if (ypos < 0) {
            ypos = 0;
        } else if (ypos > Display.getHeight() - fighterImage.getHeight()) {
            ypos = Display.getHeight() - fighterImage.getHeight();
        }
        
        g.drawImage(fighterImage, xpos, ypos);
    }

もう1度、保存して「ビルド」、「実行」で動作を確認してください。もう、はみ出したりしていませんよね。