サンプルコードのダウンロード

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

記事検索

アーカイブ