“RUN” それは魔法の言葉

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

51.キューブ避けゲームを作ろう その2

本家グラIIIのキューブ面はこんな感じ。
www.youtube.com

まずは肩慣らしなので、完全再現は目指さず、作るのが面倒そうなところはやらないw

こんなゆるーい仕様で、面白くなるのかもわからず作り始めることにした。

  • 自機は動かすだけ。弾は撃たない
  • キューブは画面の端に行っても溜まらない
  • キューブ同士が接触しても、くっつかないw
  • キューブは適当なタイミングで自機に向かって飛んでくるようにする
  • キューブは、自機に向かって来るときは加速する
  • 1機死んだらガメオベラ(GAMEOVER)
  • 得点は一定時間ごとに増加させる。

タッチパネル操作で自機を動かす部分は作成済みなので、背景に星を表示してスクロールさせるところから作り始めた。なににしても形からww

BASIC!では、点を描画する命令GR.POINTがある。どうやら点も1つのオブジェクトになるらしい。

GR.POINT obj,100,100
GR.RENDER

これで、X=100,Y=100の座標に点が描かれて、オブジェクトobjになる。

星をスクロールするには、点を作るときに指定したオブジェクトobjと、GR.MODIFY命令を使う。

これがちょっと面倒だった。何を変えるかを指定しなくてはならない。
例えば座標を変えたいときは、"x"や"y"と指示した後、変更する値を続ける。
他の描画オブジェクトと共用するためだろうけど、もう少し直接的に扱えればいいのにな。

点の座標をGR.MODIFYで変更して、GR.RENDERで再描画する。

GR.MODIFY obj,"x",200,"y",100
GR.RENDER

星のオブジェクトをたくさん作って、それぞれ色を変えたり、スクロールする速度を変えて表示すれば、それっぽく見えてきた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 %自機の初期座標
scount=100 %星の数
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

GOSUB STAR_BG_INI %星の初期表示

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

 !星のスクロールルーチン呼び出し
 GOSUB STAR_BG

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

STAR_BG_INI: %星の初期表示サブルーチン
!星は100個ぐらい?
DIM star[scount],star_x[scount],star_y[scount],star_ix[scount]

FOR si=1 TO scount
 star_x[si] = int (RND()*1000) 
 star_y[si] = int (RND()*500)
 star_ix[si] = INT(RND()*3) * 3

 IF MOD(si,3) = 0 THEN
  GR.COLOR 255,255,255,255
 ELSE if MOD(si,3) = 1 then
  GR.COLOR 255,255,0,0
 ELSE
  GR.COLOR 255,0,255,255
 ENDIF

 GR.POINT star[si],star_x[si],star_y[si]

NEXT
GR.RENDER

RETURN

STAR_BG: %星のスクロールサブルーチン

FOR sc=1 TO scount
 star_x[sc] = star_x[sc] - star_ix[sc]
 IF star_x[sc] < 0 THEN
  star_x[sc]=1000
  star_y[sc]=INT(RND()*500)
 ENDIF
 GR.MODIFY star[sc],"x",star_x[sc],"y",star_y[sc]
NEXT
GR.RENDER

RETURN

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