スクリプト/ランキング関数(履歴ID:174)

最終投稿者:Material 7186 1 mini ikosami 更新:2012/01/13 00:47:30
ランキングを作るのが、想像以上に難しかったので、
誰でもランキングを作れるように、関数化しました。

ランキング関数 - 【サンプルゲーム】

関数にしても、やはり他よりも難しいので順を追って説明します。


①関数をコピーする

まず下の関数を、開始スクリプトの一番上にににそのままコピーしてください。(ノベルゲームならチャプターへコピー。)
(絶対に一番上である必要は無いのですが、少なくとも文章が表示されたりするものなどより上に。)

def Rank_Reset(t,a,b,f)
setFlag("Ranklarger", t)
if !f
x = toString(a)
i = 1
while i < b
 x = x + ","+toString(a)
 i = i + 1
end
  setVariable("RankTime", getTime())
while getTime()-getVariable("RankTime") < 2000
setText(getVariable("Ranktext"), "ランキング初期化中・・・")
waitTime(10)
end
setText(getVariable("Ranktext"), "")
saveGameData("Rank", x)
end
setVariable("RankNumber", b)
setVariable("Ranktext", createText(250, 300, 400, 200))
end



def Rank_get(a)
while getTime()-getVariable("RankTime") < 2000
setText(getVariable("Ranktext"), "ランキング読み込み中・・・")
waitTime(10)
end
setText(getVariable("Ranktext"), "")
  setVariable("RankTime", getTime())
  Rank = loadGameData("Rank")

  R = splitString(Rank, ",")
  if a == 0
i = getVariable("RankNumber")+1
while i > 0
R[i] = R[i-1]
i = i - 1
end
R[0] = "ランキング\n"
popArray(R)
  else
  R = R[a-1]
  end
 return R
end



def Rank_Add(a)
while getTime()-getVariable("RankTime") < 2000
setText(getVariable("Ranktext"), "ランキング読み込み中・・・")
waitTime(10)
end
setText(getVariable("Ranktext"), "")
  setVariable("RankTime", getTime())
Rank = loadGameData("Rank")

R = splitString(Rank, ",")
pushArray(R, toString(a))

i = 0
while i <= getVariable("RankNumber")
R[i] = toNumber(R[i])
i = i + 1
end

i = 0
if getFlag("Ranklarger")
 while i <=getVariable("RankNumber")
 o = 0
 while o <=getVariable("RankNumber")

   if R[i] == R[o] || !R[i] || !R[o]
   elsif R[i] > R[o] && i > o
     R2 = R[i]; R[i] = R[o];  R[o] = R2
   elsif R[i] < R[o] && i < o
     R2 = R[i];  R[i] = R[o];  R[o] = R2
   end
   o = o + 1
 end
 i = i + 1
 end
else
 while i <=getVariable("RankNumber")
 o = 0
 while o <=getVariable("RankNumber")
   if R[i] == R[o] || !R[i] || !R[o]
   elsif R[i] < R[o] && i > o
     R2 = R[i]; R[i] = R[o];  R[o] = R2
   elsif R[i] > R[o] && i < o
     R2 = R[i];  R[i] = R[o];  R[o] = R2
   end
   o = o + 1
 end
 i = i + 1
 end
end

Rank = toString(R[0])
i = 1
while i < getVariable("RankNumber")
Rank = Rank+","+toString(R[i])
i = i + 1
end
while getTime()-getVariable("RankTime") < 2000
setText(getVariable("Ranktext"), "ランキング保存中・・・")
waitTime(10)
end
setText(getVariable("Ranktext"), "")
  setVariable("RankTime", getTime())
saveGameData("Rank", toString(Rank))

end



②基礎をサーバーに保存
最初に設定するのがこの関数です。
これは、ランキングの設定&リセットにつかいます。
Rank_Reset(true,0,10,false)

一度これを開始スクリプトの、コピーした関数の下に入れて
そのまま一度ゲームを開始してください。
この関数が呼び出された時点でランキングの基礎部分がRmakeのサーバーに保存されます。
(一番上に設定していれば、ゲームが始まった時点ではすでに保存されています。)

それが終わったら、またエディタに戻り、今度はちゃんと数値を設定します。
[codd Rank_Reset(true,0,10,true) ]
※最後のfalseだけは絶対にtrueに変えてください。そうしないと、ゲームが始まるたびにランキングが初期化されます。

第1引数は、大きい数字が上位かどうか。(得点ならtrue,タイムならfalse)
第2引数は、ランキングの初期値(点数なら0など)
第3引数は、ランキングの数(何位まで保存するか)
第4引数は、ランキング設定かどうか。(設定の場合はtrue,それ以外はfalse)

この関数は、リセットとその他の関数で使うための変数の設定を兼ねていますので、
これを呼び出さないと、他の関数も機能しません。


ここまでで、下準備は終了です。


③記録追加
ランキングの記録を追加する方法を説明します。
・・・というほど難しくは無いです。

Rank_Add(a)


aの部分を追加する変数に変えてください。
ここが一番簡単になるように作ったので、これだけです。

④記録を確認する
ランキングがあっても、見ることができなかったら意味がありません。

↓すべて表示(i < 11 をランキングの数+1に。i==5を改行する場所に)
x = Rank_get(0)
i = 1
while i < 11
x[i] = i+"位:"+x[i]+" | "
if i == 5
x[i] = x[i] + "\n"
end
i = i + 1
end
speak(joinArray(x, ""))


ランキングの発表には色々なやり方があるので、
あえて単純にはしていません。

ちなみに、一つ一つを取得することもできます。
a = Rank_get(1)


引数は、何位を取り出すかで0の場合は配列ごとすべて取り出す仕組みになっています。

配列は普通0,1,2となるので1位は0に入ることになりますが
面倒な上に間違えやすいので、
引数に「1」といれれば1位がでてくるようにしてあります。


わかりにくいのでスクリプトサンプルを公開しておきました。
http://rmake.jp/published_items/27430

これを参考にしてもわからない場合や
「説明をこう書いたほうがわかりやすい」というのがあれば
ここに書いてください。