『スクリプト 汎用関数』 ゲーム起動からのプレイ時間文字列の作成
投稿者:
aoihikawa
投稿日:2012/05/28 20:34
0埋め文字列の作成
日時文字列の作成 応用
使用例
ツイート
日時文字列の作成 応用
#0埋め
def addZero(n, b)
l = 0; c = n; r = ""; b = b - 1
while c > 9
c = floor(c / 10); l = l + 1
end
while l < b
r = r + "0"; l = l + 1
end
r = r + n
return r
end
#うるう年の判定
def getUruuflg(y)
return (y % 4) == 0 && (y % 100) != 0 || (y % 400) == 0
end
#経過時間の計算
def deffTime(t)
mi = 0
d_li = createArray()
d_li = splitString("0,31,59,90,120,151,181,212,243,273,304,334,365",",")
i = 0
while i < getArrayLength(d_li)
d_li[i] = toNumber(d_li[i])
i = i + 1
end
j = t[0] - 1
while j > 1999
if getUruuflg(j)
mi = mi + 527040
else
mi = mi + 525600
end
j = j - 1
end
if getUruuflg(t[0]) && (t[1] > 2)
mi = mi + 1440
end
mi = mi + ((d_li[(t[1] - 1)] + (t[2] - 1)) * 1440)
mi = mi + (t[3] - 1) * 60 + t[4]
return mi
end
#プレイ時間文字列を作成
def viewPlayingTime()
t1 = createArray(); t2 = createArray(); r = ""
t1 = getServerCurrentDate()
t2 = getServerGameStartDate()
df = deffTime(t1) - deffTime(t2)
r = r + floor(df / 60) + ":" + addZero((df % 60),2)
return r
end
使用例
#ゲーム起動からのプレイ時間を表示
speak("現在のプレイ時間 " + viewPlayingTime())
コメントする
コメントするには、ログインする必要があります。
コメント一覧
質問です(._.)
セーブ時に今までのプレイ時間を保存して、続きから遊んだ時に
総合のプレイ時間が表示されるようにする方法はありますか?(2DRPGです)
セーブ時に今までのプレイ時間を保存して、続きから遊んだ時に
総合のプレイ時間が表示されるようにする方法はありますか?(2DRPGです)
セーブする際に今までのプレイ時間を変数に格納して
ロード時に読み込む、という解釈で宜しいでしょうか?
とてもシンプルな方法ですが
自分ではウッカリ見落としていたみたいです…。
アドバイスありがとう御座いました!
プレイ時間関連でもうひとつ、
【00:00】という形で保存された数字同士を
足し算する方法を教えて頂きたいです。
ロード時に読み込む、という解釈で宜しいでしょうか?
とてもシンプルな方法ですが
自分ではウッカリ見落としていたみたいです…。
アドバイスありがとう御座いました!
プレイ時間関連でもうひとつ、
【00:00】という形で保存された数字同士を
足し算する方法を教えて頂きたいです。
#----- 0埋め -----
def addZero(n, b)
l = 0; c = n; r = ""; b = b - 1
while c > 9
c = floor(c / 10); l = l + 1
end
while l < b
r = r + "0"; l = l + 1
end
r = r + n
return r
end
#----- 時間測定 -----
#うるう年の判定
def getUruuflg(y)
return (y % 4) == 0 && (y % 100) != 0 || (y % 400) == 0
end
#経過時間の計算
def deffTimeS(t)
mi = 0
d_li = createArray()
d_li = splitString("0,31,59,90,120,151,181,212,243,273,304,334,365",",")
i = 0
while i < getArrayLength(d_li)
d_li[i] = toNumber(d_li[i])
i = i + 1
end
j = t[0] - 1
while j > 1999
if getUruuflg(j)
mi = mi + 527040
else
mi = mi + 525600
end
j = j - 1
end
if getUruuflg(t[0]) && (t[1] > 2)
mi = mi + 1440
end
mi = mi + ((d_li[(t[1] - 1)] + (t[2] - 1)) * 1440)
mi = mi + (t[3] - 1) * 60 + t[4]
mi = mi * 60 + t[5]
return mi
end
上記deffTimeS関数に
時間関連関数(getServerCurrentDate関数など)で
取得した時間配列の値を引数で渡すと、
数値(秒単位)に起こした値で取得できます
つまり目的とする、累計のプレイ時間を取得するためには、
汎用関数記事内、viewPlayingTime関数内で処理している通り、
getServerCurrentDate関数とgetServerGameStartDate関数で取得した
時間配列をdeffTimeS関数で数値に起こした後差分を行い、
これをプレイ時間数値とし保存します
次回起動時には、この前回プレイ時間数値と
再び今回分の差分を算出し、加算することで
累計プレイ時間数値を求めることが出来ます
最後にこの数値を
時間として表示したいときだけ
floor(プレイ時間数値 / (60 * 60)) + ":" + addZero(floor((プレイ時間数値 % (60 * 60)) / 60),2) + "'" + addZero((プレイ時間数値 % 60),2)
と計算することで、「時:分'秒」の文字列が
求められます
回答ありがとうございます!わたしの知識不足で
書いてあることを理解するのに3日も掛かってしまいました。orz
なんとなく形にはなりましたが、おかしいところがあるかもしれません…(下記参照)
わたしの作っているゲームでは、累計プレイ時間はカスタムメニューに表示させています。
セーブする際にのみ時間の処理を行っているので、
ここのページにあるスクリプトのようにリアルタイムでのプレイ時間を
カスタムメニューに表示させるのは難しいでしょうか。
また、この方法を使うとセーブ後も続けて遊ぶ際に起動してからの秒数が増え続けてしまいますよね?
セーブ処理時に起動時間をリセットする方法ってあるのでしょうか…?
書いてあることを理解するのに3日も掛かってしまいました。orz
なんとなく形にはなりましたが、おかしいところがあるかもしれません…(下記参照)
わたしの作っているゲームでは、累計プレイ時間はカスタムメニューに表示させています。
セーブする際にのみ時間の処理を行っているので、
ここのページにあるスクリプトのようにリアルタイムでのプレイ時間を
カスタムメニューに表示させるのは難しいでしょうか。
また、この方法を使うとセーブ後も続けて遊ぶ際に起動してからの秒数が増え続けてしまいますよね?
セーブ処理時に起動時間をリセットする方法ってあるのでしょうか…?
# 開始スクリプト
# ----- 0埋め -----
def addZero(n, b)
l = 0; c = n; r = ""; b = b - 1
while c > 9
c = floor(c / 10); l = l + 1
end
while l < b
r = r + "0"; l = l + 1
end
r = r + n
return r
end
# ----- 時間測定 -----
#うるう年の判定
def getUruuflg(y)
return (y % 4) == 0 && (y % 100) != 0 || (y % 400) == 0
end
#経過時間の計算
def deffTimeS(t)
mi = 0
d_li = createArray()
d_li = splitString("0,31,59,90,120,151,181,212,243,273,304,334,365",",")
i = 0
while i < getArrayLength(d_li)
d_li[i] = toNumber(d_li[i])
i = i + 1
end
j = t[0] - 1
while j > 1999
if getUruuflg(j)
mi = mi + 527040
else
mi = mi + 525600
end
j = j - 1
end
if getUruuflg(t[0]) && (t[1] > 2)
mi = mi + 1440
end
mi = mi + ((d_li[(t[1] - 1)] + (t[2] - 1)) * 1440)
mi = mi + (t[3] - 1) * 60 + t[4]
mi = mi * 60 + t[5]
return mi
end
# セーブ時の処理
def save()
t1 = getServerCurrentDate()
t2 = getServerGameStartDate()
df = deffTimeS(t1) - deffTimeS(t2)
setVariable("セーブまでのプレイ秒数", df )
a = "セーブまでのプレイ秒数:" + getVariable("セーブまでのプレイ秒数")
speak(a)
b = getVariable("セーブまでのプレイ秒数")
b = floor(b / (60 * 60)) + ":" +
addZero(floor((b % (60 * 60)) / 60),2) + "'" +
addZero((b % 60),2)
setVariable("セーブまでのプレイ時間", b)
c = "セーブまでのプレイ時間:" + b
speak(c)
setVariable("累計プレイ秒数" , getVariable("累計プレイ秒数") + getVariable("セーブまでのプレイ秒数"))
y = getVariable("累計プレイ秒数")
y = floor(y / (60 * 60)) + ":" +
addZero(floor((y % (60 * 60)) / 60),2) + "'" +
addZero((y % 60),2)
setVariable("累計プレイ時間", y)
x = "累計プレイ時間:" + y
speak(x)
savePlayDataCustom("セーブしますか?", "はい", "いいえ")
end
# 初回一度きりの処理
setVariable("セーブまでのプレイ秒数", 0)
setVariable("累計プレイ秒数", 0)
setVariable("累計プレイ時間", "0:00'00")
セーブ時の処理で
初回セーブの場合は起動時間から、
以降は前回セーブ時の時間から差し引くようにします
また、カスタムメニューについては
この関数のラストにあるsavePlayDataCustom関数以外の処理を
onShowCustomParameter関数内で
表示前に同様に算出すれば可能です
そういった意味では、該当の算出処理は
セーブ処理と混同せず、別途の関数で定義しておいた方が
カスタムメニュー表示処理でも利用しやすくなるので
良いかもしれません
初回セーブの場合は起動時間から、
以降は前回セーブ時の時間から差し引くようにします
def save()
#起動時の時間を保持
startTime = deffTimeS(getServerGameStartDate())
#セーブまでのプレイ秒数算出
t1 = deffTimeS(getServerCurrentDate())
if getVariable("前回までのプレイ秒数") == 0
#初回セーブの場合
t2 = startTime
setVariable("起動時の時間", startTime)
else
#2回目以降のセーブの場合
if startTime != getVariable("起動時の時間")
t2 = startTime
setVariable("起動時の時間", startTime)
else
t2 = getVariable("前回までのプレイ秒数")
end
end
df = t1 - t2
setVariable("前回までのプレイ秒数", t1)
setVariable("セーブまでのプレイ秒数", df)
a = "セーブまでのプレイ秒数:" + getVariable("セーブまでのプレイ秒数")
speak(a)
#セーブまでのプレイ秒数表示
b = getVariable("セーブまでのプレイ秒数")
c = floor(b / (60 * 60)) + ":" +
addZero(floor((b % (60 * 60)) / 60),2) + "'" +
addZero((b % 60),2)
setVariable("セーブまでのプレイ時間", c)
c = "セーブまでのプレイ時間:" + c
speak(c)
#累計のプレイ秒数算出
setVariable("累計プレイ秒数",
getVariable("累計プレイ秒数") + getVariable("セーブまでのプレイ秒数"))
y = getVariable("累計プレイ秒数")
#累計のプレイ秒数表示
x = floor(y / (60 * 60)) + ":" +
addZero(floor((y % (60 * 60)) / 60),2) + "'" +
addZero((y % 60),2)
setVariable("累計プレイ時間", x)
x = "累計プレイ時間:" + x
speak(x)
savePlayDataCustom("セーブしますか?", "はい", "いいえ")
end
また、カスタムメニューについては
この関数のラストにあるsavePlayDataCustom関数以外の処理を
onShowCustomParameter関数内で
表示前に同様に算出すれば可能です
そういった意味では、該当の算出処理は
セーブ処理と混同せず、別途の関数で定義しておいた方が
カスタムメニュー表示処理でも利用しやすくなるので
良いかもしれません
上記のスクリプトで試してみたところ、
無事に想像していた通りのプレイ時間表示をすることができました +.(ovo*).+
丁寧にお答えくださり、本当にありがとうございました!!
無事に想像していた通りのプレイ時間表示をすることができました +.(ovo*).+
丁寧にお答えくださり、本当にありがとうございました!!
質問です。
21行目の
d_li = splitString("0,31,59,90,120,151,181,212,243,273,304,334,365",",")これが何をしているのかわからなくて、理解が曖昧になっているところが数カ所あります。
おおまかに(2000年以降の?)経過した時間を一度全て「分」の単位に直してから計算している
ということは理解できていると思います。
ゲームをセーブしてから次にロードするまでの時間を計測し、その結果をゲーム内に活用するために、
セーブ時の現在時刻を保存し、次のロード時に読み込んだ現在時刻との差分を取ろうとしています。
そのために時間関係の動作について理解を深めたいと思っています。
よろしくお願いします。
配列として保管しています
例えば、12月24日であれば、
配列の12番目である334、+24日が
累計の日数である、という計算に使用しています
言われてみれば、なるほど!と思うのですが
自分では気づかないものですね(^^;)
例えば(d_li[(t[1] - 1)] の -1 などが何を表しているのかもわかりました!
ありがとうございます(^^)
プログラムの楽しみの、一つでもありますね