// キャラクターデータ構造体 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; // アニメーション切り替えのきっかけのカウンター }; |
// キー入力チェック→移動 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; } |
int NextPosX = CharaData.NextBlockX * BLOCK_SIZE; int NextPosY = CharaData.NextBlockY * BLOCK_SIZE; |
bool MoveNow = true; if( (CharaData.PosX == NextPosX) && (CharaData.PosY == NextPosY) ) { // 目的地に到達しているので現在停止中 MoveNow = false; } |
// 移動の処理 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; : : |
// キャラクターを描画 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" ); } |