System4.0でメニュー拡張
System4.0のウィンドウメニューを拡張してみよう
たまーに、ウィンドウメニューからセーブを行うようなADVシステムがあると思いますが、
そういうのをちょっと作ってみようと思いました。
MenuExtension HLL Library をダウンロード
HLL追加方法は説明しません。
リファレンス
★ 必須命令 ★ WINMENU_INIT [ 引数 ] void [戻り値] void 初期化時に呼び出す。必須。 WINMENU_CHECK [ 引数 ] void [戻り値] void メニューがクリックされたかの判定。必須。 REGISTER_MSG_KEY_WAIT_CALLBACK のコールバックから呼び出せばよい。 選択肢中でもメニューを有効にしたいのならSACT改造する必要がある (CSactMenu.jafの440行辺り(forの次行)に挿入) ★ サブメニュー追加 ★ WINMENU_EXT_ADD [ 引数 ] string extName 拡張メニュー名 [戻り値] menu_locate_t メニューの位置 新しいメニューを追加する。 複数追加も可能だが、MENU_GET_LOCATE_EXT で一つしか得られないため推奨しない。 その場合はこの関数の戻り値を保存しておく。 WINMENU_APPEND_SUB_MENU [ 引数 ] menu_locate_t located 拡張メニュー名 [ 引数 ] string subName サブメニュー名 [戻り値] menu_locate_t メニューの位置 ★ 項目追加 ★ WINMENU_APPEND_MENU [ 引数 ] menu_locate_t located 拡張メニュー名 [ 引数 ] string Name メニュー表示文字列 [ 引数 ] menu_callback_t func クリック時に呼ばれるコールバック関数 [戻り値] menu_menu_id 項目ID。表示文字列を変更するのに使用する。 メニューを追加する。 WINMENU_APPEND_SEPARATOR [ 引数 ] menu_locate_t located 拡張メニュー名 [戻り値] void セパレータ(区切り線)を追加する。 ★ 追加位置取得 ★ WINMENU_GET_LOCATE_SYSTEM [ 引数 ] void [戻り値] menu_locate_t メニューの位置 「システム」メニューの位置を取得 WINMENU_GET_LOCATE_SETTING [ 引数 ] void [戻り値] menu_locate_t メニューの位置 「設定」の位置を取得 WINMENU_GET_LOCATE_HELP [ 引数 ] void [戻り値] menu_locate_t メニューの位置 「ヘルプ」メニューの位置を取得 WINMENU_GET_LOCATE_DEBUG ○注意○ 使用すべきではない [ 引数 ] void [戻り値] menu_locate_t メニューの位置 「デバッグ」メニューの位置を取得 WINMENU_GET_LOCATE_EXT [ 引数 ] void [戻り値] menu_locate_t メニューの位置 拡張したメニューの位置を取得 ★ 表示内容変更 ★ WINMENU_CHANGE_STRING [ 引数 ] menu_menu_id id 変更するメニューのID(メニュー追加時の戻り値) [ 引数 ] string newName 新しい表示名 [戻り値] void 表示名を変更する。項目追加時の戻り値が必要。 |
追加位置を取得して、追加する。
という形です。
例 : セーブロードをメニューから実行しよう
WINMENU_INIT(); WINMENU_EXT_ADD("セーブ/ロード"); WINMENU_APPEND_MENU(WINMENU_GET_LOCATE_EXT(),"Quickセーブ",&menu_callback_qsave); WINMENU_APPEND_MENU(WINMENU_GET_LOCATE_EXT(),"Quickロード",&menu_callback_qload); WINMENU_APPEND_SEPARATOR(WINMENU_GET_LOCATE_EXT()); menu_locate_t ml=WINMENU_APPEND_SUB_MENU(WINMENU_GET_LOCATE_EXT(),"セーブ"); WINMENU_APPEND_MENU(ml,"save1",&menu_callback_save1); WINMENU_APPEND_MENU(ml,"save2",&menu_callback_save2); WINMENU_APPEND_MENU(ml,"save3",&menu_callback_save3); WINMENU_APPEND_MENU(ml,"save4",&menu_callback_save4); WINMENU_APPEND_MENU(ml,"save5",&menu_callback_save5); ml=WINMENU_APPEND_SUB_MENU(WINMENU_GET_LOCATE_EXT(),"ロード"); WINMENU_APPEND_MENU(ml,"load1",&menu_callback_load1); WINMENU_APPEND_MENU(ml,"load2",&menu_callback_load2); WINMENU_APPEND_MENU(ml,"load3",&menu_callback_load3); WINMENU_APPEND_MENU(ml,"load4",&menu_callback_load4); WINMENU_APPEND_MENU(ml,"load5",&menu_callback_load5); |
を、呼び出すと、以下のようになります。
ちなみに、コールバック関数で実行されるので、以下のようにまとめます。
void menu_callback_qsave(){ save_main("qsave.asd"); } void menu_callback_qload(){ load_main("qsave.asd"); } void menu_callback_save1(){ save_main("save1.asd"); } void menu_callback_save2(){ save_main("save2.asd"); } void menu_callback_save3(){ save_main("save3.asd"); } void menu_callback_save4(){ save_main("save4.asd"); } void menu_callback_save5(){ save_main("save5.asd"); } void menu_callback_load1(){ load_main("save1.asd"); } void menu_callback_load2(){ load_main("save2.asd"); } void menu_callback_load3(){ load_main("save3.asd"); } void menu_callback_load4(){ load_main("save4.asd"); } void menu_callback_load5(){ load_main("save5.asd"); } void save_main(string savefile){ //適当に実装 } void load_main(string savefile){ //適当に実装 } |
スクリプト側で実行するのではなく、DLL側で処理を行いたい場合は、
DLLを改造してください。
ただし、
選択肢表示中のセーブ/ロードは有効ではありません。
MENU_SELECT改造サンプルを使用すれば有効になります。
(ウィンドウメニュー拡張でもセーブロードに関係する部分を含むもの固有の問題です)
(その他の場合は、MENU_SELECT中に実行させるのは、CSactMenuの440行辺りにWINMENU_CHECKを入れれば良いです)
こういうこともできます。
> このサンプルをダウンロード <
Developed using Alicesoft System4.0
どうやってるの?
サンプルに書きました。
感想
トリッキーです。特にセーブ・ロード・選択肢との連携はトリッキーすぎです。
セーブロード系ではない用途で使用するならば、比較的実用的なのではないかと思います。
セーブロード系で使用するのは、どうかとおもいます。例えば、ヘルプの下に、リンクやゲーム制作者クレジットをのせるとかなら、いいんじゃないかな。