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↑
前回公開した「だ出ゲーム」を構成するスクリプトについて解説します。


■000_CustomLayer(カスタムレイヤ)
■001_ImageLayPlugin(イメージレイヤ)
■002_ImageListLayPlugin(イメージリストレイヤ)
■003_WinButtonLayerPlugin(ウィンドウボタンレイヤ)


この4つのプラグインについては、「じゃんけんゲーム」の物と同一です。
以下の方を参照下さい。
◆じゃんけんゲーム解説◆


■004_AroomPlugin(Aルームプラグイン)

Aルームを構成するプラグインです。
具体的には、ドアボタン(Bルームに行く)鍵穴ボタンの機能を持っています。

まず、鍵穴ボタンですが、こちらは「じゃんけんゲーム」では使用しなかった機能を使っています。
じゃんけんゲームでは、ボタンは全てWinButtonLayerPluginを使用していました。
しかし、鍵穴ボタンは、ImageLayPluginを使用しています。
//===============================================
//鍵ボタンの設定
//===============================================
var button_id = "KEY"; //実行されたファンクションに戻されるID
a_button[0] = new ImageLayPlugin();


ImageLayPluginは画像を表示するレイヤ用のプラグインです。
しかし、以下の部分でボタン化しています。
//レイヤをボタン化
a_button[0].setFunction(void, click_func, onmouse_func, offmouse_func, void, button_id);


この方法を取った一番の理由は、ズバリ必要な画像サイズです。
WinButtonLayerPluginの場合、以下の様な4つの画像が連なった物を必要とします。
button_gu_image.png

しかし、画像をそのままボタン化するのであれば、以下の様な画像だけでOKです。
Key_ana.png

サイズが小さくて済みますね。

つづいて、Aルームの肝である、鍵穴ボタンをクリックした時の処理です。
以下の部分は、アイテムウィンドウでを選択されているか判定しています。
が選択されていれば脱出。して
いないなら「鍵がかかっている旨のメッセージ」を表示します。
//アイテムウィンドウで鍵を選択
if(global.item_win.getSelectItem() == "KEY")


Aルームを表示する機能は以下のファンクションになります。
Aルームには条件によって表示非表示があるアイテムはありませんので、オープンされたら全てのアイテムを表示します。
//------------------------------------
// メ
イン画面の表示
//------------------------------------
function openWin(i_page)
{
  //オブジェクトを全て表示
  setVisible(i_page, true);
}



■005_BroomPlugin(Bルームプラグイン)

続いて、Bルームについて解説します。
Bルームには、ボールドアボタンがあります。
ボールは、クリックする事で、アイテムウィンドウに格納されます。
処理的に言うと、クリックされたら画面から消えて、アイテムウィンドウにクリックしたアイテムを表示する訳です。

Bルームのボールも、Aルームの鍵穴と同じ様にImageLayPluginを用いてボタン化しています。

Aルームを表示する機能は以下のファンクションになります。
key_flgmaru_flgがそれぞれのアイテムを拾ったかを判断するフラグとなっており、それが立ってる場合は、アイテムを非表示にしています。
//------------------------------------
// メイン画面の表示
//------------------------------------
function openWin(i_page)
{
  //全てのボタンを表示
  setVisible(i_page, true);

  //キーを既に拾っている
  if(key_flg == 1)
  {
    //キーボタンを非表示
    b_button[0].setVisible("all", false);
  }

  //●を既に拾っている
  if(maru_flg == 1)
  {
    //●ボタンを非表示
    b_button[1].setVisible("all", false);
  }
}


■006_ItemWinPlugin(アイテムウィンドウプラグイン)

アイテムウィンドウは、ボールのボタンを作成しておき、を拾ったらを、ボールを拾ったらボールを表示する機能を有したプラグインです。
もう1つの機能としては、ボールのボタンを押すと、それらを選択する事が出来ます。
選択したアイテムをその他のプラグインから確認出来る様にもなっています。

ボタンはいつもの様に作成します。

アイテムウィンドウの表示機能は以下の様になっています。
//------------------------------------
// メイン画面の表示
//------------------------------------
function openWin(i_page)
{
  //ウィンドウの表示
  win_lay.setVisible(i_page, true);

  //キーフラグがON
  if(key_flg == 1)
  {
    //鍵ボタンを表示
    item_button[0].setVisible(i_page, true);
  }

  //●がON
  if(maru_flg == 1)
  {
    //●ボタンを表示
    item_button[1].setVisible(i_page, true);
  }
}


ボールのフラグを持っていて、それが立ったらアイテムボタンを表示するのです。

続いて、肝であるアイテムボタンがクリックされた時の処理を見てみましょう。
まず、以下の様に1度全てのボタンを使用可能にします。
//ボタンを全て使用可能に設定
for(i=0; i < item_button.count; i++)
{
  item_button[i].setEnabled(true);
}
更にクリックされたアイテムボタンを使用不能にします。
//鍵ボタンを使用不能に設定
item_button[0].setEnabled(false);

何故使用不能にするかを説明する前にWinButtonLayerPluginについておさらいして置きます。
WinButtonLayerPluginは、簡単に言えば、以下の画像を読み込んでマウスの状況に応じて画像を切り替えるボタンを作成する機能です。
button_gu_image.png
右から、平常時クリックした時マウスが乗った時使用不能な場合です。
使用不能とはどういう状況かと言うと、機能的には2種類の意味があります。
1つは、マウスのアクションで画像が変わらない。常に4つ目が表示されます。
次にマウスのクリックに対してイベントが発生しない。クリックしても何も起こらないと言う事です。

なので、以下の様な画像をロードして作ってやれば、クリックした時に使用不能にするだけで、選択した様な効果を出せます。
button_key_image.png

最初に全てのボタンを使用可能にしたのは、常にクリックされたアイテムだけが使用不能にする為です。
これによって、前に選択されていた(使用不能になっていた)ボタンが解除され、今回クリックしたボタンが選択(使用不能)になります。

続いて、選択したアイテム情報の保持と取得です。
//選択アイテムの設定
setSelectItem(i_id);
ファンクションにはなっていますが、select_itemと言う変数にボタンに渡した識別用のIDを渡しているだけです。
後は、getSelectItem()でこの変数を返せば、他のファンクションから今選択されているアイテムを知る事が出来ます。

■総括

どうでしょうか、ちょっと速足ですかね。ソースがあるので眺めて頂ければ割と簡単かと思うのですが如何ですか?
次回はもう少し、脱出ゲームに役立つ機能を紹介します。
1つは、後ろの絵に合わせた四角い形以外のボタンの作り方。もう1つは画像を使わないボタンの作り方です。

そして、勿体ぶっている例のエラーについても、原因と対策を紹介します。




◆つぶつぶ主人公HP◆
2012.05.08 / Top↑
5月2日以降に、姫百合の乱を購入して頂いた方は、以下のファイルをダウンロードして、同名のファイルを上書きして頂けますようお願いします。
現在、15ターンまでしか出来ないバグを入れてしまいました、本当に申し訳ありません。

■バグ修正ファイル■
2012.05.05 / Top↑