スクリプト/ランキング関数
最終投稿者: 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行目って分からない・・・。
これは無視してもいいんでしょうか?
(間違いって書いてあるからダメですよね・・、)
退会したユーザー(投稿日:2012/05/26 22:38,
履歴)
もしや、まだ文法ミスが残ってたかも?
endが一つ多かったので修正しておきました。
endが一つ多かったので修正しておきました。
退会したユーザー(投稿日:2012/04/30 22:56,
履歴)
なんかおかしいと思ったらまさかの文法ミス・・・
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 #後略
退会したユーザー(投稿日:2012/01/14 18:46,
履歴)
Rmake記法が動作していない部分があったので修正しました。
×codd ○code
×codd ○code
サーバーにセーブしてるデータの第一引数は文字列でないといけません、という感じのメッセージが出て、
Rank_add()やRank_get()内の、データをロードした後の数行にエラーが出てるみたいでした。
あと、setTextの中身が表示されませんでした。
関数が読めなくて原因がわからなかったため、
応急処置的に作ったものを代わりに載せておきます。
上を開始スクリプトやチャプターにコピーして、
最後の二行のコメント#を外してゲームを起動(初期設定)
その後コメント#をまたつける。
(この場合、1位が7160~5位が6204と表示されます、お好みで調整してください)
ランキングにスコアを追加するところで以下のスクリプトを書いて
データのセーブと表示をやりました。