※ 2021-12-10追記:
RPGツクールMZのVersion 1.4で、タイマーの挙動が修正されました。が、条件分岐のタイマー判定が正しくなっただけで、残り秒数の画面表示や変数取得の場合はこれまで通り小数点以下が切り捨てられる仕様のようです。これらの挙動も修正したい方、およびRPGツクールMVをご利用の方は引き続き本プラグインをご利用ください。
RPGツクールのタイマー機能には、想定より1秒早く終了判定されうるという不具合があります。
RPGツクールMV/MZにて、その不具合を修正するプラグインを作成しました。
RPGツクールシリーズにはタイマー機能があります。
昔のシリーズから存在する機能で、秒数を指定してのタイマーの始動と停止、タイマーの残り秒数による条件分岐、およびタイマーの残り秒数を変数に取得・操作することができます。また、タイマーの稼働中は画面内に残り秒数が表示されます。
この機能を使うと、1分以内に脱出!とか、30秒後に爆発する爆弾!とか、リアルの時間経過に依存するイベントを作成することができます。ミニゲームや時限イベントで活躍する機能です。
先日、星潟さんより、一部のツクールシリーズではこのタイマー機能に小数点以下の計算が行われない不具合がある旨、報告がありました。
こちらで調べたところMZでも同様の不具合があったので、修正プラグインを作成しました。
なお、VX Ace用の修正スクリプトは上記、星潟さんのサイトにあるので、そちらをご利用ください。
不具合の内容と原因
例えば右のように、タイマーを3秒で開始して、タイマーが0秒以下になるまでループさせるイベントを組んだ場合、実際には3秒ではなく2秒でループが終わってしまいます。
タイマーを1秒にすると一瞬で終わるので、より顕著に不具合が分かります。
不具合の原因は、条件分岐でタイマーの残り秒数の判定をする際に、小数点以下の秒数が切り捨てられている点です。
タイマーは内部ではフレーム数(1フレームは1/60秒)で管理されており、1フレーム経過するごとに残りフレーム数が1ずつカウントダウンされます。
そして残り秒数の判定や表示の際には、残りフレーム数を60で割って残り秒数として使用される仕組みになっているのですが、この時に小数点以下の秒数が「切り捨て」られるようになっています。
この時どうなるかというと、残り1秒から1フレーム経過して残り0.983秒(59/60秒)となった段階で、小数点以下が切り捨てられて0秒として判定されてしまいます。実際にはまだ0.983秒残っているにもかかわらず、1秒をわずかでも切った時点で0秒と判定されてしまうのです。
条件判定が「以上」の場合は正しく判定されますが、「以下」の場合は約1秒早く判定されてしまいます。たいていは「0秒以下」の条件で終了判定する使い方だと思うので、不具合の影響を受けることになります。
たった1秒ではありますが、たいていタイマー機能は制限時間内に何かせよ、というイベントやミニゲームで使用されるので、1秒といえどもかなり重要な意味を持つのではないでしょうか。
修正内容
このプラグインを導入すると、条件分岐のタイマー判定が小数点以下まで含めて正しく判定されます。
具体的には条件分岐のタイマー判定においては、小数点以下込みの数値で判定されます。例えば条件を「3秒以下」とした場合、正しく3.00秒になった瞬間に条件に合致します。従来は3.99秒になった瞬間に条件に合致してしまいました。
また、画面内に表示される残り秒数は、小数点以下を「切り上げ」て表示するように修正しています。従来は残り秒数が1秒を切って0.99秒になると、画面内の表示は0:00となっていましたが、上記不具合が修正されたことにより、このままだと画面上は0:00と表示されながらも、実際にはまだあと1秒弱の猶予があります。これだと紛らわしいため、表示が0:00になった瞬間にタイムアップとなるよう、小数点以下の秒数を「切り上げ」としています。
それから「変数の操作」にも、タイマーの残り秒数を代入・操作する機能があります。これは画面上に表示されている残り秒数と同じ秒数が取得できた方がよいと思うので、同じく「切り上げ」としています。
なお、既に修正前の状態で秒数の調整をされている場合は、本プラグインを導入して修正することによって、逆に想定よりも1秒長くなってしまうことになるため、タイマーを使用しているゲームに後から導入する場合は、ご注意ください。
質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。
コメント
はじめまして。プラグインを拝借いたします。
大変助かりました。ありがとうございます。
なお、成人向け有償同人ゲームで使用予定です。万が一問題ございましたらご指摘ください。
よろしくお願いいたします。
ご利用いただき、ありがとうございます!
特に成人向き、有償などで利用制限は設けていませんので、どうぞご利用ください!
はじめまして。
こちらのプラグインを使用させていただいたのですが、
わからないことがあり質問させてください。
このページの「不具合の内容と原因」項目の画像と同じイベントをコモンイベントで作成し実行したところ、マップイベントでは正しく動作したのですが戦闘(スキル効果で該当コモン呼び出し)で実行すると時間切れの際にタイマー停止やループ中断ではなく何故か戦闘が中断してしまうのですが、これは仕様でしょうか?
「味方がコモン実行のスキル発動」
→「制限時間内にエンターキー10回」
→「成功で大ダメージ/失敗で反射ダメージ」
のような仕組みを実装したく、また制限時間を他プラグインを用いてゲージ表示する為に、ツクールMVのタイマー不具合を修正するこちらのプラグインをどうしても使いたいと考えています。
(このプラグインをOFFにすると時間切れ時の挙動は正しく実行されますが、このプラグインなしで制限時間をゲージ表示すると、やはり残り1秒分ゲージが残った状態で時間切れになってしまう)
長くなってしまい申し訳ありません。よろしくお願いします。
タイマー終了時に戦闘が中断するのは、ツクールの仕様ですね。
標準だと、条件分岐で0秒と判定されても、実際にはタイマーが残っているので戦闘中断せずに処理が可能だけど、このプラグインを入れると正しくタイマーの終了で0秒になるため、同時に戦闘中断してしまう感じでしょうか。
プラグインの末尾(最後の })(); の「手前」の行)に
Game_Timer.prototype.onExpire = function() {
};
と入れてやれば、戦闘中断の処理はなくなると思います。
標準ではタイマー終了時に戦闘中断に飛ばしていて、その処理を消しているだけなので、大丈夫だとは思いますが、他の副作用があるかは未確認です。
早速の返信ありがとうございます!
そもそもツクールMV側の仕様だったんですね。
(FixedTimer.jsをOFF,時間切れ条件分岐無し,タイマー始動のみのイベントで一度確認すれば、そうと気づける内容でした...)
また、解決法までご提示いただきありがとうございます!
お教えいただいた内容をプラグインに追記したところ、希望する動作を得ることができました。
マップシーンでも動作に問題無く、
変更内容も「BattleManager.abort();」を消しているだけ?のようですので、副作用はなさそうです。
このFixedTimer以外でもpanda様のプラグインは利用させていただいており、どれも非常に助かっています。
この度はありがとうございました。
問題なく解決したようで良かったです!
確かにタイマー終了時に戦闘中断するので嬉しいケースをあまり思いつかないので、この辺変更できる機能があってもいいかもしれませんね。