
ここではキャラクターを右クリックした時にポップアップメニューに表示されるオリジナルの項目、「カスタムメニュー」について説明しています。

◆カスタムメニュー実行時のモーションを決める
カスタムメニューはメニューに表示された項目をクリックすると、指定のオーダー関数に移行させることが出来ます。また、カスタムメニューの項目はCUSTOM_EVENTのイベントタイプを持つオーダー関数が少なくとも1つ以上無いと、メニューには表示されません。 今回は、カスタムメニューの項目名は「待機」にしてモーションはその場に停止するようにしますので、モーション関数は「画像をドラッグする」で作成したMO_Stop_LとMO_Stop_Rを使い回します。よって、ここではモーション関数は追加しません。
◆オーダー関数にカスタムメニュー実行時の関数を追加する
カスタムメニュー項目をクリックした時に移行するオーダー関数を追加します。それでは「メニューイベントを使う」で作成したOR_Menu_LとOR_Menu_Rをコピーして貼り付けてください。また、OR_Menu_L以下の関数は項目を一つ追加しているだけです。
まず、下の方にあるOR_Move_Up_L, OR_Move_Down_L, OR_Move_Up_R, OR_Move_Down_Rの変更点を確認して下さい。MenuItemCustomに「待機」と設定されています。ソフトを起動すると最初にこれらのオーダー関数の中からどれかが実行されるので、ポップアップメニューを出した時に表示されるカスタムメニュー項目の文字が「待機」と表示されるようになります。
それでは上に戻って確認していきます。FuncNameに任意の名前を設定し、FuncTypeにCUSTOM_EVENTを設定しています。これでポップアップメニューの「待機」をクリックした時にこのオーダー関数が実行されます。次に、MenuItemCustomに「待機おわり」と設定しています。これはカスタムメニューが実行された時にポップアップメニュー項目の文字を変更しているので「待機」中にポップアップメニューを出すとメニュー項目の文字は「待機おわり」と表示されます。また、CUSTOM_EVENTは基本的にはイベントが発生しないのでFuncListEventを削除しています。よって、フレームタイマーやメニューイベント等でイベントを発生させないと動作が変更されることは永遠にありません。
最後にOR_Menu_L, OR_Menu_RでFuncListCustomを設定して「待機」をクリックした時に指定のオーダー関数に移行するようにしています。また、OR_Custom_LとOR_Custom_Rが設定されていますが、これはカスタムメニュー項目をクリックした時に移行させたい関数が2種類(左右)あるので「画像をドラッグする」で説明した内部的なリストから直接オーダー関数を指定して実行するためです。FuncListCustomの詳細な仕様は「オーダー関数」でご確認下さい。
◆「待機」中のメニューイベントとドラッグ処理を追加する
先ほどの設定で「待機」をクリックすると静止するようになりましたが、メニューを出したりドラッグして離すと動き出してしまいます(厳密にはメニューイベント時はOR_Custom_LとOR_Custom_RにFuncListMenuが無いのでキャラクターの向きが左右ランダムになっている)。これは内部的なリストに保存された通常のメニューと通常のドラッグ操作(オーダー関数)が実行されているからです。これでも問題ない場合は良いのですがここではメニューを出したりドラッグして離してもそのまま静止するように設定していきます。メニューを出したりドラッグをしても止まったままにするには、「待機」中用のメニューとドラッグ操作のオーダー関数を追加します。それではOR_Menu_L, OR_Menu_R, OR_Drag_L, OR_Drag_Rをコピーして貼り付けてください。
まず「待機」中用のメニューイベントを見ていきます。FuncNameを「待機」中用にOR_Menu_Custom_LとOR_Menu_Custom_Rに変更しています。FuncListEventはメニューが消えた時に元の「待機」状態に移行するようにOR_Custom_LとOR_Custom_Rを設定しています。FuncListButtonはドラッグした時に「待機」中用のドラッグ処理のオーダー関数に移行するようにOR_Drag_Custom_LとOR_Drag_Custom_Rを設定しています。FuncListCustomではメニューから「待機おわり」をクリックした時に通常動作に戻るようにそれぞれ左右に合わせてOR_Move_Up_L, OR_Move_Down_LとOR_Move_Up_R, OR_Move_Down_Rを設定しています。
次に「待機」中用のドラッグ処理を見ていきます。FuncNameを「待機」中用に変更しています。そしてキャラクターをドラッグして離した時に「待機」状態に戻るようにFuncListEventにOR_Custom_LとOR_Custom_Rをそれぞれ設定しています。
最後に「待機」中にメニューを出したりドラッグした時に、「待機」中用のオーダー関数に移行するようにFuncListLButtonにOR_Drag_Custom_LとOR_Drag_Custom_R、FuncListMenuにOR_Menu_Custom_LとOR_Menu_Custom_Rをそれぞれ設定しています。
オーダー関数の移行状態を図にすると下図の様になります(完全に正確ではありません)。通常状態(黒)から「待機(カスタム)」状態(青)への移行が赤の矢印で表されています。どちらからの移行も必ずOR_Menu~~を介して移行しているのがわかります。この様に関数が移行する部分をある程度まとめておけばスクリプトの記述がしやすくなります。またスクリプトを書く前に下図のように図で設計しておけばスムーズにスクリプトを記述することができます。

