>> ゲームプログラミング入門トップに戻る

キャラを滑らせる

今回はキャラを滑らせる方法について説明します。

滑らせるというのは、移動した後にスケートみたいにスーッと滑らせることを言っています。
仕組み的には、移動してキーが離れた後に、
徐々に移動量を下げていきながらキャラをとめる、というような感じになります。

コードで表すと以下のようになります。

#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);

	if( DxLib_Init() == -1 )		// DXライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	//グラフィックハンドル
	int gh;

	//キー取得用配列
	char key[256];

	//x座標
	int x=300,y=240;

	//画像読み込み
	gh = LoadGraph("char.png");
	
	//描画先を裏画面に設定
	SetDrawScreen(DX_SCREEN_BACK);

	//移動係数
	float move=1.0f;

	//移動量用変数
	int dx=0;
	int dy=0;

	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll(key)==0){

		move=0.0f;
		
		DrawGraph(x,y,gh,TRUE);

		if(key[KEY_INPUT_LEFT]==1 || key[KEY_INPUT_RIGHT]==1){
			
			if(key[KEY_INPUT_UP]==1 || key[KEY_INPUT_DOWN]==1){
				//移動係数を0.71に設定
				move=0.71f;
			}else{
				//斜めじゃなければ1.0に設定
				move=1.0f;
			}
		}else if(key[KEY_INPUT_UP]==1 || key[KEY_INPUT_DOWN]==1){
			move=1.0f;
		}
		
		
		if(key[KEY_INPUT_LEFT]==1){
			x-=(int)6*move;
			dx=(int)-6*move;
		}
		
		if(key[KEY_INPUT_RIGHT]==1){
			x+=(int)6*move;
			dx=(int)6*move;
		}
		
		if(key[KEY_INPUT_UP]==1){
			y-=(int)6*move;
			dy=(int)-6*move;
		}
		if(key[KEY_INPUT_DOWN]==1){
			y+=(int)6*move;
			dy=(int)6*move;
		}

		//移動係数が0.0ならキーが押されていない
		if(move==0.0f){
			//まだ移動量が0でなければ
			if(dx!=0){
				if(dx<0)
					++dx;
				if(dx>0)
					--dx;
			}
			//まだ移動量が0でなければ
			if(dy!=0){
				if(dy<0)
					++dy;
				if(dy>0)
					--dy;
			}
			//移動量分動かす
			x+=dx;
			y+=dy;
		}

		if(key[KEY_INPUT_ESCAPE]==1){
			break;
		}
		
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;				// ソフトの終了 
}

これを実行すると、下記の動画のように移動後にキャラを滑らせることが出来ます。

※パソコンが低スペックなせいで全然滑ってるように見えませんねw
皆さんのパソコンでは滑らかに動作しますので一度やってみてください。

仕組みとしては、キーが押されているか居ないかを移動係数の値を見て判断しています。
何も押されていなければ0.0なのでその時に滑らせる処理を行います。
滑らせる場合は、前回の移動量を見て、徐々にその移動量から減らしていかなければなりませんので、
まず移動量を保存しておきます。それが変数dx,dyです。
通常の移動処理のところで保存してますよね?
if文内では、それぞれの移動量がプラスかマイナスかを見て、
1足すか1引くかの処理を行っています。
条件式にdy<0と書いているので、自動的に0になった時点でもう移動しなくなることがわかります。
移動直後は移動量は6かー6ですが、それを毎ループごとに、1足すか引くかして、
0になるまで移動させているということになります。
これで移動したあとにキャラを滑らかに滑らせることが可能になります。

もっと滑らかにしたければ、毎ループごとに移動量を減らすのではなくて、
2ループに一回減らすようにすれば、もっと移動距離が長くなります。
その辺は色々と工夫してやってみてください。

他にも色々な方法がありますが、今回は一番簡単な方法を使いました。
他の方法については、その内取り上げる予定です。

今回はここまで。
次回はキャラを歩かせる方法について説明します。

>> 【キャラを歩かせよう】に進む
>> ゲームプログラミング入門トップに戻る