FC2ブログ

ゲーム制作日記<50> ランダム出現シンボルイベント

op.png



みなさん、こんばんは。
ネコタです。


ゲーム制作日記も、遂に50回目の投稿ですね。
気付けば、今年ももう残りわずか。

ちょうどキリがいいので、これを今年最後の投稿にしようかと思います。



さて、それでは今回も恒例の『 コモンイベントで作るちょっとしたシステム 』 のご紹介。


今回は、アイディアを御味噌屋さんからいただきました(というか、依頼です)。ありがとうございます。

今回のように委託されての作成は初めてですが、いやぁ、頼まれてシステム作るって、思ったより大変ですね。

何が大変って、色々聞き取りが必要なこと。イメージでこんなことをやりたいなぁという漠然としたものはあると思うんですが、それを形にするためには、とても具体的な事柄が必要です。それが固まっていないと、頼むのも難しいし、頼まれた側も難しい。

こういうやり取り、個人的には割と好きですが、お互いの協力が必要なもんですから結構大変です。

お互いに、相手を思いやる気持ちと、正確にストレートに伝えること(遠慮はいけません。納得いくものが納品されないとお互いに不利益でしょうから)。このさじ加減が難しいですが、上手にコミュニケーションをとれるようにしたいものです。


さて、それでは本題に入りましょう。


今回紹介するシステムは、
『ランダム出現イベントシステム』です。

どういうシステムかというと、マップを一定数歩くと、マップのどこかにイベントが現れるというものです。


なんとなくイメージがつきにくいかもしれないので、画像で説明しますね。

tc36-009.png

ここに、「ネコタの不思議なダンジョン」っぽいマップがあります。

ちょっと日本語がアレな女の子が、機能を簡単に説明してくれました。

これでシステムが動きだしたので、あとは歩き回ってみます。



tc36-010.png

とにかく歩き回ってみます。
いつか、何かが現れると信じて・・・

ちなみに、右下のウインドウですが、機能を確認するためにプラグインで変数を表示しています。

画像では64歩あるいたことが確認できますね。


tc36-011.png

ついに、何者かが現れました!

画像を見ると歩数が0にリセットされています。
イベントが出現すると、歩数がリセットされる仕組みです。

この出現したイベントはとりあえず無視して、さらに歩き回ってみましょう。



tc36-012.png

すると、また別なイベントが出現しました。

では、この出現したイベントに触ってみましょう。



tc36-013.png

どうやら、彼女は男に触られると呪いにかかって倒れてしまう体質のようです(笑)

とんだ男嫌いでした(笑)


そんな彼女には酷なことですが、もう一度話しかけてみましょう。



tc36-014.png

ご親切に、システムの内部処理情報を教えてくれました(笑)

どうやら、彼女が出現するまでに、出現場所を計算した回数は12回、出現までにかかった歩数は159歩だったようです。



tc36-015.png

ちなみに、最初の女の子に話しかけると、動作テストを終了できます。

終了すると、内部情報をリセットしてまた最初からテストができます。



tc36-016.png

選択肢の「出現歩数を確認したい」を選ぶと、それぞれのキャラクターが出現するのに必要な歩数が確認できます。

とまあ、こんな感じで「歩数が乱数で選ばれて、その歩数に到達したら順番にイベントが不特定の箇所に出現する」というイベントシステムでした。


さて、イメージがつかめたところで、改めて仕様を説明します。


・システムが起動した時点で適当な歩数が自動で設定され、その歩数に到達したら順番にイベントを出現させます。
・出現するイベント自体は、普通のイベント同様に機能します。
・プレイヤーの上やイベントの上には出現しません。
・イベントは勝手に消えませんのでご注意ください。
・それぞれのイベント自体は独立していますので、条件を満たせば次々に出現します。
・ただし、順番を飛び越しての出現はしません。
・内部処理の情報表示は動作確認のために用意したものですので、削除して困ることはありません。


また、編集できる項目ですが、


・各イベントの出現歩数の範囲を設定できます(定数も可能)。
・条件分岐を使えば、全部のイベントが出現するまでの上限歩数を設定できます。
・出現させるイベントは追加可能です。
・出現させられる場所は、地形タグで編集します。

こんな感じですね。



それでは、まずはいつも通り必要なものの確認から行きましょう。


【必須】
スイッチ*4(コア用)
スイッチ*出現させるイベントの数だけ)
変数*15
コモンイベント*1(条件設定用)
イベント*1(コア用)
イベント*必要な分だけ(出現させる対象)


【推奨】
プラグイン:OuterSelfSwitch(準公式プラグイン)
コモンイベント:プレイヤー情報取得


【デバッグ用】
変数*2



まず、【推奨】のプラグインですが、

プラグイン:OuterSelfSwitch
tc36-005.png

準公式プラグインで、同梱のサンプルゲーム「ニナと鍵守の勇者」に導入されています。

このプラグインを使うと、プラグインコマンド任意のセルフスイッチを操作することができます。

【必須】の中に(・スイッチ*イベントの数だけ)とありましたが、このプラグインを導入していればセルフスイッチで代替することが可能です。

