読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



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

Javagame

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

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)で取り上げます。あと、壁の上には乗らないでくださいね(笑)壁にぶつかる処理は次回取り上げます。