// キャラクターデータ構造体
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" );
}
|