キャラクターの移動


キャラクターの座標を表す変数はキャラクターデータ構造体の中に、
次のように宣言しています

Character.cppより
// キャラクターデータ構造体
struct CHARACTER_DATA
{
	int PosX;       // 現在の描画位置( X座標 )
	int PosY;       // 現在の描画位置( Y座標 )
	int NowBlockX;  // 現在のブロック単位での位置( X座標 )
	int NowBlockY;  // 現在のブロック単位での位置( Y座標 )
	int NextBlockX; // 次に移動するブロック単位での位置( X座標 )
	int NextBlockY; // 次に移動するブロック単位での位置( Y座標 )
	int Direction;  // 向き( 0:下 1:左 2:上 3:右 )
	int Anim;       // アニメーションカウンター( 2パターンアニメなので 0 or 1 )
	int AnimWeight; // アニメーション切り替えのきっかけのカウンター
};

キャラクターの座標もブロック単位での管理になるので、
キー入力に応じて次のように移動させます

Character.cppより
		// キー入力チェック→移動
		int NextBlockX = CharaData.NextBlockX;
		int NextBlockY = CharaData.NextBlockY;

		// キー入力があったら、新たな目的地を設定します
		if( PressKey[PRESS_KEY_DOWN] ){
			CharaData.Direction = 0;
			NextBlockY++;
		}else if( PressKey[PRESS_KEY_LEFT] ){
			CharaData.Direction = 1;
			NextBlockX--;
		}else if( PressKey[PRESS_KEY_UP] ){
			CharaData.Direction = 2;
			NextBlockY--;
		}else if( PressKey[PRESS_KEY_RIGHT] ){
			CharaData.Direction = 3;
			NextBlockX++;
		}
		// 次の目的地が進入可能かどうかのチェック
		if( CheckMapState( NextBlockX, NextBlockY ) == 0 ){
			// 進入可能だったら目的地を更新
			CharaData.NextBlockX = NextBlockX;
			CharaData.NextBlockY = NextBlockY;
			
		}

キー入力に応じて向きの変更と座標の変更を行っています
CheckMapStateで次に移動したい座標の進入可/不可をチェックし、
進入可の場合のみ座標の変更をしています

これだけではキャラクターは32ピクセル単位での移動しか行わないので、
ブロックとブロックの間を補間し、スムーズに動いているようにします
まずブロック単位の座標をピクセル単位に変換します

Character.cppより
	int NextPosX = CharaData.NextBlockX * BLOCK_SIZE;
	int NextPosY = CharaData.NextBlockY * BLOCK_SIZE;

そして、ピクセル単位での移動を表している変数と比較します

Character.cppより
	bool MoveNow = true;
	if( (CharaData.PosX == NextPosX)
		&& (CharaData.PosY == NextPosY) )
	{
		// 目的地に到達しているので現在停止中
		MoveNow = false;
	}

NextPosXとNextPosYは移動の目的となる座標をピクセル値に変換したものなので、
ピクセル単位での移動を表すCharaData.PosXとCharaData.PosYがそこに到達していれば、
移動は終了ということです
逆に到達していない場合は移動処理を行います

Character.cppより
	// 移動の処理
	if( MoveNow ){
		// 現在移動中
		// 自動で座標を目的地まで進めます
		int MoveValue = 4 * ANIME_RATE;
		if( NextPosX > CharaData.PosX )CharaData.PosX += MoveValue;
		if( NextPosY > CharaData.PosY )CharaData.PosY += MoveValue;
		if( NextPosX < CharaData.PosX )CharaData.PosX -= MoveValue;
		if( NextPosY < CharaData.PosY )CharaData.PosY -= MoveValue;
	}else{
		// 現在停止中
		// キー入力チェック→移動
		int NextBlockX = CharaData.NextBlockX;
		int NextBlockY = CharaData.NextBlockY;
						:
						:

CharaData.PosXとCharaData.PosYが実際に描画する値です
アニメーションと向きも考慮して、描画は次のように行います

Character.cppより
// キャラクターを描画
void DrawCharacter()
{
	int sx = CharaData.Direction * BLOCK_SIZE;
	int sy = CharaData.Anim * BLOCK_SIZE;
	int h = BLOCK_SIZE;int w = BLOCK_SIZE;
	int dx = CharaData.PosX;
	int dy = CharaData.PosY;
	DrawSurface( sx, sy, w, h, dx, dy, "poyo" );
}



ゲームの構成
アニメーション処理
マップデータ
コインデータ
キャラクターの移動
敵キャラクターの思考パターン
敵キャラクターとのあたり判定
最後に

ゲーム「GetAndRun」

戻る