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

いよいよ②です。
とりあえず、バグ修正版をアップしました。
毎度の事ながら、解説がつたないので、ダウンロードして見ながら解説を読んで頂ければ、多少は理解度がアップするかと思います。
◆脱出ゲームバグ修正版ダウンロード◆


■バグの解説

まずはドアボタンを連打すると発生する、下のバグを解説します。
エラー

原因はなんて事はありません、ここに書いてある通りです。
Aルームのドアボタンを連打することにより、Bルームに切り替えるトラジション中に再びトラジションを実行してしまうのです。
AルームからBルームへの変更を2回やろうとしてると言う訳ですね。

この問題を解決するには、二通りの方法が考えられます。
①ボタンを押してもトラジション中は実行されない様にする。
②トラジション中はボタンを押せなくする。
今回は、2つとも実装してみました。
A→Bのドアボタンは①を、B→Aのドアボタンには②を実装しました。


■①の実装内容

004_AroomPluginファイルに、close_flgと言うのが実装されています。
具体的に言うと、close_flgがON(1)の場合は、ボタン処理を無効にする様にしています。
これは吉里吉里にはオブジェクト消去中にマウスイベントが実行されてしまう問題があり、それを解決する方法です。
例えば、「閉じる」ボタンと「アイテム」の上にマウスが乗ると、解説が出るアイテムリストがあるとします。
この時、「閉じる」ボタンを押すと、アイテムリストが消去されるのですが、ボタン押下時に素早くマウスを動かし、アイテムの上にマウスを持っていくと、アイテム解説だけ出てアイテムリストは消えている状態になってしまいます。
この方式は、それを解消する手段として非常に有効です、ボタンなど、ユーザーの入力を受けられるオブジェクトにはデフォルトで入れると良いでしょう。


■②の実装内容

今回の様なトラジションの問題の場合、こちらが大変有効です。
何故なら画面のトラジションは画面全体、つまりは表示されている全てのオブジェクトに関わります。
close_flgの方式では、非常に煩雑な処理になりがちだからです。

この方法は当サークルの処女作「姫百合の乱」でも実装されています。
まず、新たに追加された007_GameDataPluginを見て下さい。
こちらには、カーテンと言う名前のレイヤを扱っています。
このカーテンを、画面の一番上に表示して、その下にあるオブジェクトにマウスイベントを渡さない様にします。
このカーテンレイヤがマウスイベントを受け取ってしまう為、下のオブジェクトが押せなくなる訳です。

なんとも泥臭い様に感じるかもしれませんが、この方式には色々な利点があります。
例えばですが、戦闘画面や育成ゲームの育成画面など、やたらにボタンがいっぱいある画面で、イベントを起こして、キャラに会話させたいとします。
そんな場合も、この方式なら一括で後ろのボタンを隠す(押せなく)事が出来ます。
開発中にボタンが追加されようと何しようと、この方式なら全く問題ないので、バグの作り込みも解消出来ます。

実装方式も以下の様に簡単です。dasyutuファイルの*Aroomラベルを見て下さい。
//カーテンを表示
[eval exp=game_system.showCurtain('all')"]

;トラジション
@trans method=crossfade time=300
@wt

//カーテンを非表示
[eval exp=game_system.hideCurtain('all')"]

この様にトラジションに上下に、カーテンのONOFFをつけるだけ。
マクロ化すればもっと簡略化できますね。


■007_GameSystemPlugin

新規に追加された、ゲームシステムプラグインの解説を行います。
このプラグインには、上で説明したカーテンの機能が実装されています。
//カーテンオブジェクト生成
curtain_lay.finalize();

//ロードイメージ
curtain_lay.loadImages("048_parts_curtain");


//描画位置設定
curtain_lay.setPos("all", 0, 0);

まずはカーテンレイヤの生成です。イメージレイヤを作成するだけでOKです。
続いて、イメージのロードですが、以下の様な画面と同じサイズの黒一色を用意します。
curtain.png
まあ、黒以外でも全く問題ないんですけど、私は黒を愛用してます。
画面全体を覆うので、表示位置は左上端の0,0です。

続いて、カーテンの表示機能です。
//------------------------------------
// カーテン表示
//------------------------------------
function showCurtain(i_page)
{
var curtain_abs = D_CURTAIN_ABS;
var curtain_opacity = 0;

//カーテンの描画順序を設定
curtain_lay.setAbsolute(curtain_abs);

//カーテンの透明度を設定
curtain_lay.setOpacity(curtain_opacity);

//カーテンの表示
curtain_lay.setVisible(i_page, true);
}
カーテンの描画順序は、ボタン等の上に来るようにしてあります。
設定しているD_CURTAIN_ABSの値(1999999)は、履歴レイヤの1つしたです。
つまり、履歴レイヤより下の物は全て隠す様な仕様となっています。
続いて透明度ですが、こちらは完全な透明(0)を指定しています。

次はカーテンの非表示機能です。
//------------------------------------
// カーテン非表示
//------------------------------------
function hideCurtain(i_page)
{
//カーテンの表示
curtain_lay.setVisible(i_page, false);
}
見ての通り、カーテンレイヤを非表示にするだけの機能です。
showhideで分かり易くする為に、setVisibleを直接呼ぶのではなく、こちらで1つ包んでます。


■総括

今回は、カーテン機能とclose_flgの機能を解説しました。
この機能は、吉里吉里で動的ゲームを作る場合に非常に有効な方法です。
今後の解説でも、出てくると思います。

次回は、動的ゲームでは必須事項、データの読み込みと情報表示について解説します。
ステータス情報やアイテム情報、敵のデータ等を扱う事ができるので、動的ゲームには必須と言える機能です。




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

TrackBackURL
→http://nekodamasi.blog79.fc2.com/tb.php/64-95d5d6ca