人工知能に関する断創録

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

左右移動

まずは、キー入力でプレイヤーを左右に移かすとこまで作ります。←キーと→キーで移動します。

mariolike01.jar

位置と速度

Playerクラスを見てください。横スクロールのアクションゲームでは位置と速度によってプレイヤーを動かします。

    // 位置
    private double x;
    private double y;

    // 速度
    private double vx;
    private double vy;

速度は位置の変化量です。ボールを動かす(2004/9/19)に詳しい説明があるので見てください。今回は左右の移動だけなのでx方向の速度のみ使います。ジャンプ処理を追加するとy方向の速度も考える必要がでてきますが、今回は左右移動なので使いません。

プレイヤーを移動させたいときは速度の値を変更します。

    /**
     * 左に加速する
     */
    public void accelerateLeft() {
        vx = -SPEED;
    }

    /**
     * 右に加速する
     */
    public void accelerateRight() {
        vx = SPEED;
    }

左へ移動する場合はvxをマイナスの値にし、右へ移動する場合はvxをプラスの値にします。ちなみにaccelerateは加速するという意味です。accelerateLeft()、accelerateRight()では位置の変更はしてないことに注意してください。位置の変更は update()にまとめています。

    /**
     * プレイヤーの状態を更新する
     */
    public void update() {
        x += vx;
        y += vy;
    }

今回は、vyは0なのでY方向(縦方向)へは移動しません。

ゲームループ

最後にゲームループです。

    /**
     * ゲームループ
     */
    public void run() {
        while (true) {
            if (leftPressed) {
                // 左キーが押されていれば左向きに加速
                player.accelerateLeft();
            } else if (rightPressed) {
                // 右キーが押されていれば右向きに加速
                player.accelerateRight();
            } else {
                // 何も押されてないときは停止
                player.stop();
            }

            // プレイヤーの状態を更新
            player.update();

            // 再描画
            repaint();

            // 休止
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

押されているキーに応じて左右のどっち方向に加速するか決めてからupdate()でプレイヤーを動かしています。キーが押されてない場合はstop()を呼び出して速度を0にしています。つまり、キーが押されてない場合はプレイヤーは動きません。

次回は、Y方向の移動、つまりジャンプを実装してみます。