“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

155.HSPでゲームを作ろう:培養臼Ex その2

データベースの準備が出来たので、ランキングの表示処理から作成に取り掛かった。
トップ10のランキングの取得は、データベースの有無確認と一緒の処理で行った。
これも、ほぼテストしたときと同じ処理。

;ハイスコア上位10位までを取得して配列に保存
sql_q "SELECT *,substr(strftime('%Y/%m/%d',rec_date),3) as r_date FROM scorelist ORDER BY score DESC ,rec_date LIMIT 10"
count = stat
sdim score_l,20,count
sdim score_name_l,3,count
sdim stage_l,10,count
sdim rec_date_l,8,count

repeat count
  score_l(cnt)=sql_v("score")
  score_name_l(cnt)=sql_v("score_name")
  stage_l(cnt)=sql_v("stage")
  rec_date_l(cnt)=sql_v("r_date")
  sql_next
loop

ランキングの表示は、score_lなどの配列変数に格納した値を使う。
このあたり、変数を適当に増やせるのはHSPの良いところでもあり、悪い、というより困るところだよなぁ。
せめて構造体は使いたいところ。
閑話休題

ランキングの表示は、ストーリー表示と同じく、タイトル画面で一定時間経過したら、表示ルーチンに飛ばすようにした。
ランキングとストーリーが交互に表示されるよう、フラグを付けて分岐させた。

表示自体は、単純にrepeat~loop命令で、順番にpicmesすればいいのだが、多少凝ってみた。
まずは、ストーリー表示と同じく、下からスクロールして出てくるように。pos命令で調整。
トップ3を目立たせようと、1、2、3位と4位以下で表示色を変更した。
なんかそれっぽいw



表示には満足したので、次はランクインしたときのネームエントリー処理を作る。

154.HSPでゲームを作ろう:培養臼Ex その1

データベースを使用する目途も付いたので、培養臼 エクストラバージョン(培養臼Ex)の作成に取り掛かることにした。
まずは、ハイスコアランキングの作成からスタート。

データベース周りは、SQLiteのテストのエントリーで書いた通り。
coro3.hatenablog.jp
coro3.hatenablog.jp

少し変更したのは、デフォルトのランキングをInsertする部分。
たった10レコードをInsertするだけなので、トランザクション処理は不要と思っていたが、異様に遅いw
ということで、トランザクション処理することにした。

トランザクションとは、データベースに変更を加える命令、Insert、Update、Deleteをまとめて実行して、確定(もしくは破棄)する処理のこと。
本来は、複数テーブルのレコードの整合性を保つためだったり、処理をキャンセルしたときに、不要なデータを登録しないようにするためのもの。

データベース、プログラム言語によって、書き方や実行の仕方が違うが、スクレレでは、Insert文をループで実行する前後に、おまじないのSQLsql_q命令で実行するだけ。
こんな感じ。

;初期ランキングデータ作成
sql_q "BEGIN TRANSACTION"
repeat 10
  sqlstr="INSERT INTO scorelist (score,score_name,stage,rec_date) VALUES ("+str(10000*(cnt+1))+",'CR3','"+str(cnt+1)+"',datetime('now','localtime'))"
  sql_q sqlstr
loop
;コンフィグ初期値
sql_q "INSERT INTO config (clearstage,fullscr,bgmvol,sevol) VALUES (0,0,50,50)"
sql_q "COMMIT TRANSACTION"

BEGIN TRANSACTIONは、ここからひとまとまりの処理が始まるよという宣言。
Insert文などを実行したら、最後に、COMMIT TRANSACTIONを実行する。
COMMIT(コミット)が、データベースに行った処理を、確定させること。問題があったり、キャンセルしたければ、ロールバックという命令があり、実行するとそれまでのデータベースへの変更をなかったことにできる。

このコミット処理が時間かかるのね。トランザクションをやらなければ、1つのSQL文を実行するたびに自動的にコミットされている。
だから、処理するレコード数が多くなると、いちいちコミットしているから遅くなる。
ただ、自分の過去の経験では、10レコードぐらいの連続Insertぐらいでは、そんなに差がなかったので要らないと思っていたけど、そんなに処理が速くないということが分かったのも収穫かな。

初期設定は以上。次は、実際のランキング作成に移る。

153.HSPでゲームを作ろう:技術研究 データベースを使ってみる その4

もう一つやらなきゃいけないことがあった。
ハイスコアリストは、新規登録のみで済むように出来たけど、コンフィグ設定を記憶させたいなら、更新が必要。

更新するにはUPDATE文を使う。

UPDATE config SET clearstage=1 WHERE ID=1"

コンフィグ設定は1レコードしかないので、WHERE句では、ID=1を決め打ちでいい。
SET句の後は、カラム名とその値を設定する。
このSQL文は、どのステージまで到達したかを記録するもの。clearstageはデータベースのカラム名
実際にはステージ数じゃなくて、ステージデータのテキストファイルの何行目という情報にする予定。
培養臼に組み込むなら、ステージクリア時に判定して、データベースに記録された到達面よりも先に進んだら、このUPDATE文を実行してあげればいいかな?

あとは、トランザクション処理とかあるんだけど、基本1レコードずつしか処理しないので、今回は特にしなくていいかな。
さぁ、ハイスコアランキングと、コンフィグ設定機能を作りますかな♪

152.HSPでゲームを作ろう:技術研究 データベースを使ってみる その3

テーブルを作成したら、次はレコードを登録する。
これもsql_q命令でSQL文を実行するだけ。

SQLでレコードを追加するには、INSERT文を使う。文法はSQLiteでも一般的な構文でよさそう。

INSERT INTO scorelist (score,score_name,stage,rec_date) VALUES (100,'ALX','10',datetime('now','localtime'))

INSERT文は、INTOの後にテーブル名、カッコ内に更新したいカラム名、VALUESの後に各カラムに対応する登録したい値をセットする。

培養臼Exでは、ゲームオーバー時にハイスコアがトップ10に入ったら、ネームエントリー画面にして、データベースにINSERT文で追加しよう。

データベースには、適当なレコードを登録しておき、ハイスコアのトップテンを表示するための準備をしておいて、今度はデータを取得する。
データベースからデータを取得するには、SELECT文を使う。
全データを取得するのは無駄なので、上位10レコードだけを取得する。

SELECT * FROM scorelist ORDER BY score DESC ,rec_date LIMIT 10

SELECTの後には、カラム名を書くんだけど、*で全カラムの指定。FROMはテーブル名。
ORDER BYは、並べ替え。カラム名を書いてやるとその中の値で並べ替えてくれる。
DESCのキーワードは降順。これで、スコアの高い順に並べてくれる。
最後は、LIMIT句。これで何レコード取得するかを制限できる。LIMIT 10と書いておけば、スコアのトップテンが取得できる。

こうして実行したSQLの結果は、件数がstatに、それ以外は指定した変数に格納される。
変数指定を外せば、共通でtmparrという変数に入れてくれるので、よほどのことがなければ、省略でいい。
あとは、ループを回して、表示、次のレコードに進めると処理すれば、ハイスコアランキングが出来上がる(だろう)

sql_q "SELECT * FROM scorelist ORDER BY score DESC ,rec_date LIMIT 10"
count = stat

repeat count
  mes "score="+sql_v("score")
  sql_next
loop

培養臼に組み込むなら、この程度のテストで大丈夫かなぁ。