“RUN” それは魔法の言葉

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

50.キューブ避けゲームを作ろう その1

Androidで動く「BASIC!」で、まずはキャラクターをタッチパネルで操作できるプログラムを作ろうと考えた。

BASIC!では、命令の区切りにドット(.)が使われているが、いわゆるオブジェクト指向の参照ではなく、命令のジャンル分けのような使い方みたいだった(だったというのは、英語マニュアルを自動翻訳で読んだだけだからw)

グラフィック関係の命令はだいたい「GR.」で始まる。
まずは画像データをGR.BITMAP.LOADで読み込む。アルファチャンネル(透明色)が使えるのが楽なので、PNG画像を読み込ませた。
そして、その画像データのオブジェクトを、GR.BITMAP.DRAWで配置して表示する。

GR.BITMAP.LOAD p_bm_obj, "meta.png"
GR.BITMAP.DRAW p_bitmap, p_bm_obj, 100, 100
GR.RENDER

次は、タッチパネルの情報を取得する。
GR.TOUCH命令を使うと、1本指だけではなく、複数同時タッチした情報も取得できた。
でも、今回は1本指操作の値だけで十分なので、試しはしていない。

 GR.TOUCH touched,x,y

これで、タッチしたXY座標が変数に格納される。

そして作ったのがこれ。
グラディウス2のメタリオンをタッチパネルをなぞると動くように。
上下方向に移動すると、機体も傾いたグラフィックになるように小細工もしてみたw

www.youtube.com

GR.OPEN 255, 0, 0, 0
GR.SCREEN dis_x,dis_y

GR.SCALE 2,2 %画面比率1/2

!メタリオン画像読み込み
GR.BITMAP.LOAD p_bm_obj, "meta.png" %通常
GR.BITMAP.LOAD p_bm_obj2, "meta_u.png" %上方向
GR.BITMAP.LOAD p_bm_obj3, "meta_d.png" %下方向

DIM p_bitmap[3] %メタリオン画像オブジェクト配列

jx = 400:jy=200 %自機の初期座標
score=0

GR.BITMAP.DRAW p_bitmap[1], p_bm_obj, jx, jy
GR.BITMAP.DRAW p_bitmap[2], p_bm_obj2, jx, jy
GR.BITMAP.DRAW p_bitmap[3], p_bm_obj3, jx, jy

!画像を一旦隠す
GR.HIDE p_bitmap[1]
GR.HIDE p_bitmap[2]
GR.HIDE p_bitmap[3]

ar=1 %メタリオンの画像番号

!タッチパネルの座標
tx=0:ty=0

gr.text.size 25
gr.color 255,255,255,255
gr.text.draw scr,0,25,"SCORE:"+USING$("","%10d",int(score))

!ゲーム部
DO 

 !一旦すべて非表示
 FOR j=1 TO 3
  GR.HIDE p_bitmap[j]
 NEXT j

 !自機移動
 GR.TOUCH touched,x,y
 IF tx > 0 | ty > 0 THEN 
  ix = x - tx
  iy = y - ty
 ENDIF

 !自機グラフィック配列番号決定
 ar = 1+ (iy < 0) + (iy > 0)*2

 !自機座標設定
 IF ABS(ix) <= 70 & ABS(iy) <= 70 THEN % 大きな移動量は制限してワープするような動きを抑制
  jx = jx + ix
  IF jx < 0 THEN jx=0
  IF jx >=900 THEN jx=900 

  jy = jy + iy
  IF jy < 10 THEN jy=10
  IF jy >=500 THEN jy=500
 ENDIF

 !自機画像の1パターンだけ表示
 GR.SHOW p_bitmap[ar]

 !自機表示
 GR.MODIFY p_bitmap[ar],"x",jx,"y",jy
 GR.RENDER

 !タッチしたの座標更新
 tx = x:ty = y
 score += 10
 gr.modify scr,"text","SCORE:"+USING$("","%10d",int(score)) 
 gr.render
 
UNTIL 0

ONERROR:
!コンソール画面に切り替えてエラーメッセージを表示
GR.FRONT 0
PRINT GETERROR$()
END

これをベースに、某グラIIIの9面ラストをモチーフにしたキューブを避けるゲームを作ることにした。

<余談>
この「BASIC!」のグラフィックは、ポイントというか、癖があって、GRで始まる命令は、実行したら即画面に反映されない。GR.RENDERという命令を実行すると、それまでの変更箇所が一括で描画される。
これに気づくのに時間が掛かった。

初めてプログラムしたときは、バンバンGR.RENDERを実行したものだから、処理がめちゃくちゃ重かった。
AndroidのBASICだからこんなもんかと思ってたw

何度か試行錯誤して、まとめてオブジェクトを移動したあとで、GR.RENDERを実行すると処理速度も満足いくものになった。