人工知能に関する断創録

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

とびらを開ける

今回はとびら

f:id:aidiary:20100410211845g:plain

です。作り方は宝箱とほとんど同じなので簡単に流します。

rpg19.jar

とびらイベント

とびらはイベントファイルの中に書かれています。こんな感じです。

   DOOR,7,10

このマップの座標(7,10)にとびらをくっつけるという意味です。これだけ。宝箱より簡単です。

イベントクラス

宝箱がEventクラスを拡張したTreasureEventクラスで定義されているようにとびらもEventクラスを拡張したDoorEvent クラスで定義します。

public class DoorEvent extends Event {
    /**
     * @param x X座標
     * @param y Y座標
     */
    public DoorEvent(int x, int y) {
        // とびらのチップ番号は18でぶつかる
        super(x, y, 18, true);
    }
    
    /**
     * イベントを文字列に変換(デバッグ用)
     */
    public String toString() {
        return "DOOR:" + super.toString();
    }
}

とびらのチップ番号は18番です。あととびらの上に乗れたら(?)意味がないのでぶつかるようにします。Eventクラスのコンストラクタの最後の引数isHitでぶつかるかどうか指定できました。super()でEventクラスを呼び出すときにtrueを与えてぶつかるようにしてます。

イベントのロード

イベントをロードするのはMapクラスのloadEvent()です。

    if (eventType.equals("CHARA")) {  // キャラクターイベント
        makeCharacter(st);
    } else if (eventType.equals("TREASURE")) {  // 宝箱イベント
        makeTreasure(st);
    } else if (eventType.equals("DOOR")) {  // とびらイベント
        makeDoor(st);
    }

イベントファイルのDOORを見つけたらmakeDoor()でとびらを作ります。

    /**
     * とびらイベントを作成
     */
    private void makeDoor(StringTokenizer st) {
        // とびらの座標
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        // とびらイベントを作成
        DoorEvent d = new DoorEvent(x, y);
        // とびらイベントを登録
        events.add(d);
    }

宝箱と同じです。

あける

最後にとびらをあける処理です。とびらの目の前でスペースキーを押したらとびらが開くようになってます。

    if (spaceKey.isPressed()) {  // スペース
        // 移動中は表示できない
        if (hero.isMoving()) return;

        // しらべるの処理

        // とびら
        DoorEvent door = hero.open();
        if (door != null) {
            // ドアを削除
            map.removeEvent(door);
            
            return;
        }
        
        // はなすの処理
    }

まだコマンドを用意してないのではなすもしらべるもとびらも全部スペースキーを押したら起動するようにしてます。この順番はけっこう意味があります。足元に宝箱があって目の前に人がいる場合宝箱をしらべる方が優先されます。これは私の人間観察から導き出した結論です(笑)

open()は目の前にとびらがあるか調べるメソッドです。あればそのDoorEventオブジェクトを返します。なければnullです。ある場合はremoveEvent()でイベントを削除しています。削除されればとびらはなくなります。今回は鍵がないのでDoorEventはかなり単純でした。プライバシーを確保したかったら鍵を実装してみてください。