人工知能に関する断創録

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

勇者は第一歩を踏み出した

マップに勇者を乗せて移動できるようにしましょう。勇者が第一歩を踏み出すときがきました。

rpg03.jar

勇者をキーボードで動かす

まず勇者がマップ上のどの位置にいるかを表す変数(x,y)を用意します。そして、勇者の位置を(1,1)に初期化しています。これは、マップの1行1列に勇者がいることを表しています。

    // 勇者の位置を初期化
    x = 1;
    y = 1;

勇者の移動はキーボードで行います。キーボードの使い方(2005/1/15)を見てください。コードでは、keyPressed()に移動処理を書いています。

    public void keyPressed(KeyEvent e) {
        // 押されたキーを調べる
        int keyCode = e.getKeyCode();

        switch (keyCode) {
            case KeyEvent.VK_LEFT :
                // 左キーだったら勇者を1歩左へ
                x--;
                break;
            case KeyEvent.VK_RIGHT :
                // 右キーだったら勇者を1歩右へ
                x++;
                break;
            case KeyEvent.VK_UP :
                // 上キーだったら勇者を1歩上へ
                y--;
                break;
            case KeyEvent.VK_DOWN :
                // 下キーだったら勇者を1歩下へ
                y++;
                break;
        }

        // 勇者の位置を動かしたので再描画
        repaint();
    }

勇者が上下左右へ移動したとき、(x,y)を変化させます。(x,y)をどう変化させるかは下図を参考にしてください。8方向の変化量を描いてありますが、実際は4方向へ制限しています。

f:id:aidiary:20100306231945g:plain

keyPressed()の中に勇者の位置を変更するコードを直接書きましたが、実はこの書き方は好ましくないようです。後で別の実装法を取り上げます。

keyPressed()の最後にあるrepaint()は非常に重要です。勇者の位置を変化させた後は必ず再描画してください。再描画しないと勇者は動きません(移動先の座標に描画されません)。私自身、repaint()を書き忘れてどうして動かないかかなり悩んだことがありました。

これで勇者を動かせるようになりました。ただ、ドラクエの移動とかなり違いますよね。ドラクエの移動はマップスクロールをしているからです。スクロール処理についてはスクロール処理1(2005/10/10)で取り上げます。あと、壁の上には乗らないでくださいね(笑)壁にぶつかる処理は次回取り上げます。