1つのMAPで沢山のイベントを出現させる必要がある場合は、このプラグインを導入しておくとスイッチの数を圧迫しなくなります。使い道は多いプラグインですので、とりあえずでも導入しておくとよいと思います。


コモンイベント:プレイヤー情報取得
tc35-013.png

<実行内容>
変数の操作:#0004 プレイヤーの位置X = プレイヤーのマップX
変数の操作:#0005 プレイヤーの位置Y = プレイヤーのマップY
変数の操作:#0002 プレイヤーの向き = プレイヤーの向き


もう何度書いたか分かりませんが、プレイヤーの位置情報向きを取得するコモンイベントです。プレイヤーの座標や向きなどを取得したい場合にあると便利ですので、作っておくと良いでしょう。今回の処理でも使っています。

(なお、今回の処理では向きを使用していないため、向きを格納する変数は必要な変数の数に入れておりません。)



それでは、イベントの中身を見ていきましょう。

まずは、設定用のコモンイベントから。


コモンイベント:【出現EV】出現歩数設定
tc36-002.png

トリガー:自動実行
スイッチ:0030 【条件】出現設定起動

<実行内容>
注釈:出現上限参照用の乱数合計値をリセットします。
変数の操作:#0417 【数値】乱数合計 = 0
注釈:各出現イベントの出現歩数を設定します。
変数の操作:#0421 【数値】乱数A = 乱数 1..199
変数の操作:#0422 【数値】乱数B = 乱数 1..199
変数の操作:#0423 【数値】乱数C = 乱数 1..199
変数の操作:#0424 【数値】乱数D = 乱数 1..199
変数の操作:#0425 【数値】乱数E = 乱数 1..199
注釈:参照用変数を計算します。
変数の操作:#0417 【数値】乱数合計 += 【数値】乱数A
変数の操作:#0417 【数値】乱数合計 += 【数値】乱数B
変数の操作:#0417 【数値】乱数合計 += 【数値】乱数C
変数の操作:#0417 【数値】乱数合計 += 【数値】乱数D
変数の操作:#0417 【数値】乱数合計 += 【数値】乱数E
注釈:乱数合計値の上限を設定します。この値が、全イベント出現までにかかる歩数の合計値となります。
注釈:条件分岐に外れた場合は、条件に該当するまで試行を繰り返します。
条件分岐:【数値】乱数合計 ≤ 500
変数の操作:#0426 【数値】出現数 = 1
スイッチの操作:#0028 【条件】歩数出現A = ON
スイッチの操作:#0030 【条件】出現設定起動 = OFF

分岐終了


この処理では、出現のための歩数を設定しています。

出現時に乱数取得せず、あえて最初に決めているのには理由があります。

それは、あらかじめ全体の歩数を決定することで、条件分岐で上限を設けるためです。

たとえば、今回の例では期待値として100歩となるような数値を設定しています。

ただ、期待値はあくまで期待値です。場合によっては何度も長い歩数が選択されてしまうケースがあるでしょう。

それを防ぐために、まず全体として「これ以上は歩いてほしくない」という数値を条件付けしておくことで、乱数をそれ以下になるような条件のみ選択されるようにしています。

条件に当てはまらないと当てはまるまで何度も試行を繰り返す処理となっていますので、あまりギチギチな条件は組まない方がよいでしょう。試行を繰り返す回数が多くなるほど、処理に時間がかかります

ちなみに、このくらいの条件であれば平均1.5回転ほどで決定されました。ほぼノータイムです(27回ほど試行した結果です)。



それでは次に、コアとなるマップ上のイベントを見てみましょう。

まず、マップにはこんな具合にイベントが配置されていました。

tc36-001.png

プレイヤーの下にいるイベントが、システムの起動や終了を担当しているイベントです。これは、テストのために用意したイベントなので、通常は場所移動のタイミングなどでスイッチ操作をすればOKです。

で、右上の人たち出現させられるイベント達です。

コアイベントは、左上の透明なやつですね。イベント達の移動を制御している大事なイベントです。


コアイベント
tc36-008.png

トリガー:並列処理
出現条件:0028 【条件】歩数出現A

<実行内容>
注釈:参照用の歩数を一時格納します。イベントが出現すると再度格納しなおします。
条件分岐:【条件】歩数出現BがOFF
変数の操作:#0418 【数値】参照歩数 = 歩数
スイッチの操作:#0029 【条件】歩数出現B = ON

分岐終了
注釈:現在の歩数を格納します。
変数の操作:#0419 【数値】現在歩数 = 歩数
注釈:イベント出現のために歩いた歩数をカウントします。
変数の操作:#0419 【数値】現在歩数 -= 【数値】参照歩数
注釈:出現数によって出現させるイベントを指定します。
注釈:なお、出現させるイベントによって必要な歩数が異なります。
条件分岐:【数値】出現数 = 1
条件分岐:【数値】現在歩数 ≥ 【数値】乱数A
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 2
条件分岐:【数値】現在歩数 ≥ 【数値】乱数B
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 3
条件分岐:【数値】現在歩数 ≥ 【数値】乱数C
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 4
条件分岐:【数値】現在歩数 ≥ 【数値】乱数D
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 5
条件分岐:【数値】現在歩数 ≥ 【数値】乱数E
ラベルジャンプ:出現処理

