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

では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、をお持ちの方はVisual C++でプロジェクトファイルを開いてください(「game_06.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「game_06.exe」をダブルクリックし、実行してみてください。
どうでしょう?画面が切り替わり、フルスクリーン化すると思います。
そして、カーソルキーを押すと、キャラクターが動くと思います。
というわけで今回は、慣性の法則を使用したキャラ移動について解説したいと思います。

慣性の法則とは?

慣性の法則とは、私も詳しくは知りませんが、「物体は同じ運動を続けようとする」とかそんな感じの法則だった気がします。
宇宙空間のような摩擦の少ない場所で、一度動き出すと何かにぶつかったりするまで動き続けるというやつです。
スケートで一度動き出したらなかなか止まらない現象も同じですね。
詳しく知りたいなら物理の先生とかに聞いてください。

過去のゲームでも慣性を使用したゲームなんて腐るほどありますよね?
月面着陸ゲームだとか。
Bio100%さんの蟹味噌もそうですね。
使い道はいろいろあるので覚えておいても損は無いでしょう。

実際にプログラムを組む

ではサンプルコードを見ていきます。

//----------[ メイン関数 ]----------------------------------------------------------------------
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){
    
	<略>

	//    cx:座標     cy:座標 mv:加速度   
	float cx=320.0f-16,cy=240.0f-16,mv=0.1f;
	float cmx=0.0f,cmy=0.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){
			cmx+=fcos[angle]*mv;
			cmy-=fsin[angle]*mv;
		}

		cx+=cmx;
		cy+=cmy;

		
		//跳ね返る
		if(cx<0){		//左
			cx=0.0f;
			cmx=-cmx;
		}
		if(cx>640-32){	//右
			cx=float(640-32);
			cmx=-cmx;
		}
		if(cy<0){		//上
			cy=0.0f;
			cmy=-cmy;
		}
		if(cy>480-32){	//下
			cy=float(480-32);
			cmy=-cmy;
		}

		//キャラクタ表示
		BltClip(lpBack,(int)cx,(int)cy,32,32,lpWork,0,0,1);
		Flip();						//フィリップ
		Wait(1000/60);				//メッセージループへ
	}

では、順番に解説して行きたいと思います。

	float cmx=0.0f,cmy=0.0f;		//移動量(慣性
	<略>
	cx+=cmx;
	cy+=cmy;

移動量(cmx,cmy)は毎回キャラクタの座標を移動させる値です。
例えば、cmxを5.0に設定しておけばキャラは右へ移動し続けます。
で、キー入力により、この移動量を変えることによって、慣性の法則のようなものが実現できるというわけです。

今まではキー入力でそのままキャラの座標を変更していましたが、慣性を使用する場合はキー入力で移動量を変化させ、移動量によって毎回キャラクターを移動させます。

それから、ついでなのでキャラクターを画面の端で跳ね返らせる事にします(そうしないと直ぐ画面外に行ってしまう)。

		//跳ね返る
		if(cx<0){		//左
			cx=0.0f;
			cmx=-cmx;
		}
		if(cx>640-32){	//右
			cx=float(640-32);
			cmx=-cmx;
		}
		if(cy<0){		//上
			cy=0.0f;
			cmy=-cmy;
		}
		if(cy>480-32){	//下
			cy=float(480-32);
			cmy=-cmy;
		}

例えば、左端の壁を越えてしまった(cxが0より小さくなった)場合は、まずcxを0にします。
これをやらないとキャラクターが埋まってしまったり、帰ってこなくなる場合があるからです(^^;
で、移動量(cmx)の符号を反転させてやります。

記事検索

アーカイブ