キャラクタを動かす

次はキーを押したときのハンドラの作成です。
ダイアログベースの場合はボタンをつけて、上下左右でもよかったのですが、やはりキーを使わないと雰囲気が出ませんね。

ダイアログベースで、その上にピクチャーを貼り付けても良いのですが、まあこのまま行きましょう。

では、キーのハンドラは以下のようにつくます。

1 クラスウィザードを起動する
2 オブジェクトIDが、CrpgView にする。
メッセージの中の WM_KEYDOWN を見つけてダブルクリックする
これはタイマをつけるのと同じ手順です。
3 下のメンバ関数に ON_WM_KEYDOWN というのが出るのでこれをダブルクリックする

以上で、キーを押したときのハンドラが作成されました。
ハンドラの中は次のように書きます。
 

 // CRpgView クラスのメッセージ ハンドラ
 void CRpgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
 {
 // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
 
 switch (nChar){
  case VK_RIGHT:
  posi_x +=32;
  break;
  case VK_LEFT:
  posi_x -=32;
  break;
  case VK_DOWN:
  posi_y += 32;
  break;
  case VK_UP:
  posi_y -= 32;
  break;
 }
 
 InvalidateRect(0, FALSE);
 
 CView::OnKeyDown(nChar, nRepCnt, nFlags);
 }
 

n_Char の中に押されたキーのコードが入ってきます。

VK_RIGHT とか、VK_LEFT というのは、入ったキーコードの名前です。
入っているキーのコードを見てそれぞれキャラクタの位置を変更してやります。

ここで動けるかどうか判断して動けるようなら座標を変更します。
動けるかどうかの判断は、動ける範囲にいるか、岩や、川があるかどうかなどを判断します。
いまのままでは何も判断していないので、見えなくなってもどこまでも動いていきます。

最後の

InvalidateRect(0, FALSE);

は、ウィンドウズに描画をさせるコマンドです。
このコマンドを実行すると、ウィンドウズは、描画エリアの中の変更のあった部分だけを書き換えます。

一番最後の行の

CView::OnKeyDown(nChar, nRepCnt, nFlags);

ですが、どうもこれは関数の最後に置くのが普通のようなので、このコードの上に自分のコードを書きましょう。

これで背景の上をキャラクタが動けるようになりました。
しかし単純な動きです。
ゲームとしてのクオリティをあげるためにはキャラクタの歩く動作をアニメーションさせる、動く方向ごとに別のCGを用意する、というような工夫が必要になります。