フレーム値を渡さないとタイミングが管理できません。
関数と引数を仮に決めてみる。
必要な機能の羅列から機能を満たす関数を書きだしています。
気に入るまで何回も書きなおした結果です。
// ウィンドウの生成・破棄
ウィンドウ番号 = window_NewWin(サイズ、表示座標、ウィンドウ名); マルチなウィンドウを管理できる。
window_DelWin(ウィンドウ番号);
window_DelAllWin();
// ウィンドウの切り替え
window_SetActiveWin(ウィンドウ番号); アクティブ(前面)なウィンドウを番号で切り替える。
ウィンドウ番号 = window_GetActiveWin();
// 基準フレーム設定。一番最初に呼び出すこと。
window_SetFrame(フレーム);
// ウィンドウにメッセージを表示。アクティブなウィンドウに表示する。
window_SetMsg(文字列);
BOOL 出力終了フラグ = window_UpdateMsg(SPEED); 文字列の表示位置をスピードに合わせて進める。
// ウィンドウにメニューを表示。アクティブなウィンドウに表示する。
window_SetMenu(メニュー項目リスト);
選択番号 = window_SelectMenu();
// 有効なウィンドウの描画。全てのウィンドウを表示する。
window_Draw();
使うプログラムを仮に書いてみる。
実際に利用例を書いてみて問題がないか検証します。
static int msg_winno = -1;
test_msg(int frame)
{
// 最初のフレーム?
window_SetFrame(frame);
if( frame == 0 ) {
// ウィンドウを生成してメッセージを設定。
msg_winno = window_NewWin(20,5,10,10,"テスト");
window_SetMsg("テストメッセージですよ。");
}
// 毎フレームの更新
if( window_UpdateMsg(50) ) {
// メッセージが終了ならばウィンドウを消去。
window_DelWin(msg_winno);
// シナリオを次に進める。
未定
}
// 有効なウィンドウの描画
window_Draw();
}
内部の管理変数や構造体を作る。
じゃあ、今回は構造体や定数を作っていきましょう。
まず最大ウィンドウ数は決め打ちです。 で表示モードもメッセージ、メニューの2種類。 ウィンドウ毎に必要な情報は
// ウィンドウ毎の情報構造体
typedef struct {
まず有効かどうかのフラグです。
int bLive; // 有効なウィンドウ
それとウィンドウの位置やサイズですね。あとウィンドウ名。
// ウィンドウ情報
int px; // ウィンドウのピクセル位置X
int py; // ウィンドウのピクセル位置Y
int sizex; // ウィンドウのピクセルサイズX
int sizey; // ウィンドウのピクセルサイズY
char *winName; // ウィンドウ名
で先程も書いたモードです。
// 処理モード
int mode; // 現在のモード(メッセージ、メニュー)
メッセージの時必要そうな要素。時間経過の計測や表示した位置を覚えます。
// メッセージ
char *msg; // 文字列
int msgPoint; // 表示位置
int startFrame; // 開始フレーム
メニューは、メニューのリストと今の選択番号が必要ですね。
// メニュー
char **menuList;//メニュー項目リスト
int menuNums; //メニュー項目数
int menuNo; //選択番号
} WindowData_t;
// Windowの制御構造体
typedef struct {
WindowData_t win[WINDOW_MNG_MAX]; // ウィンドウ毎のデータ
int ActiveNo; // アクティブ・ウィンドウの番号
int frame; // 今のフレーム
} WindowMng_t;
どんな風に使うか関数と見比べて想像してみてください。
次回は、プログラムを発表します。