サンプルコードのダウンロード
では、まずサンプルコードをダウンロードし、解凍してください。
私は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が示す方向へ移動させてやれば良いというわけです。
ただ、気を付けないといけないのが、キー判定の順番です。
斜め移動のキー判定を先にやってからでないと、いけません。
実際にいろいろいじってみれば何故かが解ると思います。







