『スクリプト 汎用関数』 ゲーム起動からのプレイ時間文字列の作成

投稿者:Cdv30200 aoi icon mini 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())

コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2015/12/24 00:56, 履歴)
こうしてみると、うるう年って結構めんどうなものですね。

質問です。
21行目の
   d_li = splitString("0,31,59,90,120,151,181,212,243,273,304,334,365",",")

これが何をしているのかわからなくて、理解が曖昧になっているところが数カ所あります。

おおまかに(2000年以降の?)経過した時間を一度全て「分」の単位に直してから計算している
ということは理解できていると思います。

ゲームをセーブしてから次にロードするまでの時間を計測し、その結果をゲーム内に活用するために、
セーブ時の現在時刻を保存し、次のロード時に読み込んだ現在時刻との差分を取ろうとしています。
そのために時間関係の動作について理解を深めたいと思っています。
よろしくお願いします。
Cdv30200 aoi icon mini aoihikawa(投稿日:2015/12/24 01:43, 履歴)
各月までの日数を
配列として保管しています

例えば、12月24日であれば、
配列の12番目である334、+24日が
累計の日数である、という計算に使用しています
            mini mosmoss(投稿日:2015/12/24 08:15, 履歴)
ありがとうございます!
言われてみれば、なるほど!と思うのですが
自分では気づかないものですね(^^;)
例えば(d_li[(t[1] - 1)] の -1 などが何を表しているのかもわかりました!
ありがとうございます(^^)
Cdv30200 aoi icon mini aoihikawa(投稿日:2015/12/24 18:51, 履歴)
ふっと、紐解けたときの快感は、
プログラムの楽しみの、一つでもありますね
Totto ira mini alnyan(投稿日:2014/04/06 17:28, 履歴)
質問です(._.)
セーブ時に今までのプレイ時間を保存して、続きから遊んだ時に
総合のプレイ時間が表示されるようにする方法はありますか?(2DRPGです)
User icon mini 退会したユーザー(投稿日:2014/04/06 17:36, 履歴)
関数でセーブ画面を表示出来るようになったので、
それ使えばどうにかなると思います。
別途、プレイ時間を保存する通常変数は必要ですが

savePlayDataCustom関数
Totto ira mini alnyan(投稿日:2014/04/08 02:35, 履歴)
セーブする際に今までのプレイ時間を変数に格納して
ロード時に読み込む、という解釈で宜しいでしょうか?
とてもシンプルな方法ですが
自分ではウッカリ見落としていたみたいです…。
アドバイスありがとう御座いました!

プレイ時間関連でもうひとつ、
【00:00】という形で保存された数字同士を
足し算する方法を教えて頂きたいです。
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/04/08 08:41, 履歴)
#----- 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)

と計算することで、「時:分'秒」の文字列が
求められます
Totto ira mini alnyan(投稿日:2014/04/12 04:09, 履歴)
回答ありがとうございます!わたしの知識不足で
書いてあることを理解するのに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")
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/04/12 09:56, 履歴)
セーブ時の処理で
初回セーブの場合は起動時間から、
以降は前回セーブ時の時間から差し引くようにします

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関数内で
表示前に同様に算出すれば可能です

そういった意味では、該当の算出処理は
セーブ処理と混同せず、別途の関数で定義しておいた方が
カスタムメニュー表示処理でも利用しやすくなるので
良いかもしれません
Totto ira mini alnyan(投稿日:2014/04/12 20:22, 履歴)
上記のスクリプトで試してみたところ、
無事に想像していた通りのプレイ時間表示をすることができました +.(ovo*).+
丁寧にお答えくださり、本当にありがとうございました!!
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/04/12 21:24, 履歴)
無事、目的どおり動作したようで
何よりです


今できることを、
どのように組み合わせて
目的とすることを達成するか、

そこを考えていくことが
スクリプト(プログラム)の難しいところであり
面白いところでもあります
Aa mini #いお(投稿日:2012/05/29 06:22, 履歴)
ゲーム起動からプレイ時間を表示が動作をしません。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/05/29 11:38, 履歴)
掲載中のユーザ関数は
正常動作することを確認済みです。

ユーザ関数が正常に
コピーペーストされているか
ご確認ください。