左右移動
まずは、キー入力でプレイヤーを左右に移かすとこまで作ります。←キーと→キーで移動します。
位置と速度
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方向の移動、つまりジャンプを実装してみます。