Unityと吉里吉里でSLGとかRPGを作るブログ

前回に引き続き、右クリックによりアンドゥ機能について解説します。
いつもの様にダウンロード出来るサンプルを用意したので、それを元に解説して行こうと思います。

■サンプルダウンロード■

※前回の記事「右クリックアンドゥ①」

起動するとAとBボタンを持つウィンドウが表示されます。各ボタンによってAウィンドウBウィンドウが表示されます。
閉じるボタンを押すか、右クリックする事でウィンドウを閉じる(開いた行為をアンドゥする)事が出来ます。
アンドゥは、直近の行動から巻き戻すので、A→Bとウィンドウを開いた場合、右クリックで閉じるのは、B→Aの順です。

■プラグイン解説

・004_UndoPlugin
 アンドゥ用のIDの管理を行うプラグインです。アンドゥの対象である行動を行うと、ここにIDが格納され管理されます。

・005_AWinPlugin
 Aウィンドウ用のプラグインです。ウィンドウの表示、閉じる機能、アンドゥ機能があります。

・006_BWinPlugin
 Bウィンドウ用のプラグインです。Aウィンドウを継承しており、アンドゥ用のIDと、ウィンドウ用の画像以外はAと同じです。

・007_ButtonWinPlugin
 A、Bウィンドウを表示するボタンを持つプラグインです。ウィンドウを表示する機能しかありません。

・undo
 firstから呼び出されるksファイルです。
 ここで右クリックアンドゥの機能を追加しています。


■004_UndoPlugin

基本的には、window_id配列にIDを格納する機能と削除する機能を有しています。

・setWindowIDファンクション
 指定したIDを格納します、サンプルではA、Bウィンドウを開いた時に呼び出されます。
 既に同じIDがある場合、格納自体が行われません。ウィンドウの再表示や複数回開くボタンを押下された場合の対策です。

 //重複する既存のIDがあるか
 win_index = window_id.find(i_win_id);

 findは配列内に同じ値があるか上からチェックし、有った場合はその位置を返します。
 同じ値が無い場合は-1を返します。詳しくは以下を参照の事。
 http://devdoc.kikyou.info/tvp/docs/tjs2doc/contents/array.html


・getWindowIDファンクション
 格納されているIDの中から一番新しいIDを取得します。
 これで取得したIDを元にアンドゥを行う訳です。

・selectDelWinIDファンクション
 アンドゥを行ったら、IDを削除する必要があります。また、ウィンドウについている閉じるボタンで閉じた場合もIDの削除が必要なので、これを使って削除します。

 //指定されたウィンドウIDを削除
 window_id.remove(i_win_id);

 removeは指定された値と同じ値を削除します。
 詳しくは以下を参照の事。
 http://devdoc.kikyou.info/tvp/docs/tjs2doc/contents/array.html

・allWinIDClearファンクション
 画面の変換なので全てのウィンドウを閉じた場合などに一括して削除として使用します。
 ゲームなんかで、「タイトルに戻る」とかした場合もこれで削除します。

・rClickSyoriファンクション
 右クリックを実行した時に呼び出されるファンクションです。IDを元に各オブジェクトのアンドゥの処理を実行します。


■005_AWinPluginの解説

Aウィンドウのプラグインです、Bウィンドウはこれを継承していますので、ウィンドウの機能と思っていただいて結構です。

・openWinファンクション
 ウィンドウを表示するファンクションです。global.undo.setWindowID(WIN_ID)でアンドゥ用のIDを登録します。

・closeWinファンクション
 ウィンドウを閉じるファンクションです。global.undo.selectDelWinID(WIN_ID)でアンドゥ用のIDを削除しています。
 閉じるボタンが押された時と、右クリックアンドゥの時に呼ばれます。

・rClickSyoriファンクション
 右クリックアンドゥ時に呼ばれるファンクションです。
 これが呼ばれたら、closeWinを呼び出して、ウィンドウを閉じます。

 var WIN_ID="A_WIN_OPEN";//アンドゥ用のID
 ここで設定されたIDが004_UndoPluginのwindow_id配列に格納されます。


■006_BWinPluginの解説

機能的には、005_AWinPluginとまったく同じです。アンドゥ用のIDのみ異なります。


■007_ButtonWinPluginの解説

AボタンとBボタンを持つウィンドウです。最初から表示されており、閉じる事はありません。
Aボタンを押すと、Aウィンドウを表示します。Bボタンを押すとBウィンドウを表示します。

004_UndoPluginの機能により、ボタンを連打しても特に影響はありません。


■undo

ある意味では一番肝な部分です。
右クリックした場合に、004_UndoPluginのrClickSyoriファンクションが呼び出される仕組みを作っています。

 [iscript]
 // 右クリックされた時に呼び出されるメソッド
 function onRightClick()
 {
    global.undo.rClickSyori();
 }
 // 右クリックフックを登録します
 kag.rightClickHook.add(onRightClick);
 [endscript]


右クリックサブルーチンの解説ではお馴染みですが、kag.rightClickHook.addにて、右クリック時に実行されるファンクションにここで定義しているonRightClickを設定しています。
onRightClickは、global.undo.rClickSyori()を実行する事で、右クリックアンドゥを実現しています。
onRightClickの中で条件を切る事で、イベントシーン時には、通常の右クリックサブルーチンを動かしたりとか、色々できますね。


■総括

 相も変わらず、サンプルに投げっぱと言った感じですが、意外にシンプルなのでサンプルを見てもらえれば簡単だと思います。
 今回はアンドゥでしたが、右クリックで、なんらかの機能を実行する方法は同じです。
 右クリックで色々なギミックを仕込めるのは、ゲームのジャンル問わず色々と出来るのではないでしょうか?。





◆つぶつぶ主人公HP◆
スポンサーサイト
2012.10.17 / Top↑
Secret

TrackBackURL
→http://nekodamasi.blog79.fc2.com/tb.php/74-798a2bae