[map.cpp]
マップ管理プログラム編の続きとなります。
●map_Init
マップ管理のモジュールを初期化します。
この関数の主な役割は、マップ定義を内部変数に保存することです。
//----------------------------------------------------------------------
// マップ管理の初期化。マップを定義を設定する。
//----------------------------------------------------------------------
void map_Init(MapDefine_t mapDefines[])
{
// マップ定義の保存
MapMngData.mapDefines = mapDefines;
MapMngData.cur_mapDef = NULL; //今有効なマップはない。
MapMngData.allMapData = NULL; //今有効なマップはない。
}
マップのロードされた情報をなどを破棄します。
//----------------------------------------------------------------------
// マップ管理の終了。確保したマップ・メモリの破棄。
//----------------------------------------------------------------------
void map_End()
{
// 破棄
map_DeleteMapData(); // 前のマップデータの破棄
map_DeleteCharData(); // 前のキャラクタの破棄
}
マップロードのための関数です。
前のマップの情報を破棄して、mapNameで検索して同じ名前を持つマップ定義の情報に
もとづいてマップとマップ固有キャラクタをロードします。
ロードしたマップのサイズ情報を呼び元の関数に戻り値として返します。
//----------------------------------------------------------------------
// マップのロード。必要に応じて前のマップの破棄。マップのサイズを返す。
//----------------------------------------------------------------------
MapSize_t map_Load(char *mapName)
{
MapSize_t mapSize={0,0,0,0};
// 破棄
map_DeleteMapData(); // 前のマップデータの破棄
map_DeleteCharData(); // 前のキャラクタの破棄
// ロード
map_LoadMapData(mapName); // 新しいマップデータをロード
map_LoadCharData(); // 新しいキャラクタをロード
// マップのサイズを返す。
mapSize.cx = MapMngData.fmfHeader.dwWidth; // マップの横幅
mapSize.cy = MapMngData.fmfHeader.dwHeight; // マップの高さ
mapSize.px = mapSize.cx * MapMngData.fmfHeader.byChipWidth; // マップチップ1つの幅(pixel)
mapSize.py = mapSize.cy * MapMngData.fmfHeader.byChipHeight;// マップチップ1つの高さ(pixel)
return mapSize;
}
指定された左上座標からのマップを画面いっぱいに描画します。
同時にマップ固有のキャラクタも描画します。
マップ描画の考え方は、表示するピクセル座標からマップデータの座標(マップチップ単位)
を求めて画面の端から描画していきます。ややこしいので細かく解説しますね。
説明を簡単にするために、マップチップが20x10個並んだマップデータと考えてください。
で、画面はワザと小さくしてマップチップ3x2個分のサイズだとします。
ちなみに1つのマップチップは32x32ピクセルとします。
で普通にマップが表示されると下図のようになります。
赤い線がウィンドウの枠で、白い線で囲まれた四角がマップチップです。
※ 数字はマップデータのマップチップ単位の座標です。 この状態からスクロールしてマップ左上ピクセル座標(16,16)を起点としてマップを画面に
表示する場合には、下図のようにマップチップが半分外にはみ出します。 はみ出している時、画面内に表示するマップチップが1個余分に増えてるのが分かると思います。
画面内にジャストサイズなら3x2この表示ですがズレると4x3この表示が必要になります。
で、この表示するチップ数を計算する計算式です。
chipW、chipHはマップチップのピクセルサイズです。
(マップチップ単位の値です)
int chipsX = SCREEN_X / chipW + 1;
int chipsY = SCREEN_Y / chipH + 1;
1個余分に画面に表示するマップパーツの数を計算しておきます。
ここから本格的に説明します。
次に、表示するピクセル位置から縦横のマップデータの座標を求めます。
(マップチップ単位の座標系です)
int ctopX = px / chipW;
int ctopY = py / chipH;
それとマップのピクセル位置から描画するマップチップのオフセットを求めておきます。
つまりはみ出したピクセルサイズですね。
(ピクセル単位の座標系です)
int cofX = px % chipW;
int cofY = py % chipH;
これらの値を使ってマップを描画しますよ。
まず、chipsX,chipsYでループしてマップを描画します。
(マップチップ単位の座標系です)
for( int x=0 ; x>5つまり32で割った値です。
(frame+MapMngData.MapChar[cn].AnimOfs)>>5
char_Drawで実際に描画します。
と言う事で長くなってきたので、またまた続きます。