人工知能に関する断創録

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

勇者はがにまたが直った

前回までの勇者はどの方向に移動してもこっちを向いていました。ドラクエ1と同じです。これだとあまりかっこよくないので移動する方向をちゃんと向くようにしてみます。

rpg06.jar

四方向の画像を用意する

用意した画像は下のです。前回と同じく足踏みさせるので各方向の画像を2枚ずつ用意しました。countが0のとき左の画像を表示し、countが 1のとき右の画像を表示するのは前回と同じです。今回は、それに加えて勇者の向いている方向に応じて4種類の画像を切り替えます。

f:id:aidiary:20100327200909g:plain

どの方向を向いているか

向いている方向によって画像を切り替えたいので、まずは、勇者の向いている方向を表す変数directionを用意します。directionは DOWN(下向き)で初期化しています。

    // 勇者の向いている方向(LEFT,RIGHT,UP,DOWNのどれか)
    private int direction;    
    direction = DOWN;

次に、移動したときに向いている方向が変わるようにするので、move()を改造します。

    private void move(int dir) {
        // dirの方向でぶつからなければ移動する
        switch (dir) {
            case LEFT :
                if (!isHit(x - 1, y)) x--;
                direction = LEFT;
                break;
            case RIGHT :
                if (!isHit(x + 1, y)) x++;
                direction = RIGHT;
                break;
            case UP :
                if (!isHit(x, y - 1)) y--;
                direction = UP;
                break;
            case DOWN :
                if (!isHit(x, y + 1)) y++;
                direction = DOWN;
                break;
        }
    }

移動した方向にあわせてdirectionを変更しています。ここで、実際に移動できなかった場合でも向いている方向を変えている点に注意してください。ドラクエでは壁があって進めなくても勇者の向きだけは変わっていました。

画像の表示

画像の表示は前回のようにcountで左右の画像変えると同時にdirectionで4枚の画像を切り替えます。

    private void drawChara(Graphics g) {
        // countとdirectionの値に応じて表示する画像を切り替える
        g.drawImage(heroImage,
                    x * CS, y * CS,
                    x * CS + CS, y * CS + CS,
                    count * CS, direction * CS,
                    count * CS + CS, direction * CS + CS,
                    this);
    }

directionの取る値はLEFT(0)、RIGHT(1)、UP(2)、DOWN(3)で各方向を向いている勇者のイメージが並ぶ順番と同じです。つまり、directionがLEFT(0)のときは上から0番目の左を向いている勇者の画像を表示します。directionがRIGHT(1) のときは上から1番目の右を向いている勇者の画像を表示します。以下同様です。図示すると下のようになります。

f:id:aidiary:20100327200908g:plain