“RUN” それは魔法の言葉

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

237.HSPでゲームを作ろう:たまねとりっぷ! その14

次はプレイした情報の記録と、その閲覧画面を作る。

プレイ情報の記録テーブルは、こんな感じで定義した。

プライマリキー ユーザID プレイ日時 訪問国日時
国ID 天気コード 気温 湿度
曇り度合 風速 風向き 旗本数
スコア 削除フラグ

これをプレイが終了するたびに、INSERT文で、1レコード追加する。
ユーザIDは将来的に複数人の登録ができて、切り替えられるようにするために作成。今は固定で1をセットする。

sqlstr="INSERT INTO PlayDataTable (UserID,PlayDate,LocalDate,CountryID,WeatherCode,AirTemp,Humidity,CloudCover,WindSpeed,WindDir,GetFlagNum,Score,DelFlg) VALUES ("
sqlstr=sqlstr+Str(UserID)+","
sqlstr=sqlstr+"datetime('now','localtime'),"
sqlstr=sqlstr+"'"+LocalTime+"',"
sqlstr=sqlstr+Str(CountryID)+","
sqlstr=sqlstr+Str(WeatherCode)+","
sqlstr=sqlstr+Str(AirTemp)+","
sqlstr=sqlstr+Str(Humidity)+","
sqlstr=sqlstr+Str(CloudCover)+","
sqlstr=sqlstr+Str(WindSpeedconv)+","
sqlstr=sqlstr+"'"+WindDirName+"',"
sqlstr=sqlstr+Str(flagnum)+","
sqlstr=sqlstr+Str(Score)+","
sqlstr=sqlstr+"0)"

次はプレイデータを閲覧する画面を作る。
以前、「培養臼Ex」で作ったものと、基本は一緒。違うのは件数が増えたら、ページを切り替えて見れるようにするところ。
このあたりは、昔やってたことがあるので、処理自体は簡単。

1ページあたり、10件表示して、最大100件、10ページにする。
SQLは、LIMITとOFFSETを使って、ページングするたびに10件ずつ取得する方法にした。

1回のSQL実行で、100レコードをまとめて取得して、配列変数に全部放りこむことも考えたが、SQLiteの性能とやらを見せてもらうことにしたw

あとは、左右のカーソルキーでページ切換、上下でレコードに移動、そして今回苦労してGoogleマップとにらめっこした成果の、ブラウザを開いて、Googleマップに地図を表示する機能を作った。

*show_recode_paging
csrpos=0 ;現在のカーソル位置

if norecord=0 {
  sqlstr="select *,c.CountryName lCountryName,c.FlagFileName lFileName,c.MapLink lMap,u.UserName lUserName,w.WeatherName lWeatherName "
  sqlstr=sqlstr+"from PlayDataTable p "
  sqlstr=sqlstr+"join CountryTable c on p.CountryID=c.ID "
  sqlstr=sqlstr+"join UserTable u on p.UserID=u.ID "
  sqlstr=sqlstr+"join WeatherTable w on p.WeatherCode=w.WeatherCode "
  sqlstr=sqlstr+"Where u.DelFlg=0 and p.DelFlg=0 "
  sqlstr=sqlstr+"Order by p.id DESC LIMIT 10 OFFSET "+ lpage*10
  
  sql_q sqlstr
  linec=stat
  
  dim l_PDate,linec
  dim l_LDate,linec
  dim l_CName,linec
  dim l_WInfo,linec
  dim l_WName,linec
  dim l_FlagNum,linec
  dim l_Score,linec
  dim l_MapLink,linec
  
  repeat linec
    lUserName=sql_v("lUserName")
    l_PDate(cnt)=sql_V("PlayDate")
    strrep l_PDate(cnt),"-","/"
    strrep l_PDate(cnt)," ","\n  "
    l_PDate(cnt)=leftstr(l_PDate(cnt),21)
    l_LDate(cnt)=leftstr(sql_V("LocalDate"),10)
    l_CName(cnt)=leftstr(sql_V("lCountryName")+"                 ",32)
    l_WInfo(cnt)=leftstr(sql_V("lWeatherName")+"               ",26)+"\n "+sql_V("AirTemp")+"℃ "+sql_V("WindDir")+" "+sql_V("WindSpeed")+"m/s"+"     "
    l_MapLink(cnt)=sql_V("lMap")
    l_FlagNum(cnt)=sql_V("GetFlagNum")
    l_Score(cnt)=sql_V("Score")
    sql_next
  loop
}

*show_record
redraw 0
picmes_mode mojix_size*1.5,mojiy_size*1.5
pos 0,0:celput 7
pos 450,10:picmes "ぷれいのきろく"
picmes_mode mojix_size,mojiy_size
picmes " ぷれいやー:"+lUserName

if norecord=0 {
  picmes_mode mojix_size*0.65,mojiy_size*0.65,,3
  
  pos 32,120
  picmes "No. ぷれいしたひ      こくめい          てんこう        とったはた  てんすう"
  
  color $f6,$b7,$41
  boxf 24,149+csrpos*64,1185,149+csrpos*64+42
  
  repeat linec
    pos 32,150+cnt*64
    picmes rightstr("   "+str(cnt+lpage*10+1),3),1
    picmes " "+l_PDate(cnt),1
    pos 260,150+cnt*64
    picmes " "+l_CName(cnt),1
    picmes " "+l_WInfo(cnt),1
    pos 932,150+cnt*64
    picmes " "+rightstr("   "+l_FlagNum(cnt),3)+"本",1
    picmes "    "+rightstr("      "+l_Score(cnt),6)
  loop
  picmes_mode mojix_size,mojiy_size
} else {
  picmes_mode mojix_size*2.0,mojiy_size*2.0
  pos 150,400:picmes "まだぷれいしていません"
  
  picmes_mode mojix_size,mojiy_size
}
picmes_mode mojix_size*0.65,mojiy_size*0.65,,3
pos 0,776:picmes"[↑][↓]せんたく [z]ぶらうざでちずひょうじ [←][→]ぺーじきりかえ [ESC]めにゅーにもどる"
picmes_mode mojix_size,mojiy_size

redraw 1
await 16

Stick key
if norecord=0 {
  if key&1 : lpage-- : rFlg=1
  if key&4 : lpage++ : rFlg=1
  if key&2 : csrpos--
  if key&8 : csrpos++
  if key&2048 : exec l_MapLink(csrpos),16 ;ブラウザ起動(GoogleMap表示)
}
if key&128 {
  sql_close : goto *game_menu
}

lpage=limit(lpage,0,lpageMax-1)
csrpos=limit(csrpos,0,linec-1)

if rFlg=1 {
  rFlg=0 : goto *show_recode_paging
}

goto *show_record

こうしてできたのがこれ。

メニュー画面
プレイデータ一覧画面
ブラウザでGoogleマップを表示
拡大すると、マチュピチュ