勇者は第一歩を踏み出した
マップに勇者を乗せて移動できるようにしましょう。勇者が第一歩を踏み出すときがきました。
勇者をキーボードで動かす
まず勇者がマップ上のどの位置にいるかを表す変数(x,y)を用意します。そして、勇者の位置を(1,1)に初期化しています。これは、マップの1行1列に勇者がいることを表しています。
// 勇者の位置を初期化 x = 1; y = 1;
勇者の移動はキーボードで行います。キーボードの使い方(2005/1/15)を見てください。コードでは、keyPressed()に移動処理を書いています。
public void keyPressed(KeyEvent e) { // 押されたキーを調べる int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT : // 左キーだったら勇者を1歩左へ x--; break; case KeyEvent.VK_RIGHT : // 右キーだったら勇者を1歩右へ x++; break; case KeyEvent.VK_UP : // 上キーだったら勇者を1歩上へ y--; break; case KeyEvent.VK_DOWN : // 下キーだったら勇者を1歩下へ y++; break; } // 勇者の位置を動かしたので再描画 repaint(); }
勇者が上下左右へ移動したとき、(x,y)を変化させます。(x,y)をどう変化させるかは下図を参考にしてください。8方向の変化量を描いてありますが、実際は4方向へ制限しています。
keyPressed()の中に勇者の位置を変更するコードを直接書きましたが、実はこの書き方は好ましくないようです。後で別の実装法を取り上げます。
keyPressed()の最後にあるrepaint()は非常に重要です。勇者の位置を変化させた後は必ず再描画してください。再描画しないと勇者は動きません(移動先の座標に描画されません)。私自身、repaint()を書き忘れてどうして動かないかかなり悩んだことがありました。
これで勇者を動かせるようになりました。ただ、ドラクエの移動とかなり違いますよね。ドラクエの移動はマップスクロールをしているからです。スクロール処理についてはスクロール処理1(2005/10/10)で取り上げます。あと、壁の上には乗らないでくださいね(笑)壁にぶつかる処理は次回取り上げます。