人工知能に関する断創録

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

二段ジャンプ

前に加速アイテムを導入しましたが、今回はもう1つ別のアイテムを追加してみます。じゃーん、

f:id:aidiary:20100306224246g:plain

このアイテムを取るとなんと二段ジャンプできるようになります。どっから二段ジャンプが出てきたかというとアクトレイザーというアクションゲームで二段ジャンプができたからです。確か二段目のジャンプで翼が生えてより高いところまでジャンプできました。面白い仕組みで大変感動した覚えがあります。

mariolike11.jar

JumperTwoクラス

まずはアイテムのクラスを見てみます。加速アイテム(Accelerator)とほとんど同じです。小さいクラスなので全部載せます。

public class JumperTwo extends Sprite {
    // アイテムをとったときの音
    private AudioClip sound;

    public JumperTwo(double x, double y, String fileName, Map map) {
        super(x, y, fileName, map);
        
        // サウンドをロード
        sound = Applet.newAudioClip(
                    getClass().getResource("se/pyoro57_b.wav"));
    }

    public void update() {
    }
    
    /**
     * サウンドを再生
     */
    public void play() {
        sound.play();
    }
    
    /**
     * アイテムを使う
     */
    public void use(Player player) {
        // プレイヤーが二段ジャンプ可能に!
        player.setJumperTwo(true);
    }
}

主な違いはuse()です。ここでは、PlayerクラスのsetJumperTwo()を呼び出しています。引数にtrueを渡すとプレイヤーが二段ジャンプできるようになります。falseを渡すとできなくなります。アイテムの配置や取得したときの処理はAcceleratorと全く同じなのでもう解説はいいですかね。アイテムの配置、アイテムの取得を見てください。今はアイテムを取った時点ですぐ効果が現れるようになってます。アイテムを保存しておいて、何かボタンを押すと使えるように拡張できるとさらに面白くなります。Playerクラスにアイテムを入れるVectorを用意して取得したアイテムオブジェクトをそこに放り込んでいけばいいでしょう。何かボタンが押されたらuse()を呼び出せば使えます。

二段ジャンプの実装

では、二段ジャンプの実際の処理を見てみます。Playerクラスです。

    // 二段ジャンプ能力の有無
    private boolean jumperTwo;
    // 二段ジャンプできるかを表すフラグ(すでに二段ジャンプ中ならできない)
    private boolean canJumperTwo;
    
    /**
     * ジャンプする
     */
    public void jump() {
        // 地上にいるか再ジャンプ可能なら
        if (onGround || forceJump) {
            // 上向きに速度を加える
            vy = -jumpSpeed;
            onGround = false;
            forceJump = false;
        } else if (jumperTwo && canJumperTwo) {
            // 二段ジャンプ能力を持ち、かつ二段ジャンプ中じゃなければ
            // 二段ジャンプ可能
            vy = -jumpSpeed;
            // 二段ジャンプ中なのでしばらく(着地まで)お待ちください
            canJumperTwo = false;
        }
    }

jumperTwoがtrueだと二段ジャンプできるようになります。さっき、player.setJumperTwo(true)でアイテムを取ったらtrueになるように設定しましたね。

次に、二段ジャンプなのでjump()メソッドを改造します。新たにジャンプできる条件が加わっているのがわかります。jumperTwoが trueでかつcanJumperTwoがtrueのときにさらにジャンプできます。ミソはcanJumperTwoです。trueのとき再ジャンプ可能にし、falseのときできなくします。ここでは、二段ジャンプ中はcanJumperTwoをfalseにして、さらなるジャンプはできないようにしています(だから二段ジャンプなわけです)。そして着地したときにtrueに戻しています(update()内にあります)。jumperTwoと canJumperTwoは別物ですので注意してください。jumperTwoが二段ジャンプ能力を持っているか持っていないかを表しているのに対し、 canJumperTwoは二段ジャンプする際にさらにジャンプできるかできないかを制御しています。もっとわかりやすい名前を付ければよかったかな。

二段ジャンプを多段ジャンプにするのは結構簡単です。canJumperTwoなどでジャンプ回数を管理しないで何回でもジャンプできるようにすればいいわけです。これができると簡単だけど面白いミニゲームが作れます。今度作ってみます。