分岐終了

分岐終了
ウェイト:2フレーム
注釈:歩数が規定に達しない場合は、ここで処理終了です。再度、処理を先頭から繰り返します。
注釈:以下、ゲーム中ではONになることが無いスイッチを条件に設定してください。
注釈:これにより、ラベルジャンプ以外では処理されなくなります。
条件分岐:使用不可がON
ラベル:出現処理
注釈:以下、ランダムの箇所にイベントを出現させる処理です。
ループ
注釈:デバッグ用の変数です。
注釈:ループ処理の試行回数をカウントします。
変数の操作:#0427 【デバッグ】試行回数 += 1
注釈:X軸、Y軸それぞれ乱数の下限を0、上限をマップの幅-1に設定します。
注釈:例えば、X17*Y13マスのMAPの場合、
注釈:X軸=0~16
注釈:Y軸=0~12
注釈:となります。
変数の操作:#0415 【座標X】出現予定 = 乱数 0..16
変数の操作:#0416 【座標Y】出現予定 = 乱数 0..12
注釈:以下、出現処理です。出現させる箇所が見つかるまで処理を繰り返します。
注釈:出現させることが出来る箇所がMAP全体に対して少ないと時間がかかることがあります。
指定位置の情報取得:【ID】地形タグ, 地形タグ, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】地形タグ = 1
指定位置の情報取得:【ID】イベント, イベントID, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】イベント = 0
コモンイベント:プレイヤー情報取得
条件分岐:【座標X】出現予定 ≠ プレイヤーの位置X
ループの中断

それ以外のとき
条件分岐:【座標Y】出現予定 ≠ プレイヤーの位置Y
ループの中断

分岐終了

分岐終了

分岐終了

分岐終了

以上繰り返し
注釈:デバッグ用の変数です。
注釈:かかった歩数の合計をカウントします。
変数の操作:#0428 【デバッグ】歩数 += 【数値】現在歩数
条件分岐:【数値】出現数 = 5
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV006, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
注釈:出現数を0にすると、出現処理を行わなくなります。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0113 【EV】イベントE = ON
変数の操作:#0426 【数値】出現数 = 0

分岐終了
条件分岐:【数値】出現数 = 4
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV005, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0112 【EV】イベントD = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 3
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV004, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0111 【EV】イベントC = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 2
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV003, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0110 【EV】イベントB = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 1
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV002, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0109 【EV】イベントA = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了

分岐終了


条件分岐が多いのでなかなかしびれる内容ですが、条件分岐はイベントの数だけ増える仕組みです。それが無ければ、実はそんなに複雑な内容ではありません。

順番に見ていきましょう。


注釈:参照用の歩数を一時格納します。イベントが出現すると再度格納しなおします。
条件分岐:【条件】歩数出現BがOFF
変数の操作:#0418 【数値】参照歩数 = 歩数
スイッチの操作:#0029 【条件】歩数出現B = ON

分岐終了
注釈:現在の歩数を格納します。
変数の操作:#0419 【数値】現在歩数 = 歩数
注釈:イベント出現のために歩いた歩数をカウントします。
変数の操作:#0419 【数値】現在歩数 -= 【数値】参照歩数


最初にいくつかある変数の処理は、イベント出現のための歩数をカウントする処理です。

条件分岐の中にある変数は、イベントが出現した時点(あるいは、一番最初の何も出現していない時点)の歩数です。出現時点の歩数は更新されませんが、現在の歩数は常に更新されていきます。

これにより、歩くたびにこの2者間の差が広がっていくことになりますが、この差こそがイベント出現時から現在までで歩いた歩数となります。





注釈:出現数によって出現させるイベントを指定します。
注釈:なお、出現させるイベントによって必要な歩数が異なります。
条件分岐:【数値】出現数 = 1
条件分岐:【数値】現在歩数 ≥ 【数値】乱数A
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 2
条件分岐:【数値】現在歩数 ≥ 【数値】乱数B
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 3
条件分岐:【数値】現在歩数 ≥ 【数値】乱数C
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 4
条件分岐:【数値】現在歩数 ≥ 【数値】乱数D
ラベルジャンプ:出現処理

分岐終了

分岐終了
条件分岐:【数値】出現数 = 5
条件分岐:【数値】現在歩数 ≥ 【数値】乱数E
ラベルジャンプ:出現処理

分岐終了

分岐終了


この部分は、イベントによって出現する歩数が違うため、それぞれで条件分岐を分けています。

条件分岐の変数を見ると、【数値】乱数A、【数値】乱数B・・・となっていることに気付くと思います。

ここが、イベント毎に増やさなければいけない項目となります。

条件に合致したら、出現処理にラベルジャンプします。

【数値】出現数は後に使われますが、便宜上イベントのナンバリングに使用されています。出現数=1は最初に出現するイベントを指し、以降、=2は2番目、=3は3番目・・・といった具合です。




