本家グラ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
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