空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

吉里吉里/KAG:配列を使ってランキングを作ってみよう  

2013-02-18
2017-06-14
cm0
tb0

吉里吉里/KAGちょいネタシリーズ。

↓こんなのを作りたい人向けのネタです。

ランキング画面

先日公開した「NUMBER+」のランキング画面です。
クリアタイムが早い順に上位10番目まで表示されます。

ご覧のとおり最高記録は24秒となっております。
いやぁ、デバッグモードっていいですね。

そんなことはさておき、スクリプトを書いていきましょう。
「続きを読む」からどうぞー( ´ ▽ ` )ノ



使用する変数


f.limit:残りの制限時間
f.ctime:クリアタイム
sf.rank:クリアタイムを保存しておく配列変数
f.mode:モード(0:ノーマル、1:ハード、2:エクストラ)

sf.rank は二次元配列を使用しています。
 sf.rank[0][0]~sf.rank[0][9]:ハードモードのクリアタイム
 sf.rank[1][0]~sf.rank[1][9]:エクストラモードのクリアタイム



ランキングに使用する配列変数を読み込む


初回起動時だけランキング用の配列変数を読み込みます。
読み込みのタイミングはプラグインやマクロと同じく first.ks の頭の方です。

[if exp="sf.初回起動 != 1"]
; sf.rankは配列変数であることを宣言
[eval exp="sf.rank = []"]
; sf.rank[0]は配列変数であることを宣言
[eval exp="sf.rank[0] = []"]
; sf.rank[1]は配列変数であることを宣言
[eva exp="sf.rank[1] = []"]
[eval exp="sf.初回起動=1"]
[endif]



クリアタイムのチェックとランキングの処理


途中からTJSが入ってますが、やってることは単純です。

; ノーマルモードのときはチェックしない
[ignore exp="f.mode == 0"]

; クリアタイムを計算する
[eval exp="f.ctime = f.limit - f.ctime"]

*rank_ck|ランキングチェック
[iscript]

// 配列の中からf.ctimeと同値のものを削除
// クリアタイムの重複表示を避けるためです

sf.rank[f.mode].remove( f.ctime );

// クリアタイムを配列の最後に追加します
sf.rank[f.mode].add( f.ctime );

// 数字の小さい順に並べ替えます
sf.rank[f.mode].sort();

// 配列の長さが11を超えていたら最後の要素を削除します
// 11位以下の成績は保存する意味がないのと、配列が長くなるのを防ぐためです

if (sf.rank[f.mode].count >= 11)
 {
  sf.rank[f.mode].pop();
 }

[endscript]

[endignore]



ランキング表示用のマクロを作る


1個ずつ書くのが面倒なのでマクロを作ります。
emb タグの途中で改行してありますが実際は一行で書いてます。

*macro
[macro name=ranking]
[if exp="sf.rank[mp.nm1][mp.nm2] != void"]
[emb exp="'%02d'.sprintf((sf.rank[mp.nm1][mp.nm2]%3600)\60) +':'+
'%02d'.sprintf((sf.rank[mp.nm1][mp.nm2]%3600)%60)"]
[else]
--:--[endif][r]
[endmacro]

sf.rank の [mp.nm1][mp.nm2]が void でなければ
保存されているクリアタイム( emb exp 以下)を表示します。
'%02d'.sprintf( 変数 ):変数を右詰め2桁で表示、空欄は0で埋める
sf.rank[mp.nm1][mp.nm2] % 3600 ) \ 60:ミリ秒を分に直したもの
sf.rank[mp.nm1][mp.nm2] % 3600 ) % 60:ミリ秒を秒に直したもの

クリアタイムはミリ秒で保存されているので表示する際に《分》と《秒》に直します。
で、0の部分が空いちゃうとカッコ悪いのでゼロパディングしておきます。
配列の中身が void だと何も表示されないので「--:--」と記述してごまかしてます。



ランキングを表示する


記述は省きますがメッセージレイヤに表示させてます。

◆ハードモードのランキングを表示する
1st:[ranking nm1=0 nm2=0]
2nd:[ranking nm1=0 nm2=1]
3rd:[ranking nm1=0 nm2=2]
.
. (省略)
.
10th:[ranking nm1=0 nm2=9]

◆エクストラモードのランキングを表示する
1st:[ranking nm1=1 nm2=0]
2nd:[ranking nm1=1 nm2=1]
3rd:[ranking nm1=1 nm2=2]
.
. (省略)
.
10th:[ranking nm1=1 nm2=9]

mp.nm1 に 0 が入ってたらハードモード。
mp.nm1 に 1 が入ってたらエクストラモード。

mp.nm2 は mp.nm1 で指定した配列の要素を順番に取り出しているだけです。
↓二次元配列の中身はこんなカンジになってます。

二次元配列の中身

ってなことで、今回はここまで。


関連記事

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://kopacurve.blog33.fc2.com/tb.php/289-058d6821
この記事にトラックバックする(FC2ブログユーザー)

Author

Recent

Category

Link

Comment

Mailform

Twitter