簡単RPG講座9-2。ウィンドウ・システム本編2

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

簡単RPG講座9-2。ウィンドウ・システム本編2

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

[winMng.cpp]
プログラム編の続きです。

●winmng_NewWin
ウィンドウテーブルのbLiveをチェックして空いているウィンドウ番号を割り当てます。
割り当てたウィンドウに指定した座標、サイズ、名前のパラメータを設定して、戻り値は割り当てられたウィンドウの番号を返します。それと同時に新しく割り当てたウィンドウはアクティブ・ウィンドウ(操作対象ウィンドウ)になります。
もしウィンドウをWINDOW_MNG_MAX超えて閉じ忘れたりするとエラーになります。

CODE:

//----------------------------------------------------------------------
//	ウィンドウを生成します。
//----------------------------------------------------------------------
int winmng_NewWin(int px,int py,int sizex,int sizey,char *winName)
{
	MACRO_ASSERT( px>=0 );
	MACRO_ASSERT( py>=0 );
	MACRO_ASSERT( sizex>0 );
	MACRO_ASSERT( sizey>0 );
	
	//	bLiveがFALSEなウィンドウをサーチします。
	for( int i=0 ; i=0 );
	MACRO_ASSERT( winno=0  ; i-- ) {
			if( s_winData.win[i].bLive ) {
				s_winData.ActiveNo = i;
				return;
			}
		}
	}
}
●winmng_DelAllWin
全てのウィンドウを無条件に破棄します。
この関数は、初期化替わりに使ってもOKです。

CODE:

//----------------------------------------------------------------------
//	全てのウィンドウを破棄します。
//----------------------------------------------------------------------
void winmng_DelAllWin()
{
	//	全てのウィンドウのbLiveをFALSEにします。
	for( int i=0 ; i=0 );
	MACRO_ASSERT( winno 0 ) {
			//	開始フレームと今フレームから経過フレーム数を求めます。
			int passFrame = s_winData.frame - s_winData.win[winno].startFrame;
			//	それをスピードで割れば今の表示ポイントが分かります。
			//	演算順位で処理されれるとは言えカッコで囲んでおきましょう。
			s_winData.win[winno].msgNowPoint = (passFrame/speed);
		} else {
			//	最初から全てを表示。
			s_winData.win[winno].msgNowPoint = 1024;	//最大文字数を仮定で。
		}
		
		//	ポーズカーソルのフラグをOFF
		s_winData.win[winno].bPause = FALSE;	//	待機カーソル
		
		//	文字描画を描画なしの仮で呼び出して、文字列端で決定ボタンを
		//	押されたらTRUEで戻ります。
		int rtn = winmng_DrawMsg(winno,FALSE);
		switch( rtn ) {
		case DRAWMSG_RTN_CONTINE:	//表示継続中
			break;

		case DRAWMSG_RTN_WINEND:	//ウィンドウの終端
			//	ポーズカーソルのフラグ
			s_winData.win[winno].bPause = TRUE;	//	待機カーソル
			//	決定ボタンを受け付ける。
			if( g_MainData.key[g_MainData.key_act] == 1) {
				//	表示開始位置を変更する。
				s_winData.win[winno].msgStart = s_winData.win[winno].msgEnd;
				s_winData.win[winno].startFrame = s_winData.frame;	//開始フレームを再設定。
			}
			break;

		case DRAWMSG_RTN_MOJIEND:	//文字列終端
			//	ポーズカーソルのフラグ
			s_winData.win[winno].bPause = TRUE;	//	待機カーソル
			//	決定ボタンを受け付ける。
			if( g_MainData.key[g_MainData.key_act] == 1) {
				return TRUE;
			}
			break;
		}
	}
	//	文字列終端に達していない。
	return FALSE;
}
●winmng_SetMenu
アクティブなウィンドウをメニューモードにしてメニューの内容を設定します。

CODE:

