簡単RPG講座11-1。メニューの総仕上げ編。その1

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

簡単RPG講座11-1。メニューの総仕上げ編。その1

投稿記事 by softya(ソフト屋) » 14年前

[table=border:1px;background:#FFFFFF;padding:2px 12px 2px 12px;solid #cccccc;][tr=text-align:center;]
[td=border:をpx;solid #cccccc;]
メニュー編
[/td]
[/tr][/table]

長らくお待たせしました。
フィールド操作のメニュー仕上げ編をお届けします。
仮で組み込んであったものを移動したりしてますのでややこしいですが、よろしくお願いします。

今回の概要
winMng.cpp メニューに合わせて新機能を追加。
party.cpp 新規です。今回は主人公ひとりですが、パーティ(仲間)を組んだことを考えてパーティと言う名前にしました。
gameMain.cpp → menu.cpp 仮だったメニューを専用のモジュールに移動しました。
それでは始めましょう。

[main.cpp]
●Title関数
まず、面倒だったのでmainでの名前入力の遷移を取り消しています。
※ 必要に応じて後で復活させます。

CODE:

//----------------------------------------------------------------------
//	タイトル画面
//----------------------------------------------------------------------
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]
ヘッダに新機能の関数宣言を追加しています。
●追加

CODE:

extern void winmng_UpdateMenu(char **menulist);			//	ウィンドウに表示するメニューを更新
[winMng.cpp]
新機能を追加します。
●enum追加

CODE:

//	ウィンドウモード
enum {
	WIN_MODE_MSG,	//メッセージ・モード
	WIN_MODE_MENU,	//メニュー・モード
	WIN_MODE_LIST,	//リスト・モード

	WIN_MODE_UPDATE,	//同じモードのまま更新
};
●winmng_UpdateMenu
リスト内容を更新する受付関数です。実際にはwinmng_SetItemListで処理します。

CODE:

//----------------------------------------------------------------------
//	ウィンドウのメニューを更新する。
//----------------------------------------------------------------------
void winmng_UpdateMenu(char **menulist)
{
	//	リストを更新する。
	winmng_SetItemList( menulist, WIN_MODE_UPDATE );
}
●winmng_SetItemList
WIN_MODE_UPDATEが追加されたので処理を振り分けています。
WIN_MODE_UPDATEなら選択番号がリストの範囲外なら補正をします。
それ以外は従来通りの処理をします。

CODE:

//----------------------------------------------------------------------
//	(内部)リストを設定する。
//----------------------------------------------------------------------
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ずらしています。

CODE:

//----------------------------------------------------------------------
//	(内部)文字列描画処理
//----------------------------------------------------------------------
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;
}
以上で雑多な変更点を終わります。
次は新規追加のモジュールです。
最後に編集したユーザー softya(ソフト屋) on 2011年2月07日(月) 19:10 [ 編集 1 回目 ]

コメントはまだありません。