こんにちは。
普段より更新頻度を高めてお送りしております。RPGツクールMZ(RPGMakerMZ)でスクリプトを使わない入力判定作成をまとめる挑戦企画、第4回目です。
自分の予想ではSTEP8~9くらいまでの構成になる見込みです。その後サンプルゲームの作成も含めて今月中に完成しなければ10月イベント(クリエイターズ文化祭)での配布案はボツとなります。店舗外観などの準備も必要ですからどこかで見切りをつけないと(;´Д`)
今回のテーマは時間計測。
ボタン(キー)が押されている、または放されている時間(フレーム数)を計測し、その値によって処理を変えるというものです。
※解説内容はRPGツクールでスクリプトは使わないものの、変数やスイッチなどの基本を知っている方向けくらいのものになります。
※イベントの組み方は様々であるためここの方法が最善とは限りません。予めご了承ください。
これが理解できると前回やった長押し判定の24フレームという縛りを自在に変更できるようになりますし、次回以降で解説予定の連打判定なんかもできるようになります。
今回はコモンイベントを複数使います。
まずは基盤となるボタンが押された時を判別してカウントするイベントを作成。
一番外側の条件分岐で”ボタンが押されている”と”それ以外”を作成し、その中にカウント用の変数に1加算するというコマンドを入れています。並列処理なのでこれが繰り返されることによって時間の経過とともに各変数の値が増えていくという仕組み。
カウント用変数のコマンドの外側にある分岐(変数<360のやつ)はカウントの上限を360までとしているものです。押カウントか放カウントが360に達したら初期状態に戻すためのコモンイベント(後述)を呼び出してこのイベントを終わらせています。
カウントの上限を無くし違うきっかけでカウントイベントを終わらせる場合はこの条件分岐(カウント変数<360)は要りません。
こういったカウント(加算して計測する)の処理は実はコアスクリプト内でも行われていまして、スクリプトやプラグインで取り出すこともできなくはないのですが、イベントコマンドだと制御が簡単で把握し易いというメリットがあります。
カウント用のコモンイベントは以上で、カウント数に対するイベントは別のコモンイベントで作成しています↓
サンプルとしてボタン(キー)を押している間は1番のピクチャが動き、放している間は2番のピクチャが動く、というものを作りました。
カウント変数を使ってピクチャ表示の座標に割り当てる変数の値を変化させ、ピクチャの表示と座標の演算を繰り返すことでピクチャが動いているように見せる、という仕組みです。
赤字の部分が変数の演算で、単純にY座標になる変数からカウント変数を引いているだけです。その後の紫の文がピクチャの表示。カウント変数は値が増えていく変数なのでピクチャは画面の上へ移動していくことになります。
最後のウェイトは描画頻度を制御するために入れたものです。
このピクチャ表示イベント(並列処理)の発動条件としているスイッチはカウント用のコモンイベントの条件としているスイッチとは別のスイッチにしています。
その理由はこの全体のイベントを終了するときにあります。
下の画像は全体を終了させるためのイベントで、カウントのコモンイベント内で呼び出しているSTEP4-リセットというやつです。
表示したピクチャを消去し、カウント用変数の値をゼロに戻して発動用スイッチ(例では7番スイッチ、 STEP4赤スイッチというやつ)をオフにしています。発動用スイッチは最後にオフにするので、ピクチャ表示イベントの条件もこのスイッチにしてしまうとピクチャを消去したいのにまた表示されてしまうことになります。
じゃあ”STEP4赤スイッチ”をオフにした後ピクチャを消去したら良いのでは?と思うかも知れません。
しかしそれはうまく行きません。このリセットイベントは並列処理のカウントイベントから呼び出されますが、呼び出し元の並列処理が中断されると呼び出されたイベントも基本的には中断されるのです。”STEP4赤スイッチ”をオフにした時点でこのイベントも止まり、ピクチャの消去は実行されないということ。
なので”STEP4赤スイッチ”は最後。ピクチャ表示イベントは別のスイッチ(STEP4描画)を使ってピクチャ消去の前に停止させます。
直後に入れたウェイト1フレームは、ピクチャ表示イベントのサイクル制御でウェイト1フレームを使ったので表示と消去が前後しないように同じ間隔を持たせたものです。
まぁ実を言うとリセットイベントも並列処理にして別スイッチで管理したら発動スイッチオフ後に消去って方法もできるんですけどね。
並列処理を扱う注意点として以下を言いたかったんです。
①並列処理イベントに呼び出された並列処理でないイベントは呼び出し元が止まるとその処理が途中でも止まる。
②加えて、並列処理にウェイトを挟むと想定した処理順にならないってことになりがち。なので無理に1つのスイッチに多数の役割を持たせず役割別にスイッチを置いて整理した方が解決しやすい(かも)。
この辺の並列処理の”クセ”はなかなか手強いんですよね…(;´∀`)
特に②。自分の場合ですけど「なぜそうなる!?」っていうときはだいたい並列処理にウェイト使ってるとき(;´∀`)
今回は以上となります。ありがとうございました!
内容が複雑になってきて記事も長くなってしまいました…いそげぇ(;´Д`)