サンプルコードのダウンロード
では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、お持ちの方はVisual C++でプロジェクトファイルを開いてください(「game_05.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「game_05.exe」をダブルクリックし、実行してみてください。
どうでしょう?画面が切り替わり、フルスクリーン化すると思います。
そして、カーソルキーでキャラクタが8方向へ移動すると思います。
というわけで、今回は4つのキー入力で8方向へキャラクタを移動させる方法を説明したいと思います。
やってはいけないのかも?
「ゲーム制作基礎 第2回」では4つのキー入力でキャラクタを4方向に動作させましたが、8方向というとよくこんな感じでやってしまいます(第2回のキー入力部分のelseを外しただけ)。
int cx=320-16,cy=240-16,mv=3; 略 //キャラクター移動 if(keyg[38]) //↑ cy-=mv; if(keyg[40]) //↓ cy+=mv; if(keyg[37]) //← cx-=mv; if(keyg[39]) //→ cx+=mv; //キャラクタ表示 BltClip(lpBack,cx,cy,32,32,lpWork,0,0,1);
たしかに、これでも8方向の移動は可能ですが、例えば右上に移動する場合はどうでしょう?
mvが3として、右に3、上に3移動しますよね?直線距離で考えると4.24264068・・・というように3よりも移動距離が大きい事になります。
ですから、このプログラムでは斜めに移動する場合、移動量がおかしいという事になります。
(あえてこれにするという考えも有りだと思いますが。)
キャラクターの8方向移動
というわけで、8方向、同じ距離で進ませるには、三角関数を使用すると、比較的簡単に出来ます。
三角関数については前回みっちりやったので大丈夫ですね?
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){ <略> // cx:座標 cy:座標 mv:移動量 float cx=320.0f-16,cy=240.0f-16,mv=3.0f; int angle=0; //サイン、コサインテーブル作成 float fsin[360],fcos[360]; int i; for(i=0;i<360;i++){ fsin[i]=(float)sin(i*3.1415926535/180); fcos[i]=(float)cos(i*3.1415926535/180); } //メインループ while(1){ WaitSet(); //現在の時間(単位:ミリ秒)取得 ClearScreen(lpBack); //バックバッファ初期化 DdTextOut(lpBack,0,0,"↑、↓、→、←で移動 pauseキーで終了",255); angle=-1; //とりあえず角度を-1にしておく //[38]↑ [40]↓ [37]← [39]→ if(keyg[38] && keyg[39]) //右上 angle=45; else if(keyg[37] && keyg[38]) //左上 angle=135; else if(keyg[37] && keyg[40]) //左下 angle=225; else if(keyg[40] && keyg[39]) //右下 angle=315; else if(keyg[38]) //↑ angle=90; else if(keyg[40]) //↓ angle=270; else if(keyg[37]) //← angle=180; else if(keyg[39]) //→ angle=0; //angleの値が変わっていたらキャラクタの座標を変更する if(angle!=-1){ cx+=fcos[angle]*mv; cy-=fsin[angle]*mv; } //キャラクタ表示 BltClip(lpBack,(int)cx,(int)cy,32,32,lpWork,0,0,1); Flip(); //フィリップ Wait(1000/60); //メッセージループへ }
まず1つ角度を表す変数を用意しておき(angle)、それをまず-1に設定しておきます。
そしてキー判定によって、そのキーが示す角度へangleを変更します。
もしangleが最初に設定した-1とは違う値だったら、キーが押されていた事になり、そのangleが示す方向へ移動させてやれば良いというわけです。
ただ、気を付けないといけないのが、キー判定の順番です。
斜め移動のキー判定を先にやってからでないと、いけません。
実際にいろいろいじってみれば何故かが解ると思います。