//----------------------------------------------------------------------
//	ウィンドウに表示するメニューを設定。
//----------------------------------------------------------------------
void winmng_SetMenu(char **menulist)
{
	//	リストをメニューモードに設定する。
	winmng_SetItemList( menulist, WIN_MODE_MENU );
}
●winmng_SelectMenu
メニューの操作と決定ボタンの判定します。
上下なら、選択されているリストの番号を更新します。
決定ボタンなら、今選択されているリストの番号を持ち帰ります。それ以外は-1を持ち帰ります。

CODE:

//----------------------------------------------------------------------
//	ウィンドウのメニューを変更する。
//----------------------------------------------------------------------
int winmng_SelectMenu()
{
	//	アクティブなウィンドウがあるなら
	if( s_winData.ActiveNo != -1 ) {
		int winno = s_winData.ActiveNo;
		
		//	メニュー・ウィンドウじゃないならバグ
		MACRO_ASSERT( s_winData.win[winno].mode==WIN_MODE_MENU);
		
		//	キー入力で選択します。今のところ上下のみ予定。
		if( g_MainData.key[g_MainData.key_up] == 1) {
			s_winData.win[winno].itemNo--;//上に
			//	アンダーのガード
			if( s_winData.win[winno].itemNo = s_winData.win[winno].listNums ) {
				s_winData.win[winno].itemNo = 0;//下に行き過ぎると上に戻る。
			}
		}
		//	決定ボタンを押されたら、押されたときに指していたメニュー番号を持ち帰ります。
		if( g_MainData.key[g_MainData.key_act] == 1) {
			return s_winData.win[winno].itemNo;
		}
	}
	
	//	選択が決定されていない。
	return -1;
}
●winmng_SetList
アクティブなウィンドウをリストモードにしてリストの内容を設定します。
この処理はメニュー処理と共通です。

CODE:

//----------------------------------------------------------------------
//	ウィンドウに表示するデータリストを設定。
//----------------------------------------------------------------------
void winmng_SetList(char **datalist)
{
	//	リストをリストモードに設定する。
	winmng_SetItemList( datalist, WIN_MODE_LIST );
}
●winmng_CheckCloseList
これはシンプルで、決定ボタンなら今選択されているリストの番号を持ち帰ります。それ以外は-1を持ち帰ります。

CODE:

//----------------------------------------------------------------------
//	ウィンドウの閉じるボタンをチェック
//----------------------------------------------------------------------
int winmng_CheckCloseList()
{
	//	アクティブなウィンドウがあるなら
	if( s_winData.ActiveNo != -1 ) {
		int winno = s_winData.ActiveNo;
		
		//	リスト・ウィンドウじゃないならバグ
		MACRO_ASSERT( s_winData.win[winno].mode==WIN_MODE_LIST);
		
		//	決定かメニュー(キャンセル)を押されたら、リストは終了です。
		if( g_MainData.key[g_MainData.key_act] == 1 ||
			g_MainData.key[g_MainData.key_menu] == 1) {
			return TRUE;
		}
	}
	
	//	閉じていません。
	return FALSE;
}
●winmng_Draw
有効なウィンドウを若い番号から描画します(若い番号のウィンドウは下に隠れます)。
アクティブなウィンドウは無条件に最後の一番上に描画します。

CODE:

//----------------------------------------------------------------------
//	有効なウィンドウの描画。全てのウィンドウを表示する。
//----------------------------------------------------------------------
void winmng_Draw()
{
	//	bLiveなウィンドウを若い番号から表示します。ただし、アクティブウィンドウは後回しに。
	for( int i=0 ; i<WINDOW_MNG_MAX  ; i++ ) {
		if( s_winData.win[i].bLive ) {
			if( i != s_winData.ActiveNo ) {
				//	ウィンドウを表示する。
				winmng_DrawWin( i, FALSE );
			}
		}
	}
	//	アクティブなウィンドウを表示します。
	if( s_winData.ActiveNo!=-1 ) {
		winmng_DrawWin( s_winData.ActiveNo, TRUE );
	}
}
と長くなってきたので次は、内部関数編に分けます。
外部関数は以上です。
最後に編集したユーザー softya(ソフト屋) on 2010年11月28日(日) 19:13 [ 編集 1 回目 ]

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