ウェイト:2フレーム
注釈:歩数が規定に達しない場合は、ここで処理終了です。再度、処理を先頭から繰り返します。
注釈:以下、ゲーム中ではONになることが無いスイッチを条件に設定してください。
注釈:これにより、ラベルジャンプ以外では処理されなくなります。


歩数監視の処理は、これで終わりです。これ以降の処理はページを切り替えてやっても構いませんが、今回は「使用不可」のスイッチを条件にすることで「ページを切り分ける」ことと同じように扱っています。

条件分岐:使用不可がON
ラベル:出現処理


イベントページを余計に作りたくないときや、セルフスイッチが足りないとき、処理的にはループさせたい部分だけれど特定の条件でなければ処理をさせたくないなど、割といろんなところで使えるテクニックです。

特にこの形にする必要はありませんでしたが、今回はついでに紹介しようと思って使ってみました。

この中にラベルが入っていますので、上記の条件を満たしたときにのみ行われるという形になっています。(ゲームではONになることのない「使用不可」のスイッチを設けることで、この中の処理は、普段処理されることがなくなります。それを利用して、ラベルジャンプのみで処理が行われるという形に変えることができます)

それでは、中の処理を見てみましょう。




注釈:以下、ランダムの箇所にイベントを出現させる処理です。
ループ
注釈:デバッグ用の変数です。
注釈:ループ処理の試行回数をカウントします。
変数の操作:#0427 【デバッグ】試行回数 += 1
注釈:X軸、Y軸それぞれ乱数の下限を0、上限をマップの幅-1に設定します。
注釈:例えば、X17*Y13マスのMAPの場合、
注釈:X軸=0~16
注釈:Y軸=0~12
注釈:となります。
変数の操作:#0415 【座標X】出現予定 = 乱数 0..16
変数の操作:#0416 【座標Y】出現予定 = 乱数 0..12
注釈:以下、出現処理です。出現させる箇所が見つかるまで処理を繰り返します。
注釈:出現させることが出来る箇所がMAP全体に対して少ないと時間がかかることがあります。
指定位置の情報取得:【ID】地形タグ, 地形タグ, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】地形タグ = 1
指定位置の情報取得:【ID】イベント, イベントID, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】イベント = 0
コモンイベント:プレイヤー情報取得
条件分岐:【座標X】出現予定 ≠ プレイヤーの位置X
ループの中断

それ以外のとき
条件分岐:【座標Y】出現予定 ≠ プレイヤーの位置Y
ループの中断

分岐終了

分岐終了

分岐終了

分岐終了

以上繰り返し


ループ処理となっていますが、ここでは、イベントが移動される場所を探しています

条件としては、乱数でX座標とY座標を設定します。
この時の範囲は、自分でマップの幅を設定する必要があります。
マップごとに数値を弄ってください。


注釈:デバッグ用の変数です。
注釈:ループ処理の試行回数をカウントします。
変数の操作:#0427 【デバッグ】試行回数 += 1


ちなみに、この部分は無くても良いです。
ここで、試行回数を判定していました。


指定位置の情報取得:【ID】地形タグ, 地形タグ, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】地形タグ = 1
指定位置の情報取得:【ID】イベント, イベントID, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】イベント = 0
コモンイベント:プレイヤー情報取得
条件分岐:【座標X】出現予定 ≠ プレイヤーの位置X
ループの中断

それ以外のとき
条件分岐:【座標Y】出現予定 ≠ プレイヤーの位置Y
ループの中断

分岐終了

分岐終了

分岐終了

分岐終了



ここの条件分岐で、イベントを出現させていいかを絞りこんでいます。

まず、地形タグで判定。ここの数値をいじることで、地形による出現判定を編集することができます。

tc36-017.png

地形タグは、タイルセットから設定することができます。今回は、地面のタイルに1番を設定しています。

ちなみに、地形タグはその位置の最も大きいものが取得されるようです。なので、今回の場合は地形タグが2番に設定されているものを乗せると、条件に引っかからなくなりますので気を付けてください。逆に、これを利用すると特定の場所だけ出現しないように設定できます。

指定位置の情報取得:【ID】イベント, イベントID, ({【座標X】出現予定},{【座標Y】出現予定})
条件分岐:【ID】イベント = 0


次に、イベントIDを読み込んでいますが、ここではイベントの上にかぶらないように振り分けしています。

イベントが被らないようにするための措置ですが、これを逆に利用すると、出現させたくない箇所に透明なイベントを置いとくだけで出現範囲から除くこともできます。


コモンイベント:プレイヤー情報取得
条件分岐:【座標X】出現予定 ≠ プレイヤーの位置X
ループの中断

それ以外のとき
条件分岐:【座標Y】出現予定 ≠ プレイヤーの位置Y
ループの中断

分岐終了

分岐終了


ここの部分は、プレイヤーの上に被らないようにする処理です。

プレイヤーのX座標とY座標を取得し、乱数で設定された座標が完全一致でない場合に、ようやくループを中断させます。


これで座標が決定したので、ようやく場所移動させることが出来ます。





条件分岐:【数値】出現数 = 5
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV006, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
注釈:出現数を0にすると、出現処理を行わなくなります。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0113 【EV】イベントE = ON
変数の操作:#0426 【数値】出現数 = 0