以上でスクリプトの変更は終了です。これでポップアップメニューの項目をクリックすることで指定のオーダー関数に移行します。
下記ファイルはここまで作成したサンプルのキャラクターデータです。
Custom_Menu.zip
以上で「カスタムメニューを使う」のチュートリアルを終了します。

◆カスタムメニュー実行時のモーションを決める
カスタムメニューはメニューに表示された項目をクリックすると、指定のオーダー関数に移行させることが出来ます。また、カスタムメニューの項目はCUSTOM_EVENTのイベントタイプを持つオーダー関数が少なくとも1つ以上無いと、メニューには表示されません。 今回は、カスタムメニューの項目名は「待機」にしてモーションはその場に停止するようにしますので、モーション関数は「画像をドラッグする」で作成したMO_Stop_LとMO_Stop_Rを使い回します。よって、ここではモーション関数は追加しません。
◆オーダー関数にカスタムメニュー実行時の関数を追加する
カスタムメニュー項目をクリックした時に移行するオーダー関数を追加します。それでは「メニューイベントを使う」で作成したOR_Menu_LとOR_Menu_Rをコピーして貼り付けてください。また、OR_Menu_L以下の関数は項目を一つ追加しているだけです。
<Sample_Script.func>
## ============================================ ## オーダー関数設定 ## ============================================ ## カスタムメニュー実行時 左向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Custom_L FuncType = CUSTOM_EVENT FuncNameMotion = MO_Stop_L FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListLButton = OR_Drag_L MenuItemCustom = 待機おわり </SET_CONFIG> </FUNC_ORDER_REG> ## カスタムメニュー実行時 右向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Custom_R FuncType = CUSTOM_EVENT FuncNameMotion = MO_Stop_R FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListLButton = OR_Drag_R MenuItemCustom = 待機おわり </SET_CONFIG> </FUNC_ORDER_REG> ## メニュー表示時 左向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Menu_L FuncType = MENU_EVENT FuncNameMotion = MO_Stop_L FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListEvent = OR_Move_Up_L, OR_Move_Down_L FuncListLButton = OR_Drag_L FuncListCustom = OR_Custom_L </SET_CONFIG> </FUNC_ORDER_REG> ## メニュー表示時 右向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Menu_R FuncType = MENU_EVENT FuncNameMotion = MO_Stop_R FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListEvent = OR_Move_Up_R, OR_Move_Down_R FuncListLButton = OR_Drag_R FuncListCustom = OR_Custom_R </SET_CONFIG> </FUNC_ORDER_REG> ・ ・ ・ ## 左上に移動 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Move_Up_L FuncType = LEFT_EVENT FuncNameMotion = MO_Move_Up_L FuncNameImageLayer = IL_Eye PosX = X PosY = Y TimerFrame = 60 + RAND_300 FuncListEvent = OR_Move_Up_R, OR_Move_Down_R FuncListTimer = OR_Move_Up_L, OR_Move_Down_L, OR_Move_Up_R, OR_Move_Down_R FuncListTurn = OR_Move_Down_L FuncListLButton = OR_Drag_L FuncListMenu = OR_Menu_L MenuItemCustom = 待機 </SET_CONFIG> </FUNC_ORDER_REG> ## 右上に移動 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Move_Up_R FuncType = RIGHT_EVENT FuncNameMotion = MO_Move_Up_R FuncNameImageLayer = IL_Eye PosX = X PosY = Y TimerFrame = 60 + RAND_300 FuncListEvent = OR_Move_Up_L, OR_Move_Down_L FuncListTimer = OR_Move_Up_L, OR_Move_Down_L, OR_Move_Up_R, OR_Move_Down_R FuncListTurn = OR_Move_Down_R FuncListLButton = OR_Drag_R FuncListMenu = OR_Menu_R MenuItemCustom = 待機 </SET_CONFIG> </FUNC_ORDER_REG> ## 左下に移動 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Move_Down_L FuncType = LEFT_EVENT FuncNameMotion = MO_Move_Down_L FuncNameImageLayer = IL_Eye PosX = X PosY = Y TimerFrame = 60 + RAND_300 FuncListEvent = OR_Move_Up_R, OR_Move_Down_R FuncListTimer = OR_Move_Up_L, OR_Move_Down_L, OR_Move_Up_R, OR_Move_Down_R FuncListTurn = OR_Move_Up_L FuncListLButton = OR_Drag_L FuncListMenu = OR_Menu_L MenuItemCustom = 待機 </SET_CONFIG> </FUNC_ORDER_REG> ## 右下に移動 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Move_Down_R FuncType = RIGHT_EVENT FuncNameMotion = MO_Move_Down_R FuncNameImageLayer = IL_Eye PosX = X PosY = Y TimerFrame = 60 + RAND_300 FuncListEvent = OR_Move_Up_L, OR_Move_Down_L FuncListTimer = OR_Move_Up_L, OR_Move_Down_L, OR_Move_Up_R, OR_Move_Down_R FuncListTurn = OR_Move_Up_R FuncListLButton = OR_Drag_R FuncListMenu = OR_Menu_R MenuItemCustom = 待機 </SET_CONFIG> </FUNC_ORDER_REG> |
それでは上に戻って確認していきます。FuncNameに任意の名前を設定し、FuncTypeにCUSTOM_EVENTを設定しています。これでポップアップメニューの「待機」をクリックした時にこのオーダー関数が実行されます。次に、MenuItemCustomに「待機おわり」と設定しています。これはカスタムメニューが実行された時にポップアップメニュー項目の文字を変更しているので「待機」中にポップアップメニューを出すとメニュー項目の文字は「待機おわり」と表示されます。また、CUSTOM_EVENTは基本的にはイベントが発生しないのでFuncListEventを削除しています。よって、フレームタイマーやメニューイベント等でイベントを発生させないと動作が変更されることは永遠にありません。
最後にOR_Menu_L, OR_Menu_RでFuncListCustomを設定して「待機」をクリックした時に指定のオーダー関数に移行するようにしています。また、OR_Custom_LとOR_Custom_Rが設定されていますが、これはカスタムメニュー項目をクリックした時に移行させたい関数が2種類(左右)あるので「画像をドラッグする」で説明した内部的なリストから直接オーダー関数を指定して実行するためです。FuncListCustomの詳細な仕様は「オーダー関数」でご確認下さい。
◆「待機」中のメニューイベントとドラッグ処理を追加する
先ほどの設定で「待機」をクリックすると静止するようになりましたが、メニューを出したりドラッグして離すと動き出してしまいます(厳密にはメニューイベント時はOR_Custom_LとOR_Custom_RにFuncListMenuが無いのでキャラクターの向きが左右ランダムになっている)。これは内部的なリストに保存された通常のメニューと通常のドラッグ操作(オーダー関数)が実行されているからです。これでも問題ない場合は良いのですがここではメニューを出したりドラッグして離してもそのまま静止するように設定していきます。メニューを出したりドラッグをしても止まったままにするには、「待機」中用のメニューとドラッグ操作のオーダー関数を追加します。それではOR_Menu_L, OR_Menu_R, OR_Drag_L, OR_Drag_Rをコピーして貼り付けてください。
<Sample_Script.func>
## ============================================ ## オーダー関数設定 ## ============================================ ## メニュー表示時 左向き 待機中 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Menu_Custom_L FuncType = MENU_EVENT FuncNameMotion = MO_Stop_L FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListEvent = OR_Custom_L FuncListLButton = OR_Drag_Custom_L FuncListCustom = OR_Move_Up_L, OR_Move_Down_L </SET_CONFIG> </FUNC_ORDER_REG> ## メニュー表示時 右向き 待機中 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Menu_Custom_R FuncType = MENU_EVENT FuncNameMotion = MO_Stop_R FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListEvent = OR_Custom_R FuncListLButton = OR_Drag_Custom_R FuncListCustom = OR_Move_Up_R, OR_Move_Down_R </SET_CONFIG> </FUNC_ORDER_REG> ## マウスでドラッグ 左向き 待機中 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Drag_Custom_L FuncType = L_BUTTON_EVENT FuncNameMotion = MO_Stop_L FuncNameImageLayer = IL_Eye PosX = X PosY = Y FuncListEvent = OR_Custom_L </SET_CONFIG> </FUNC_ORDER_REG> ## マウスでドラッグ 右向き 待機中 <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Drag_Custom_R FuncType = L_BUTTON_EVENT FuncNameMotion = MO_Stop_R FuncNameImageLayer = IL_Eye PosX = X PosY = Y FuncListEvent = OR_Custom_R </SET_CONFIG> </FUNC_ORDER_REG> ## カスタムメニュー実行時 左向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Custom_L FuncType = CUSTOM_EVENT FuncNameMotion = MO_Stop_L FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListLButton = OR_Drag_Custom_L FuncListMenu = OR_Menu_Custom_L MenuItemCustom = 待機おわり </SET_CONFIG> </FUNC_ORDER_REG> ## カスタムメニュー実行時 右向き <FUNC_ORDER_REG> <SET_CONFIG> FuncName = OR_Custom_R FuncType = CUSTOM_EVENT FuncNameMotion = MO_Stop_R FuncNameImageLayer = IL_Menu PosX = X PosY = Y FuncListLButton = OR_Drag_Custom_R FuncListMenu = OR_Menu_Custom_R MenuItemCustom = 待機おわり </SET_CONFIG> </FUNC_ORDER_REG> ・ ・ ・ |
次に「待機」中用のドラッグ処理を見ていきます。FuncNameを「待機」中用に変更しています。そしてキャラクターをドラッグして離した時に「待機」状態に戻るようにFuncListEventにOR_Custom_LとOR_Custom_Rをそれぞれ設定しています。
最後に「待機」中にメニューを出したりドラッグした時に、「待機」中用のオーダー関数に移行するようにFuncListLButtonにOR_Drag_Custom_LとOR_Drag_Custom_R、FuncListMenuにOR_Menu_Custom_LとOR_Menu_Custom_Rをそれぞれ設定しています。
オーダー関数の移行状態を図にすると下図の様になります(完全に正確ではありません)。通常状態(黒)から「待機(カスタム)」状態(青)への移行が赤の矢印で表されています。どちらからの移行も必ずOR_Menu~~を介して移行しているのがわかります。この様に関数が移行する部分をある程度まとめておけばスクリプトの記述がしやすくなります。またスクリプトを書く前に下図のように図で設計しておけばスムーズにスクリプトを記述することができます。

以上でスクリプトの変更は終了です。これでポップアップメニューの項目をクリックすることで指定のオーダー関数に移行します。
下記ファイルはここまで作成したサンプルのキャラクターデータです。
Custom_Menu.zip
以上で「カスタムメニューを使う」のチュートリアルを終了します。