[td=border:をpx;solid #cccccc;]
メニュー編
[/td]
[/tr][/table]
長らくお待たせしました。
フィールド操作のメニュー仕上げ編をお届けします。
仮で組み込んであったものを移動したりしてますのでややこしいですが、よろしくお願いします。
今回の概要
それでは始めましょう。winMng.cpp メニューに合わせて新機能を追加。
party.cpp 新規です。今回は主人公ひとりですが、パーティ(仲間)を組んだことを考えてパーティと言う名前にしました。
gameMain.cpp → menu.cpp 仮だったメニューを専用のモジュールに移動しました。
[main.cpp]
●Title関数
まず、面倒だったのでmainでの名前入力の遷移を取り消しています。
※ 必要に応じて後で復活させます。
//----------------------------------------------------------------------
// タイトル画面
//----------------------------------------------------------------------
GameState_t Title()
{
// センター上気味にタイトル文字表示
CenterDrawString( GAME_TITLE_STR, 32, 160, GetColor(255,255,255) );
// HIT ANY KEY
CenterDrawString( "HIT ANY KEY", 20, 240, GetColor(155,155,255) );
// 何かキーが押された?
if( g_MainData.AllKeyCount == 1 ) {
// 次のフレームは名前入力へ。しばらく使わないのでコメント化
// return GAME_STATE_NAME;
// 次のフレームはゲーム本編へ
return GAME_STATE_MAIN;
}
// 継続
return g_MainData.gameState;
}
[winMng.h]
ヘッダに新機能の関数宣言を追加しています。
●追加 [winMng.cpp]
新機能を追加します。
●enum追加
// ウィンドウモード
enum {
WIN_MODE_MSG, //メッセージ・モード
WIN_MODE_MENU, //メニュー・モード
WIN_MODE_LIST, //リスト・モード
WIN_MODE_UPDATE, //同じモードのまま更新
};
リスト内容を更新する受付関数です。実際にはwinmng_SetItemListで処理します。
//----------------------------------------------------------------------
// ウィンドウのメニューを更新する。
//----------------------------------------------------------------------
void winmng_UpdateMenu(char **menulist)
{
// リストを更新する。
winmng_SetItemList( menulist, WIN_MODE_UPDATE );
}
WIN_MODE_UPDATEが追加されたので処理を振り分けています。
WIN_MODE_UPDATEなら選択番号がリストの範囲外なら補正をします。
それ以外は従来通りの処理をします。
//----------------------------------------------------------------------
// (内部)リストを設定する。
//----------------------------------------------------------------------
static void winmng_SetItemList(char **itemlist,int mode)
{
// アクティブなウィンドウがあるなら
if( s_winData.ActiveNo != -1 ) {
int winno = s_winData.ActiveNo;
// リストを設定します。
s_winData.win[winno].itemList = itemlist;
// 項目数を数えます。(最大値は適当です)
s_winData.win[winno].listNums = 0;
for( int m=0 ; m<LIST_MAX ; m++ ) {
if( itemlist[m] == NULL ) {//ストッパ?
break;
} else {
s_winData.win[winno].listNums++;
}
}
// 更新モード?
if( mode == WIN_MODE_UPDATE ) {
// 選択番号がアイテム数を超えていたら
if( s_winData.win[winno].listNums <= s_winData.win[winno].itemNo ) {
// 選択番号は最後の番号にします。
s_winData.win[winno].itemNo = s_winData.win[winno].listNums-1;
}
} else {
// 処理モード
s_winData.win[winno].mode = mode; // 現在のモード
// 選択番号は0に仮定します。
s_winData.win[winno].itemNo = 0;
}
}
}
「カラー変更を処理するか?」のコメント部分が追加された処理で、今回の場合は文字カラーをグレー(灰色)に変更する機能を追加しています。先頭に"/g"の文字列があればグレーに変更するのですが、制御コードを表示しない様に後ろに+2ずらしています。
//----------------------------------------------------------------------
// (内部)文字列描画処理
//----------------------------------------------------------------------
static int winmng_DrawString(int px,int py,char *str,int fonttype,int color,int bDraw)
{
// 文字フォント
static int bInit = FALSE; // 初期化済み
static int FontHandles[FONT_TYPE_MAX]; // フォントハンドル
// 未初期化ならフォントハンドルを作成。
if( bInit==FALSE ) {
bInit = TRUE;
// フォントのハンドルを作成。
for( int f=0 ; f<FONT_TYPE_MAX ; f++ ) {
FontHandles[f] = CreateFontToHandle(s_FontData[f].name,s_FontData[f].size,-1,-1);
}
}
// カラー変更を処理するか?
if( str[0] == '/' ) {
switch( str[1] ) {
case 'g':
// グレー
color = GetColor(128,128,128);
// バッファを変更する。
str+=2;
break;
}
}
// 描画するか?
int sizex = 0;
if( bDraw ) {
// 文字列を描画
DrawStringToHandle( px,py,str,color,FontHandles[fonttype] );
} else {
// 文字列長だけを得る。
sizex = GetDrawStringWidthToHandle(str,(int)strlen(str),FontHandles[fonttype] ); //文字表示の幅を得る。
}
return sizex;
}
次は新規追加のモジュールです。