タイマーを自作する
タイマーを自作する
最近のゲームでは、最初始めてから今までの「プレイ時間」が、メニュー画面やセーブ/ロード画面などで確認ができるようになっているシステムが多くなっています。
しかし RPGツクール2000 には、そのプレイ時間を計測するシステムが全くありません。そこで、ここでは、プレイ時間を計測するシステムを、RPGツクール2000のイベントで実現する方法について解説していきます。
※ここでは主にプレイ時間を計測するためのシステムを作りますが他の用途でも利用できるので、このページのタイトルはあえて「タイマーを作る」としています。
※「プレイ時間を計測するシステム」は、以下「タイマー」と略します。
タイマーの仕組み
では、まずはタイマーがどのようにして動作するのか大雑把に解説します。
1秒待つ → 時刻を更新 → 1秒待つ → 時刻を更新 → ・・・(繰り返し)
ここでは1秒単位で時間を計測するシステムを作ります。まずは1秒の間だけ待たせて、その後にプレイ時間のデータを更新する処理を行うようなシステムにします。
「プレイ時間の更新」の処理についてですが、最も簡単に作れるのは、単に1秒ずつ増やしていく「秒」のみタイマーです。しかし、それではプレイ時間が直感的にわかりにくいし手抜き過ぎなので、「時間 : 分 : 秒」で表されるデジタル時計形式のタイマーを作ります。
さてタイマーを作る前に、プレイ時間のデータを格納するための変数が必要なので用意します。「秒」「分」「時間」の3つの変数を作り、それぞれに「秒」「分」「時間」の値を格納します。
プレイ時間を更新するときは、「秒」を1ずつ足していき、60になったときに「秒」を0に戻し「分」を1足します。「分」が60になったら「分」を0に戻し「時間」を1足す、という処理を実装します。
以下にその処理の簡単なフローチャートを示します。

イベントを組む
それでは早速、タイマーを実現させるためのイベントを組んでみましょう。
データベースを開き、「コモンイベント」タブをクリックし、コモンイベントの編集画面を出してください。それから適当な名前を入れた新しいコモンイベントを作成してください。
そしたら、「イベント開始条件」を「定期的に並列処理する」に、「出現条件スイッチ」を適当なスイッチに設定します(図1参照)。
▼図1

◆ウェイト:1.0秒
◆変数の操作:[001:タイム秒]加算, 1
◆条件分岐:変数[001:タイム秒]が60
◆変数の操作:[001:タイム秒]代入, 0
◆変数の操作:[002:タイム分]加算, 1
◆条件分岐:変数[002:タイム分]が60
◆変数の操作:[001:タイム分]代入, 0
◆変数の操作:[003:タイム時間]加算, 1
:分岐終了
:分岐終了
先ほど解説した処理をイベントで実現しています。
下記の例では、「タイム秒」「タイム分」「タイム時間」という変数を使用していますが、使用する変数は、それぞれの環境にあわせて変更してください。
なお、スイッチの操作で、タイマーの動作のオンオフがいつでもできるように、「出現条件」を利用しています。
※マップイベントに組み込む場合は、出現条件のスイッチに適当なスイッチを割り当てて下さい。
デバッグプレイ
▼図2

