“RUN” それは魔法の言葉

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

89.HSPでゲーム&ウォッチのヘルメットを作ろう その7

次はGAME AとGAME Bの選択を作る。

今までの再現シリーズは、いきなりスタートしていたし、GAMEの違いは作っていない。
そこで今回は筐体画像の「GAME A」と「GAME B」のボタンの部分をタッチしてもらうようにした。

ただ、ボタンを押してもらうのがわからないと、バグかと思ってしまうので、画面に文字を表示することにした。
こちらも7セグフォントで作ろうとしたが、文字が読みづらいので、普通にmes命令で文字列を表示してみた。

タッチパネル処理は、本体のゲームと同じで、座標値の範囲だけ変更。
Windowsでは、キーボード選択できるように、getkey命令を使った。
stick命令では、拾えないキーの入力を拾える。
A、Bと直接キーを押せば、それぞれのゲームモードになるようにした。

ついでにハイスコアを5秒おきに切り替えることにした。
この時点では、ハイスコアの記録処理を作っていないので、ダミーの値をセット。
なかなかいい具合になってきた。

*selectgame ;ゲーム開始前の処理
  
  redraw 0
  pos 0,0
  gmode 2
  celput 1 ;筐体表示

  gosub *showdoor ;ドアの表示

  pos 400,300
  font "",24,1
  mes "Select \nGAME A or GAME B"

  gamecnt++
  if gamecnt>=100000 : gamecnt=0 ;際限なくカウントが増えてオーバーフローしないように

  ;ハイスコアを表示するゲームモードの切り替え
  if gamecnt\300=0 {
    togle=togle^1
  }

  ;ハイスコア表示
  pos 331+(283*togle),424
  celput 9,togle ;ゲームモードの表示
  score=hiscore(togle)
  gosub *showscore

  ;キーボードの操作
  getkey key,'A' : if key : gamemode=0
  getkey key,'B' : if key : gamemode=1

  ;タッチパネル操作の判定
  mtlist touchid
  num=stat
  if num>0 { ;一本以上指がタッチしていて、かつタッチした直後なら
    id = touchid(0) ;一本目のタッチは0番目
    mtinfo touch,id
    if touch(0)=1 { ;タッチがオンならば
      ;タッチされた座標を変数に代入、タッチしたフラグを付ける
      tx=touch(1):ty=touch(2)

      ;ボタンを押したか座標で判定
      if ty>=485 & ty<=638 {
        if tx>=476 & tx<=584 {
          gamemode=0
        } else : if tx>=585 & tx<=694 {
          gamemode=1
        }
      }
    }
  }
  
  await 1000/60
  redraw 1

  ;ゲームモードが選択されたらゲーム開始
  if gamemode>=0 : touched=1:score=0: goto *main
  
  goto *selectgame

ゲームモードによる違いを、3つ再現した。

  1. 工具の落下スピード
  2. 落ちてくる工具の総数
  3. ドアの開閉間隔

開閉間隔は、GAME Aが10秒、GAME Bが5秒と固定なので、配列変数に代入して初期値を設定した。

工具の落下スピードは、何フレームごとに工具を落とすかを早めることで変えられる。
工具の総数も、ゲームモードを絡めた判定を入れたらコントロールできる。
「ファイア」の時と同じように、論理式を使って調整している。

;扉開閉の間隔(GAME A:10秒、GAME B:5秒)
dim doorinterval,2
doorinterval=600,300

;ゲームモード
gamemode=-1 ;-1:選択前、0:GAME A、1:GAME B
		
;ゲームスピードの初期値
g_speed_def=12-gamemode*3
g_speed=g_speed_def

;スコアアップによる調整
;最大工具数
maxtools = 4+(score\100>10)+(score\100>50)+((gamemode=1)*(score\100>80))
;ゲームスピード
g_speed = g_speed_def-(score\100>10)-(score\100>30)-(score\100>50)-(score\100>80)

そして、できたのがこれ。完成にだんだん近づいてきた。

youtu.be