スクリプト/ランキング関数
最終投稿者:
ikosami
更新:2017/04/08 21:19:40
ikosami
更新:2017/04/08 21:19:40
ランキングを作るのが、想像以上に難しかったので、
誰でもランキングを作れるように、関数化しました。
ランキング関数 - 【サンプルゲーム】
関数にしても、やはり他よりも難しいので順を追って説明します。
①関数をコピーする
まず下の関数を、開始スクリプトにそのままコピーしてください。
(ノベルゲームならチャプターへコピー。)
②基礎をサーバーに保存
最初に設定するのがこの関数です。
これは、ランキングの設定&リセットにつかいます。
一度これを開始スクリプトの、コピーした関数の下に入れて
そのまま一度ゲームを開始してください。
この関数が呼び出された時点でランキングの基礎部分がRmakeのサーバーに保存されます。
(一番上に設定していれば、ゲームが始まった時点ではすでに保存されています。)
何も表示されないので、できているかどうか不安な人は、
↓を設定してゲームを開始してみて、Errorがゲームの下に出ていなければ保存できています。
それが終わったら、またエディタに戻り、今度はちゃんと数値を設定します。
※最後のfalseだけは絶対にtrueに変えてください。そうしないと、ゲームが始まるたびにランキングが初期化されます。
第1引数は、大きい数字が上位かどうか。(得点ならtrue,タイムならfalse)
第2引数は、ランキングの初期値(点数なら0など)
第3引数は、ランキングの数(何位まで保存するか)
第4引数は、ランキング設定かどうか。(設定の場合はtrue,それ以外はfalse)
この関数は、リセットとその他の関数で使うための変数の設定を兼ねていますので、
これを呼び出さないと、他の関数も機能しません。
ここまでで、下準備は終了です。
③記録追加
ランキングの記録を追加する方法を説明します。
・・・というほど難しくは無いです。
aの部分を追加する変数に変えてください。
ここが一番簡単になるように作ったので、これだけです。
④記録を確認する
ランキングがあっても、見ることができなかったら意味がありません。
↓すべて表示(i < 11 をランキングの数+1に。i==5を改行する場所に)
ランキングの発表には色々なやり方があるので、
あえて単純にはしていません。
ちなみに、一つ一つを取得することもできます。
引数は、何位を取り出すかで0の場合は配列ごとすべて取り出す仕組みになっています。
配列は普通0,1,2となるので1位は0に入ることになりますが
面倒な上に間違えやすいので、
引数に「1」といれれば1位がでてくるようにしてあります。
わかりにくいのでスクリプトサンプルを公開しておきました。
http://rmake.jp/published_items/27430
これを参考にしてもわからない場合や
「説明をこう書いたほうがわかりやすい」というのがあれば
ここに書いてください。
ツイート
誰でもランキングを作れるように、関数化しました。
ランキング関数 - 【サンプルゲーム】
関数にしても、やはり他よりも難しいので順を追って説明します。
①関数をコピーする
まず下の関数を、開始スクリプトにそのままコピーしてください。
(ノベルゲームならチャプターへコピー。)
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
while i <=getVariable("RankNumber")
o = 0
if getFlag("Ranklarger")
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
end
else
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
end
o = o + 1
end
i = i + 1
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のサーバーに保存されます。
(一番上に設定していれば、ゲームが始まった時点ではすでに保存されています。)
何も表示されないので、できているかどうか不安な人は、
↓を設定してゲームを開始してみて、Errorがゲームの下に出ていなければ保存できています。
それが終わったら、またエディタに戻り、今度はちゃんと数値を設定します。
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
これを参考にしてもわからない場合や
「説明をこう書いたほうがわかりやすい」というのがあれば
ここに書いてください。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
2DアクションRPGじゃ使えないんですね・・。
error
104行目って分からない・・・。
これは無視してもいいんでしょうか?
(間違いって書いてあるからダメですよね・・、)
開始スクリプト : syntax error, コードに文法的な間違いがあります。 line(行): 104
104行目って分からない・・・。
これは無視してもいいんでしょうか?
(間違いって書いてあるからダメですよね・・、)
もしや、まだ文法ミスが残ってたかも?
endが一つ多かったので修正しておきました。
endが一つ多かったので修正しておきました。
なんかおかしいと思ったらまさかの文法ミス・・・
def Rank_Add(a)
#中略
if getFlag("Ranklarger")
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
#ここにendが入るはず・・・
else
#後略
Rmake記法が動作していない部分があったので修正しました。
×codd ○code
×codd ○code
サーバーにセーブしてるデータの第一引数は文字列でないといけません、という感じのメッセージが出て、
Rank_add()やRank_get()内の、データをロードした後の数行にエラーが出てるみたいでした。
あと、setTextの中身が表示されませんでした。
関数が読めなくて原因がわからなかったため、
応急処置的に作ったものを代わりに載せておきます。
#hikawaさんの配列ソート関数 #配列ソート def pivot(arr,i,j,ord) k = i + 1 while (k <= j) && (arr[i] == arr[k]) do k = k + 1; end if k > j then return -1; end if ord if arr[i] >= arr[k] then return i; end else if arr[i] <= arr[k] then return i; end end return k end def partition(arr,i,j,x,ord) l = i; r = j while l <= r if ord while (l <= j) && (arr[l] < x) do l = l + 1; end while (r >= i) && (arr[r] >= x) do r = r - 1; end else while (l <= j) && (arr[l] > x) do l = l + 1; end while (r >= i) && (arr[r] <= x) do r = r - 1; end end if l <= r t = arr[l]; arr[l] = arr[r]; arr[r] = t l = l + 1; r = r - 1 end end return l end def quickSort(arr,i,j,ord) if i != j p = pivot(arr,i,j,ord) if p != -1 k = partition(arr,i,j,arr[p],ord) arr = quickSort(arr,i,(k - 1),ord) arr = quickSort(arr,k,j,ord) end end return arr end #使用時はこの関数のみ #第1引数:配列 第2引数:昇順 true / 降順 false def sortArray(arr,ord) return quickSort(arr,0,(getArrayLength(arr) - 1),ord) end #waitTime(1000) #saveGameData("ranking", "9999999999,7160,7064,6976,6448,6204")上を開始スクリプトやチャプターにコピーして、
最後の二行のコメント#を外してゲームを起動(初期設定)
その後コメント#をまたつける。
(この場合、1位が7160~5位が6204と表示されます、お好みで調整してください)
ランキングにスコアを追加するところで以下のスクリプトを書いて
データのセーブと表示をやりました。
if isLogin() #ログイン判定のチェック、これがないと非ログインユーザーはここでフリーズします score=0 #このゼロの代わりに点数を入れることで降順の5位までのランキングができます a=loadGameData("ranking") a = splitString(a, ",") #文字列を配列に i=0 while i < getArrayLength(a) a[i]=toNumber(a[i]) #文字列の配列を数値の配列に i=i+1 end a=sortArray(a,false) #ソートをかける=並び替え if score > a[getArrayLength(a)-1] popArray(a) pushArray(a, score) i=0 while i < getArrayLength(a) a[i]=toString(a[i]) #数値の配列を文字列の配列に i=i+1 end a=joinArray(a, ",") #配列を文字列に変換 waitTime(1000) saveGameData("ranking", a) #サーバーに保存 a = splitString(a, ",") #文字列を配列に i=0 while i < getArrayLength(a) a[i]=toNumber(a[i]) #文字の配列を数値の配列に i=i+1 end a=sortArray(a,false) #ソートをかける=並び替え end #ランキング表示のメッセージ作りここから s="ランキング" i = 1 while i < getArrayLength(a) s = s+"\n"+ i+ "位 "+ a[i] +"点" i = i + 1 end #####画面テキスト設定############### setTextFontSize(15) setTextFontColor(255, 255, 255) set[x] = 325; set[y] = 80; set[w] = 800; set[h] = 300 text_e = createText(set[x], set[y], set[w], set[h]) setText(text_e, s) #テキスト表示 #################################### speak(s) #スピーク表示 end #if isLogin()を閉じるエンド