いよいよゲーム本編に組み込みます。
●ヘッダです
今回追加した、パーティとメニューを追加します。 ●定数
メニュー側に移したので以下のenumを削除します。
// メニューの状態
enum {
MENU_STATE_TOP, //メニューTOP
MENU_STATE_POWER, //つよさ
MENU_STATE_ITEM, //アイテム
MENU_STATE_MAGIC, //まほう
MENU_STATE_MAX, //メニューの状態の数
};
ゲーム本編のデータの構造体ですが、メニューの状態管理オブジェクトがなくなっていて主人公のパラメータが追加されました。
// ゲーム本編のデータの構造体。
typedef struct {
GameMainInitType_t initType; //初期化タイプ
int bFirstInit; //一回目の初期化済みのフラグ。
STATEMNG_OBJECT StateObj; //ゲーム本編の状態管理オブジェクト
int beforeBattleInState; //バトル開始前の状態
// 主人公のパラメータ(セーブ対象)
PlayerParam_t playerParam; //プレイヤーパラメータ
// マップ移動に関連したデータ(セーブ対象を含む)
MapMoveInfo_t mapMoveData;
} GameMainData_t;
初期化は、メニューの状態管理オブジェクトが無くなって代わりにメニューの初期化とパーティ(プレーヤーのパラメータ)を初期化が追加されています。
//----------------------------------------------------------------------
// ゲーム本編の初期化
//----------------------------------------------------------------------
void GameMain_Init(GameMainInitType_t initType)
{
// モードの設定
s_GameMainData.initType = initType;
// 初回?
if( s_GameMainData.bFirstInit == FALSE ) {
s_GameMainData.bFirstInit = TRUE;
// ゲーム本編の状態管理オブジェクトの作成。
// オブジェクトと言ってもC++のクラスとは無関係です。
s_GameMainData.StateObj = STM_Init(GAMEMAIN_STATE_MAX);
// 主人公キャラオブジェクトの作成。
s_GameMainData.mapMoveData.PlayerObj = char_Load(PLAYER_FILENAME,PLAYER_CHAR_XNUM,PLAYER_CHAR_YNUM);
// 主人公キャラオブジェクトの仮の初期座標や向き
s_GameMainData.mapMoveData.player_px = ((SCREEN_X/CHAR_PIXEL_SIZEX)/2-1) * CHAR_PIXEL_SIZEX;
s_GameMainData.mapMoveData.player_py = ((SCREEN_Y/CHAR_PIXEL_SIZEY)/2+2) * CHAR_PIXEL_SIZEY;
s_GameMainData.mapMoveData.player_muki = CHAR_MUKI_DOWN;
// マップ管理の初期化
map_Init(g_MapDefDatas);
// イベント処理の初期化
event_Init("town"); //初期スタートのマップ情報
// 起動するイベントの情報を設定する。
event_SetEvent(EVENT_TYPE_NEW_START,0); //初期スタート時イベント
// パーティ(プレーヤーのパラメータ)を初期化
party_init(&(s_GameMainData.playerParam));
// メニュー初期化
menu_Init();
}
// ゲーム本編の状態を初期化
STM_ChangeState(s_GameMainData.StateObj,GAMEMAIN_STATE_MAPLOAD);//マップロード処理へ遷移。
}
ゲーム本編の終了は、メニューの状態管理オブジェクトが無くなって代わりにメニュー終了が追加されています。
//----------------------------------------------------------------------
// ゲーム本編の終了
//----------------------------------------------------------------------
void GameMain_End()
{
// ゲーム本編の状態管理オブジェクトの破棄
STM_End(s_GameMainData.StateObj);
// 主人公キャラオブジェクトの破棄。
char_Delete(s_GameMainData.mapMoveData.PlayerObj);
// マップ管理の終了
map_End();
// メニュー終了
menu_End();
}
メニューはmenu.cppに中身が引っ越したので凄くシンプルでになりました。
menu_Main()からの戻り値がTUREならメニューを閉じでマップ移動に遷移します。
それ以外はメニューを継続します。
//----------------------------------------------------------------------
// メニュー中
//----------------------------------------------------------------------
static void GameMain_Menu()
{
// 今のフレーム
int frame = STM_GetFrameCount(s_GameMainData.StateObj);
// 実際のメニュー処理
if( menu_Main(frame,&(s_GameMainData.playerParam)) ) {
// メニューが終了ならば全ウィンドウを消去。
winmng_DelAllWin();
// 次のフレームで遷移。
STM_ChangeState(s_GameMainData.StateObj,GAMEMAIN_STATE_MOVE);//マップ移動へ遷移。
}
// マップとキャラクタ表示処理
mapMove_Draw(&s_GameMainData.mapMoveData,frame,FALSE);
// 有効なウィンドウの描画
winmng_Draw();
}
最後に、今回のプロジェクトです。 今回は、TKOZさんに頼んでマップを変更してもらっていますので前回と変わっています。
なのでデータとしてもダウンロードして下さい。
次回はダンジョンの接続とお店、宝箱処理をお届けする予定です。