イベントを作り終わったらテストプレイです。
まずテストプレイでゲームを開始し、[F9]を押して現れる画面(図2参照)でタイマーのスイッチをONにして、再びゲームに戻ります。
それから、少し待ってもう一回[F9]を押して、プレイ時間が代入されている変数を確認してください。
上手くイベントが組めた場合は、1秒毎に値が増えていると思います。
次に、正常に「分」が進むかテストします。
タイム秒の値を59に変えて、ゲームに戻り1秒待ってからまた[F9]を押してみてください。
タイム秒の値が0に戻り、タイム分の値が1になっていると思います。
同じように今度は、タイム分の値を59に、タイム秒の値を59に変更して、ゲームに戻り1秒待ってからまた[F9]を押してみてください。
すると、タイム分とタイム秒の値が0に戻り、タイム時間が1になっていると思います。
ここまで正常に動作したら成功です。
組むのに失敗したら・・・
自分で組んだイベントが正常に働かない場合もあります。
そのようなことになった場合は、まずは原因を究明してください。組んだイベントをじっくり確認し、上記と違うところなどを探してください。原因がわかったらそこを修正しましょう。
どうしても原因がわからない場合は、イベントを全部消して作り直す方法もあります。
このTipsで、タイマーを自作しました。
ところが、実はその処理方法だと、経てば経つほど時間が遅れてしまうのです。
そこでここで、その遅れを防ぐタイマーの作り方をちょっと解説したいと思います。
遅れる原因
1秒待った後に、変数の操作や条件分岐等をするようになっていると思いますが、これが送れる原因になっているのです。
変数の操作に条件分岐・・・と処理している間にもわずかに時間がかかりますが、この時間がかかってから1秒待つ処理をするため、実質的に待ち時間は1秒よりもわずかに多くなってしまうことが原因です。
つまり、時間が経てば経つほど、どんどん余計な分の待ち時間が重なり、やがて大きな遅れを生じさせてしまうことになります。
また、他のイベントも同時に処理している場合も、余計に遅れてしまう可能性があります。
実際にストップウォッチを用意して実験してみたところ、1時間経過後、ストップウォッチとRPGの方とで、約1分の遅れが生じました。
この結果から、1分経過→1秒の遅れ・1秒経過→1/60秒の遅れ が生じると考えられます。
このように、今までのタイマーだと、結構不正確でかなり遅れることがわかります。また、PCそのものが低スペックだったり、他にプロセスを多く起動すればするほど、遅れは開いていくと考えられます。
解決策
では、どうやって遅れを防げばいいのでしょうか。
この問題を防ぐ方法として挙げられるのが、「1秒待つ処理」と「プレイ時間を更新する処理」を並列処理させるということです。
並列処理をさせれば、完璧にとはいかないものの前回の方法よりも遅れは小さくできるはずです。
では、その「並列処理」をRPGツクール2000で実現するには?
それには、コモンイベントを2つ使えば実現できます。1つ目のイベントには1秒待つ処理、2つ目のイベントにはプレイ時間を更新する処理を書きます。そして、両方のイベントの開始条件を「定期的に並列処理」にします。
そのタイマーを作動させたときに、まず1つ目のイベント(ウェイト)で1秒ウェイトされ、その後に2つ目のイベント(時刻変更)を実行させます。そしてそれが実行中のときに、1つ目のウェイトイベントはまた処理を開始します。
2つ目のイベントの呼び出し方法ですが、「イベントの呼び出し」で時刻の更新処理を呼び出すと、その処理がおわるまで呼び出し元のイベントは待機することになるので、全く意味がありません。
ここでは、時刻の更新処理を呼び出すのには「スイッチの操作」を使います(例として「プレイ時間更新」というスイッチがあることにします)。
これがONになると、プレイ時間の更新を自動的に行ってその後再びスイッチをOFFにしてくれるようにします。
こうしてやれば、並列して実行するようにするため(定期的に並列処理にするので)、処理に時間がほとんどかかりません。
※ただし環境によっては早くなるとは限りません。
イベントを組む
1つ目のイベント:[イベント開始条件] 定期的に並列処理する・[出現条件スイッチ] 適当に
◆ウェイト:1.0秒
◆スイッチの操作:[002:プレイ時間更新]をONにする
2つ目のイベント:[イベント開始条件] 定期的に並列処理する・[出現条件スイッチ] プレイ時間更新
◆変数の操作:[001:タイム秒]加算, 1
◆条件分岐:変数[001:タイム秒]が60
◆変数の操作:[001:タイム秒]代入, 0
◆変数の操作:[002:タイム分]加算, 1
◆条件分岐:変数[002:タイム分]が60
◆変数の操作:[001:タイム分]代入, 0
◆変数の操作:[003:タイム時間]加算, 1
:分岐終了
:分岐終了
◆スイッチの操作:[002:プレイ時間更新]をOFFにする
ここでこのイベントの内容を解説します。
まず、「1秒待つ部分」のイベントで、1秒待ちます。
その後、「スイッチの操作」でスイッチをONにし、後は先頭に戻って、すぐにまた1秒待つことになります。
一方、スイッチがONにされると、上記のイベントと並列して時刻更新が実行されます。
この方法により、少しながら時間の遅れを減らすことができます。
タイマーを自作する サンプルのダウンロード
今回のTipsの完成プロジェクトがダウンロードできます。以下のリンクをクリックしてダウンロードし、解凍して下さい。
プレイ方法
ゲームを始めたらまずは青年に話し掛けて、タイマーのON/OFFをしてください。その後、中年の男性に話し掛けると、現在時刻がわかります。老人に話し掛けると、時間が経っていく様子がわかるように連続的に文章を表示します。女性に話しかけると時刻のリセットができます。
xl_rpg_tips1.zip | 376.81kB
まとめ
- 1秒ごとの時間を計測するには、「1秒待つ → 時刻を更新 → 1秒待つ → 時刻を更新 → ・・・」の処理を繰り返す
- デジタル時計式に時刻を更新する際には、変数の値を、60秒経過したら1分足し、60分経過したら1時間足す
- イベントは、スイッチなどを利用して「定期的に並列処理する」のイベントを同時に動かせば、並列処理が可能
- このTipsのタイマーで、 1秒待つ処理 と 時刻を更新する処理 を分離して並列処理すれば、少しは時刻がズレるのを抑えられる