分岐終了
条件分岐:【数値】出現数 = 4
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV005, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0112 【EV】イベントD = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 3
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV004, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0111 【EV】イベントC = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 2
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV003, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0110 【EV】イベントB = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了
条件分岐:【数値】出現数 = 1
SEの演奏:Absorb2 (90, 100, 0)
注釈:出現させるイベントを指定してください。
イベントの位置設定:EV002, ({【座標X】出現予定},{【座標Y】出現予定})
注釈:次の出現処理を行うために、変数とスイッチを操作します。
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0109 【EV】イベントA = ON
変数の操作:#0426 【数値】出現数 += 1

分岐終了


ここでは、それぞれの条件によって移動させるイベントを指定し、決定した座標へ移動させる処理を行います。

ここでの注意点ですが、最後のイベントから順番に条件分岐を作っていきます

その理由ですが、最初の条件分岐以外では移動処理を行った場合に、

変数の操作:#0426 【数値】出現数 += 1


と記述しています。

これを出現数の若い順から作っていくと、次の分岐の条件を即座に満たしてしまい、結局一か所に全てのイベントが出現してしまいます。それを防ぐためにはいくつか手段がありますが、一番手っ取り早いのは、番号の大きい順に並べ替えてしまう事です(処理は通常逆行して行われないため)。



これで、ランダムに出現させる処理が出来ました。

システム自体はこれで完成です。

後のイベントは適当に組んで構いませんが、一応、見ていきましょうか。

今回は、デバッグできるように、必要そうな情報を表示したり、リセットしたりするための処理を置いています。


tc36-003.png

<実行内容>
文章:なし, ウィンドウ, 下
文章イベントをランダム歩数でランダム箇所に出現させるわ。
注釈:歩数カウントによるイベント出現テストを開始します。
スイッチの操作:#0030 【条件】出現設定起動 = ON
セルフスイッチの操作:A = ON


まずは、システム起動用の女の子のイベントですね。

システム起動のためのスイッチをONにするだけです。


tc36-004.png

