ゲームアツマールで昇順ランキングを実装する方法

ゲームアツマールには、様々な機能を実装するAPIがあります。その一つに「ランキング機能」があり、これを使えばスコアランキングを
実装することができます。
しかし、これは整数の降順ランキングのみ対応しているので、たとえば
クリアタイムなどの昇順ランキング、すなわち小さいほうが上位だったり小数値を含んだランキングを作ることができません。
しかし時間が早いほうが上位というランキングはメジャーですし
人によっては独自のランキング画面を作りたい人も多いでしょう。
そこでここでは、ゲームアツマールのランキング機能を使わずに
オリジナルのランキングを作る方法を紹介します。

私は、以下の作品にクリアタイムが早いほど上位を取れる
ランキングを実装しました。

しんけん・すいじゃく!https://game.nicovideo.jp/atsumaru/games/gm18885

ファンタジーヒロイン素材集に登場する、刀を持ったキャラクターの絵柄を神経衰弱の要領で全てそろえるまでの時間をランキングにすることが
できます。
このゲームは絵柄を全てそろえるまでの速さをランキング化するから
経過時間を昇順で並べ替える必要があり、さらに表示も「○○分××秒□□」としたいです。
そのためには、アツマールのAPIで実装されているランキング機能ではなくグローバルサーバー変数にクリアタイムを保存し、トリアコンタンさんの「ピクチャのボタン化プラグイン」を使用してランキングを表示します。
以下にどういう考えで実装したか書かせていただきます。

1:神経衰弱のクリアタイムを算出する
ゲームを起動したとき「ゲームスタート」と書かれているピクチャを
クリックするとカードをクリックして裏返せるようになり、神経衰弱が
始まります。この瞬間の時間を「Date.now()」で変数「ゲーム開始時間」に代入し、ゲームを始めたときの時間を記録します。
そして10枚のカードをめくり終わったら、もう一度この時間を「Date.now()」で変数「ゲーム終了時間」に代入し
「ゲーム終了時間 - ゲーム開始時間」を行うことで、ゲームの
経過時間を算出できます。

2:クリアタイムランキングの取得とソートクリアタイムランキングには、以下の2つが必要になってきます
・記録を出したプレイヤーの名前
・プレイヤーのクリアタイム
まずは架空のプレイヤーの名前とタイムを、グローバルサーバー変数に
記録しておきます。
例えば「プレイヤー名:伊勢 天太郎、クリアタイム:15000」など
こういった架空のプレイヤーとタイムを作りましょう。ここで
クリアタイムは、1000分の1秒を単位としています。
そして、グローバルサーバー変数に記録されているプレイヤーの名前と
そのクリアタイム、さらに先程のクリアタイムをゲーム内変数に書き出し
これらをオブジェクトにまとめたものの配列を作ります。
JavaScriptの配列として表現するならば
[ {playerName:”hoge”,clearTime:14358},
{playerName:”fuga” ,clearTime:15239},]といった配列が出来上がります。
この配列をsort関数でclearTimeが昇順になるように並べ替えタイムが
早い順のランキングを作ります。

3:ランキングの表示
ランキングを表示するために、別のマップを利用します。神経衰弱が
終わった後、選択肢で「ランキングを表示しますか?」を選ぶと
ランキング表示用のマップに移動させ、ランキングを作成します。
神経衰弱のクリアタイムは「ミリ秒」で記録されているのでクリアタイムのミリ秒、秒数、分という3つの変数とそれをランキングの数である
10組つまり30個の変数をキープして、動的文字列ピクチャで
「 \v[id1]分\v[id2]秒\v[id3] 」と表示することによってランキングを
表示しています。
自作品では背景にそのままランキングを表示していましたが、この
レイアウトを凝ることでオリジナルのランキング画面を作ったりすることができるはずです。

皆さんも、さまざまな工夫をしてオリジナルランキングを
作ってみましょう。



この記事が気に入ったらサポートをしてみませんか?