はじめてのRmakeスクリプト
第07回 時間の動作をマスターしよう
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
こんにちは 簸川 葵(ひかわ あおい)と申します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
こんにちは 剣 芽優(つるぎ めゆ)です
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
この連載ではスクリプトの基礎を、じっくりとお話していきます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8706/C02_02_04.png)
分からないところがあったら、過去の記事を調べてね
前回では数値の応用についてお話しました
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
今回は、『時間の動作』についてお話します
07-01 時間待機
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
次の会話までの間や宿屋の宿泊中など、一定時間処理を待機させたい場合
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
Rmakeでは
waitTime関数を使用します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
時間を操作することもできるのね
waitTime関数に待機したい時間を渡すと、その時間だけ処理が停止します
speak("ちょっとまってね")
#1秒待機する
waitTime(1000)
speak("もういいよ")
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
「1秒」待つだけなのに「1000」って数値が渡してあるよ
waitTime関数に渡す値は1ミリ秒が基準となっているためです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
ミリは1000分の1だから、1000ミリ秒で1秒なのね
07-02 時間の計測
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
あるイベントから別のイベントまでにかかった時間を知りたい場合
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
Rmakeでは
setBaseTime関数と、
getTime関数を使用します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8700/C02_02_02.png)
今度は時間を計る処理ね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
まずは
計測のスタート場所にsetBaseTime関数を書きます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
ストップウォッチでいうと、スタートボタンを押すタイミングね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そして、
時間を取得する場所でgetTime関数を書きます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
なお、このとき計測中の時間は停止しません
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
ストップウォッチでいうと、ラップ計測ボタンを押すタイミングかしら
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
そうですね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
再度、setBaseTime関数が実行されるとリセットと再スタートが実行されます
#時間の計測スタート
setBaseTime()
#5秒待機する
waitTime(5000)
#計測スタートからの時間を取得する
t = getTime() / 1000
#小数点以下を切り捨てる
t = floor(t)
#変数「t」の内容を表示する
speak(toString(t) + "秒かかったよ")
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
getTime関数のところで、1000で割ってるわ
getTime関数の戻り値は1ミリ秒が基準となっているためです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
waitTime関数のときと似ているのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
その後は何をしているの?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
変数「t」には1000で割った分、小数点以下の端数が変数に含まれています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
これを
floor関数を使用することで整数のみに変更しています
floor関数で整数に変更した後、変数「t」に上書きしているわけね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
より高度な用途としては
FPS管理に応用することもできます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
FPS・・・?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
「Frames Per Second」の略で、1秒あたりに何枚画像表示を切り替えるか、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
といった処理の事です。
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
うーん・・・ よく分からない
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8691/C01_02_04.png)
そのうち、
シューティングや
アクションをつくるようになった時に
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8691/C01_02_04.png)
そんなものがあった と思い出せれば大丈夫ですよ
07-03 日時の取得
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
期間限定のイベントや時刻と連動したイベントなどを行いたい場合に、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
現在の日時を取得することもできます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
今が「何年 何月 何日 何時 何分 何秒」なのか分かるってこと?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
「何ミリ秒」まで取得することができます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
これもミリ秒が基準となっているのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
Rmakeでは日時の取得を2箇所を基準に行うことができます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
ひとつめはゲームをプレイしている、ユーザのパソコン(ローカル)の時刻
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
これは
getLocalCurrentDate関数を使用します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そしてふたつめはRmakeのサーバの時刻
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
これは
getServerCurrentDate関数を使用します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
どうしてローカルとサーバの2種類があるの?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
ローカルは読み込みが早いメリットがあります
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
反面、故意に変更することも可能なので不正ができてしまう場合があります
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
サーバはこういった不正は行うことができません
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
しかし、読み込みまでの多少の誤差がでる可能性があります
数秒刻みで取得したい場合はローカル、
正確な日時を取得したい場合はサーバを使うといいのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
そうですね それではスクリプトを見てみましょう
#変数「t1」に、ローカルの時刻を取得する
t1 = getLocalCurrentDate()
#時刻の情報を分解する
y = toString(t1[0]) #年
m = toString(t1[1]) #月
d = toString(t1[2]) #日
h = toString(t1[3]) #時
mi = toString(t1[4]) #分
s = toString(t1[5]) #秒
ms = toString(t1[6]) #ミリ秒
speak(y, "年", m, "月", d, "日 ", h, "時", mi, "分", s, "秒 ", ms, "ミリ秒")
#変数「t2」に、サーバの時刻を取得する
t2 = getServerCurrentDate()
#時刻の情報を分解する
y = toString(t2[0]) #年
m = toString(t2[1]) #月
d = toString(t2[2]) #日
h = toString(t2[3]) #時
mi = toString(t2[4]) #分
s = toString(t2[5]) #秒
ms = toString(t2[6]) #ミリ秒
tz = toString(t2[7]) #タイムゾーン
st = toString(t2[8]) #サマータイム
speak(y, "年", m, "月", d, "日 ", h, "時", mi, "分", s, "秒 ", ms, "ミリ秒")
speak("タイムゾーン", st, "秒 サマータイム", st)
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
シンプルに何時何分~って出るのかと思ってたけど、配列が登場してる
getLocalCurrentDate関数、getServerCurrentDate関数の戻り値は
配列になっているためです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
それで取得をした後に、文字列に変更しながら別の変数に入れているのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
サーバの時刻の方にある「タイムゾーン」「サマータイム」って何?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
サーバの時刻は協定世界時(UTC)を基準にしています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
日本はこの基準から9時間ずれており、これを「タイムゾーン」といいます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
また日本では現在実施されていませんが、太陽の出ている時間を有効利用するため
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
夏の間だけ1時間時刻を変更することを「サマータイム」といいます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
一応、こういった情報まで取得することができるのですが、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
日本においてはタイムゾーンは「9時間」=「32400秒」の「32400」、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
サマータイムは実施されていないので「false」が固定で返ります
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
とりあえず、ミリ秒まで覚えておけば良いということね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
今回は新しい関数がいろいろ登場したね・・・
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
計算や条件といった基本的な処理以外の動作は
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
ほとんどの場合、関数の手助けを得ることで実装していきます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
興味がでてきましたら
関数リファレンスの一覧を
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
少しずつ見てみるのも良いかもしれませんね
07-04 第07回 まとめ問題集
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
それでは、今回のまとめ問題です
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8700/C02_02_02.png)
よーっし がんばるよ
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
なお、回答は記載しておりません
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
スクリプトをコピーして、実際に動作させることでチェックしてください
問題01
次のスクリプトに実行結果が1分後に「1分経過」と表示されるよう、1行を追加してください
speak("1分間お待ちください")
#ここに追加する
speak("1分経過")
問題02
次のスクリプトに実行結果が何秒かかったか整数で表示されるよう、行を追加してください
#ここに追加する
waitTime(15000)
#ここに追加する
speak(toString(t) + "秒かかったよ")
問題03
次のスクリプトに実行結果がサーバ日時で「何月何日」と表示されるよう、行を追加してください
t = getServerCurrentDate()
#ここに追加する
speak(s)
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8706/C02_02_04.png)
できた! 今回の関数を使って、タイムアタックとか面白そうかも
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
なお、理解したかどうかの確認なので、
コメントに回答を書かないでください
<連載一覧>
第01回 変数と数値をマスターしよう
第02回 変数と文字列をマスターしよう
第03回 変数とフラグをマスターしよう
第04回 配列変数をマスターしよう
第05回 通常変数をマスターしよう
第06回 数値の応用をマスターしよう
第07回 時間の動作をマスターしよう
第08回 ユーザ定義関数をマスターしよう
第09回 スクリプト用語のまとめ