<実行内容>
文章:なし, ウィンドウ, 下
文章テストを終了する?
選択肢の表示:はい, いいえ, 出現歩数を確認したい (ウィンドウ, 右, #1, #2)
はいのとき
文章:なし, ウィンドウ, 下
文章テストを終了し、初期化します。
注釈:以下、テストを終了し、初期化します。
変数の操作:#0428 【デバッグ】歩数 = 0
変数の操作:#0427 【デバッグ】試行回数 = 0
スイッチの操作:#0028 【条件】歩数出現A = OFF
イベントの位置設定:EV002, (12,0)
イベントの位置設定:EV003, (13,0)
イベントの位置設定:EV004, (14,0)
イベントの位置設定:EV005, (15,0)
イベントの位置設定:EV006, (16,0)
スイッチの操作:#0029 【条件】歩数出現B = OFF
スイッチの操作:#0109 【EV】イベントA = OFF
スイッチの操作:#0110 【EV】イベントB = OFF
スイッチの操作:#0111 【EV】イベントC = OFF
スイッチの操作:#0112 【EV】イベントD = OFF
スイッチの操作:#0113 【EV】イベントE = OFF
プラグインコマンド:OuterSelfSwitch off all A

いいえのとき

出現歩数を確認したいのとき
文章:なし, ウィンドウ, 下
文章出現歩数:
文章イベントA \v[421]歩,  イベントB \v[422]歩,
文章イベントC \v[423]歩,  イベントD \v[424]歩,
文章イベントE \v[425]歩,  合計   \v[417]歩

分岐終了


初期化の選択と、決定された歩数を見ることが出来ます

出現まで待たなくても、初期化と歩数確認で、きちんと目論見通りの数値になっているかを確認することができます。

今回は出現イベント達のページ出現条件を普通のスイッチで行い、ページ切り替えをセルフスイッチで行いました。

プラグインOuterSelfSwithを導入していれば、プラグインコマンドだけで操作できますので、【EV】イベントA~Eのスイッチは用意しなくても構いません。



tc36-006.png

出現条件:109 【EV】イベントA

<実行内容>
SEの演奏:Attack2 (90, 100, 0)
セルフスイッチの操作:A = ON


これは、出現されるイベント達の一人です。他のイベント達の中身も同じですので、他の方たちの処理は割愛させていただきます。

出現条件のスイッチはプラグインを導入している場合にはセルフスイッチでも操作できます。

内容は特にないので、適当な音を鳴らしてページを切り替えています。


tc36-007.png

出現条件:セルフスイッチA

<実行内容>
文章:なし, ウィンドウ, 下
文章出現処理の総試行回数は\v[427]でした。
文章総歩数は\v[428]でした。


取得した出現処理の試行回数と総歩数を表示しています。

最初の女の子が話している歩数(現在出現したイベントまでの合計)と、この歩数が一致していれば、処理がスムーズに行われている証拠です。異なる場合には、処理が重くなっているため必要以上に歩いている可能性があります。

出現処理の試行回数は目安として用意しましたが、たしか100回を超えても歩数がずれなかったので、相当数の試行回数にならない限りは大丈夫だと思います。



以上、デバッグの仕方も含めての解説でした。

こんな感じでいかがでしょう?


実際に作ってみて思いましたが、使い道はいろいろとありそうなシステムです。

さり気に、過去に作ったシンボルエンカウントの出現や無限ミミックの出現処理としても使えそうですね。

私も、自分の作品で使ってみようかと思います。




ではでは、今日はこの辺で。
ネコタでした。

それでは良いお年を!





↓お役に立ちましたら、クリックをお願いします↓
にほんブログ村 ゲームブログへ
にほんブログ村

にほんブログ村 ゲームブログ ゲーム制作へ
にほんブログ村

ブログランキング・にほんブログ村へ
にほんブログ村
スポンサーサイト

ゲーム制作日記<49> 場所移動できる場所移動システム

op.png



みなさん、こんばんは。
ネコタです。


ようやくインターネットがつながり、システム公開できるようになりました。
いやー、長かった。


さて、それでは早速。
今回も恒例の『 コモンイベントで作るちょっとしたシステム 』 のご紹介です。


今回ご紹介するシステムは、制作の補助システム。
『場所移動できる場所移動システム』です。

どういうことかというと、普通の場所移動イベントは、下記のような形のイベントだと思います。

tc35-011.png

<実行内容>
SEの演奏:Move1 (90, 100, 0)
場所移動:場所移動ラボ (5,2)


これは簡易作成で作れるイベント内容です。

場所移動では、普通、座標を指定してそこにプレイヤーを移動させるかと思います。

挙動はこれだけなのですが、このイベントには1つの問題点があります。

移動先の場所や移動元の場所がすでに決定していれば、これで何の問題もありません。

しかし、例えばMAPを作りながら「ここに階段を作りたいな」と思って作成した後、「やっぱり、あっちが良いな」なんて思うことがあるかもしれません。

また、テストプレイをしてみると思っていたよりも場所移動イベントの位置が近かったり遠かったりして・・・
位置を変えたいなぁ~、ということが制作中たびたび起こるかもしれません。

ただ、位置を変えると、イベントの座標指定を再設定しなおさなければなりませんよね!


これが、結構面倒くさいんです・・・。


よくあるのが、街でのショップの配置。

最初は武器屋を入口近くに置いていたけど、宿屋の方が近くにあった方がいいな、とか。

過去に描いたMAPが今見ると微妙に見えてきて、再度描きなおした。その結果、いくつもの建物の配置を変えた。

そういった場合に、たくさんの場所移動イベントの内容を書き換えないといけなくなります


そこで、こういった問題を一挙に解決してくれるのが、今回のシステムとなります。

なんと、一度制作した場所移動イベントの中身を書き換えなくても、イベントの位置をそのままひょいっと移動してやるだけであら不思議。

自動で移動先も移動元も座標を変えてくれるじゃありませんか!


今回紹介するシステムは、そんな制作補助システムとなっています。


それでは、準備するものを確認していきましょう。



【必要なもの】
スイッチ ×1
変数 ×5
コモンイベント ×1
場所移動イベント


【推奨】
ドア・スイッチ挙動用コモンイベント
場所移動時挙動用コモンイベント
マップ範囲取得用コモンイベント
プレイヤー情報取得用コモンイベント
変数 ×4



まずは、【推奨】のコモンイベントを見ていきましょう。


ドア挙動用コモンイベント
tc35-002.png

<実行内容>
条件分岐:このイベントが下を向いている
SEの演奏:Door1 (90, 100, 0)
移動ルートの設定:このイベント (ウェイト)
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇向き固定OFF
移動ルートの設定:◇左を向く
移動ルートの設定:◇ウェイト:5フレーム
移動ルートの設定:◇右を向く
移動ルートの設定:◇ウェイト:5フレーム
移動ルートの設定:◇上を向く
移動ルートの設定:◇向き固定ON

それ以外のとき
SEの演奏:Door1 (90, 90, 0)
移動ルートの設定:このイベント (ウェイト)
移動ルートの設定:◇すり抜けOFF
移動ルートの設定:◇向き固定OFF
移動ルートの設定:◇右を向く
移動ルートの設定:◇ウェイト:5フレーム
移動ルートの設定:◇左を向く
移動ルートの設定:◇ウェイト:5フレーム
移動ルートの設定:◇下を向く
移動ルートの設定:◇向き固定ON

分岐終了


ドアやスイッチの挙動を予めコモンイベントにしておくと、制作が少し楽になります。
大抵の場合、ドアやスイッチの挙動は全部同じ挙動をするはず。

ちょっと挙動に違和感があったりして修正が必要となった場合に、コモンイベントで挙動を設定していると、これ1つ修正すれば事足ります。いちいち全てのイベントを回る必要がないので、修正の手間が大きく省けるんですね。


場所移動時挙動用コモンイベント(階段移動)
tc35-010.png

<実行内容>
条件分岐:【移動】階段移動 = 1
SEの演奏:Move (90, 100, 0)
条件分岐:プレイヤーの向き = 4
移動ルートの設定:プレイヤー
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇移動速度:2
移動ルートの設定:◇左上に移動

分岐終了
条件分岐:プレイヤーの向き = 6
移動ルートの設定:プレイヤー
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇移動速度:2
移動ルートの設定:◇右上に移動

分岐終了

分岐終了
条件分岐:【移動】階段移動 = 2
SEの演奏:Move (90, 90, 0)
条件分岐:プレイヤーの向き = 4
移動ルートの設定:プレイヤー
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇移動速度:1
移動ルートの設定:◇左下に移動

分岐終了
条件分岐:プレイヤーの向き = 6
移動ルートの設定:プレイヤー
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇移動速度:1
移動ルートの設定:◇右下に移動

分岐終了

分岐終了


このコモンイベントは何かというと、階段移動をする場合にプレイヤーのモーションを設定しているイベントです。

何となく、階段を上り降りする際に動かないのは味がないなぁ・・・と思いまして。

このコモンイベントを挿入しておくと、階段に触ったときにプレイヤーが階段を上っている(あるいは降りている)ように動きます。

ちなみに、変数【移動】階段移動=1は上り階段、=2は下り階段を表します。

プレイヤーの向きは、
2=↓
4=←
6=→
8=↑

を表しています。


コモンイベント:マップ範囲取得
tc35-012.png


<実行内容>
変数の操作:#0164 マップX範囲 = $gameMap.width() -1
変数の操作:#0165 マップY範囲 = $gameMap.height() -1


以前に紹介したシステムでも何度か紹介していますね。無限ミミック畑システムアイテムを使った採集システムでも利用しているコモンイベントですが、この処理では、今いるマップのX軸とY軸の範囲を取得しています。

色んな場面で利用する処理ですので、コモンイベントにしておくとちょっとだけ便利です。

この処理内容自体は、今回のシステムに必須のものとなります。


コモンイベント:プレイヤー情報取得
tc35-013.png

これは、プレイヤーのマップ上での位置情報や向きを取得するコモンイベントです。

先に紹介した階段移動演出にプレイヤーの向きを使用するので、これを挿入してあげるだけでシュッと情報を取得できます。

これも、システムを作るうえでそこそこ使うコモンイベントですので、用意しておくといいでしょう。

(なお、今回のシステムではプレイヤーのX座標とY座標は使用しないため、用意するものの変数には含まれていません)




さて、推奨コモンイベントはこんなところで。

それでは、イベントの作成に入っていきましょう。

まずは、システムのコアとなるコモンイベントを作ります。


コモンイベント:ポジション設定
tc35-003.png

<トリガー> 自動実行
<スイッチ> 0032 【移動】ポジション設定

<実行内容>
注釈:画面を暗転させ、移動の処理を開始します。
画面の色調変更:(-255,-255,-255,0), 15フレーム (ウェイト)
注釈:指定したMAPへ移動します。この時の場所はどこでも構いません。
場所移動:{マップID} ({【移動】移動先X},{【移動】移動先Y}) (フェード: なし)
注釈:検索する移動先のX座標とY座標を左上端に設定します。
変数の操作:#0408 【移動】移動先X = 0
変数の操作:#0409 【移動】移動先Y = 0
注釈:移動先MAPの左上端から順に、指定されたイベントIDを探します。
コモンイベント:マップ範囲取得
ループ
指定位置の情報取得:【移動】イベントID, イベントID, ({【移動】移動先X},{【移動】移動先Y})
条件分岐:【移動】イベントID = 【移動】移動先EV
ループの中断

分岐終了
条件分岐:【移動】移動先X ≠ マップX範囲
変数の操作:#0408 【移動】移動先X += 1

それ以外のとき
変数の操作:#0408 【移動】移動先X = 0
条件分岐:【移動】移動先Y ≠ マップY範囲
変数の操作:#0409 【移動】移動先Y += 1

それ以外のとき
変数の操作:#0409 【移動】移動先Y = 0

分岐終了

分岐終了

以上繰り返し
注釈:指定されたイベントIDの位置へプレイヤーを移動します。
場所移動:{マップID} ({【移動】移動先X},{【移動】移動先Y}) (フェード: なし)
注釈:移動の種類により、移動した位置からのポジションを調節します。
移動ルートの設定:プレイヤー (飛ばす, ウェイト)
移動ルートの設定:◇移動速度:4
移動ルートの設定:◇歩行アニメOFF
移動ルートの設定:◇すり抜けON
移動ルートの設定:◇一歩前進
移動ルートの設定:◇すり抜けOFF
移動ルートの設定:◇歩行アニメON
注釈:移動の種類、向き情報をリセットします。
変数の操作:#0412 【移動】階段移動 = 0
変数の操作:#0002 プレイヤーの向き = 0
注釈:移動終了の処理を開始し、移動を終わらせます。
画面の色調変更:(0,0,0,0), 15フレーム (ウェイト)
スイッチの操作:#0032 【移動】ポジション設定 = OFF


この処理は何をやっているかというと、移動そのものを行っています。


ざっと内容を説明すると、

画面をフェードアウトさせて、その間にプレイヤーの移動先を探し出し、プレイヤーを移動させています。

移動が完了したら、画面をフェードインし、処理を終了します。




ここで出てくる幾つかの変数(マップID、イベントID)は、場所移動イベントの方で指定します。

また、このコモンイベントはトリガーとしてスイッチ0032 【移動】ポジション設定を指定しています。


すなわち、場所移動イベント移動先のマップイベントIDを指定し、このスイッチONにすることで移動が開始される、という仕組みとなっています。



それでは、準備が整ったところで、実際の場所移動イベントを見ていきましょう。


今回はデモ用として、こんなマップを用意しました。

外観
tc35-004.png

内観1F
tc35-005.png

内観2F
tc35-006.png


沢山のお家と内装を用意しました。
階段もいっぱいありますね。

これらの場所移動イベントは、全て最初に紹介したコモンイベント1つで動作します。



まずは、外観のドアイベントを見てみましょう。

tc35-001.png

<実行内容>
コモンイベント:【ドア】ドア挙動
変数の操作:#0018 マップID = 12
変数の操作:#0411 【移動】移動先EV = 3
スイッチの操作:#0032 【移動】ポジション設定 = ON


内容は簡潔ですね。

コモンイベントドア挙動でドアを開く動作をさせ、変数を設定して、移動用コモンイベントトリガースイッチON

あとは、最初につくったコモンイベントがプレイヤーを指定したマップの指定したイベントに移動させてくれます。



次に、内観の1F出入り口のイベントを見てみましょう。

tc35-007.png

<実行内容>
注釈:ドアの挙動を行います。
注釈:下向き=ドアが開く
注釈:それ以外=ドアが閉まる
移動ルートの設定:このイベント (ウェイト)
移動ルートの設定:◇上を向く
コモンイベント:【ドア】ドア挙動
注釈:移動先のMAPと、このイベントに紐づいているイベントIDを設定します。
変数の操作:#0018 マップID = 11
変数の操作:#0411 【移動】移動先EV = 1
注釈:移動の処理を開始します。
スイッチの操作:#0032 【移動】ポジション設定 = ON


まあ、ドアイベントなので、やってることは同じです。

ドアの演出をして、移動先のイベントIDを指定して、スイッチON

それだけでした。



次に、内観1Fの階段イベントを見てみましょう。

tc35-008.png

<実行内容>
注釈:階段による移動、上り下りの判定を行うための変数を設定します。
注釈:0=階段ではない移動
注釈:1=上り階段
注釈:2=下り階段
変数の操作:#0412 【移動】階段移動 = 1
注釈:プレイヤーの向きを取得します。
コモンイベント:プレイヤー情報取得
注釈:階段移動のSEを鳴らします。
コモンイベント:【移動】階段
注釈:移動先のMAPと、このイベントに紐づいているイベントIDを設定します。
変数の操作:#0018 マップID = 13
変数の操作:#0411 【移動】移動先EV = 1
注釈:移動の処理を開始します。
スイッチの操作:#0032 【移動】ポジション設定 = ON


コモンイベントの詳しい内容は、【推奨】コモンイベントを見て頂ければと思います。

演出の内容を変数でちょいちょいと指定し、ドアイベントと同様に移動先を変数で指定してスイッチON。

慣れてくると、簡単設定です。


最後に、2Fの下り階段イベントを見てみましょう。

tc35-009.png

<実行内容>
注釈:階段による移動、上り下りの判定を行うための変数を設定します。
注釈:0=階段ではない移動
注釈:1=上り階段
注釈:2=下り階段
変数の操作:#0412 【移動】階段移動 = 2
注釈:プレイヤーの向きを取得します。
コモンイベント:プレイヤー情報取得
注釈:階段移動のSEを鳴らします。
コモンイベント:【移動】階段
注釈:移動先のMAPと、このイベントに紐づいているイベントIDを設定します。
変数の操作:#0018 マップID = 12
変数の操作:#0411 【移動】移動先EV = 1
注釈:移動の処理を開始します。
スイッチの操作:#0032 【移動】ポジション設定 = ON


ぶっちゃけ、上り階段をコピペして、変数をちょちょいと変えただけです。

階段や扉を1個ずつ作ってしまえば、あとはコピペ変数操作で作れるので、実質的な負担は少なかったりします。



以上、こんな感じでコモンイベントを介して、イベント同士を変数で紐づけすることができます。

マップ編集をよく行う方は、ぜひ導入してみてください。

きっと、制作が楽になると思います。




ではでは、今日はこの辺で。
ネコタでした。





↓お役に立ちましたら、クリックをお願いします↓
にほんブログ村 ゲームブログへ
にほんブログ村

にほんブログ村 ゲームブログ ゲーム制作へ
にほんブログ村

ブログランキング・にほんブログ村へ
にほんブログ村
プロフィール

猫民のんたん

Author:猫民のんたん

ネコタ:ゲーム作りが趣味の薬剤師。本職とゲーム作りの2足の草鞋を履きこなそうと日々奮闘。

毎週曜日or曜日に更新予定。
-------------------------

ミノン:ゲーム作り初心者で2児の母。前職はSE/PG。子育てをしながらゲーム作りを行おうと、日々奮闘中。

育児中のため活動休止中

最新記事
最新コメント
月別アーカイブ
カテゴリ
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR