// ゲームサンプル // どこかで見たようなゲームの楕円バージョンです。 // 左右カーソルキーで青い玉のコースを変えます。 // 赤い玉をよけながらピンクの点を通過し、クリアしていきます。 // 同じところを通過するとピンクの点は復活します。 TIMER { if(pause > 0){ return ; } wait = wait - 1 ; if(wait > 0){ return ; } // 負けチェック if(posC == tekC){ if(posR == tekR){ pause = 1 ; MessBox("ゲームオーバー 再ゲーム","負け",1,1) ; call("init_data") ; call("GameDraw") ; pause = 0 ; return ; } } // スコア表示 Box(cnt_x-100,cnt_y-10,cnt_x+100,cnt_y+10,0,7) ; Box(cnt_x-100,cnt_y-10,cnt_x-100+point*10,cnt_y+10,0,1) ; // 勝ちチェック if(point >= 20){ pause = 1 ; stage = stage + 1 ; if(stage >= 4){ stage = 1 ; } MessBox("ゲームクリア","勝ち",1,2) ; call("init_data") ; call("GameDraw") ; pause = 0 ; return ; } // ---- 自機の移動 ---- call("ClearPos") ; // コース変更 if(posR % 45 >= 40){ posC = posC + move ; if(move != 0){ move = 0 ; } } posR = posR + 3 ; if(posR == 360){ posR = 0 ; } call("DrawPos") ; // ---- 敵機の移動 ---- call("ClearTek") ; // コース変更 if(tekR % 180 == 0){ if(tekC > posC){ tekC = tekC - 1 ; } if(tekC < posC){ tekC = tekC + 1 ; } } tekR = tekR - 3 ; if(tekR == 0){ tekR = 360 ; } call("DrawTek") ; wait = 4 - stage ; // ステージにより遅延を調整 } // 自機を消去 ClearPos { r = 142 - posC * 16 ; x = sin(posR) * r * 2 + cnt_x ; y = cos(posR) * r + cnt_y ; Circle(x-4,y-4,x+4,y+4,7,7) ; // 得点チェック if(posR % 90 != 24){ return ; } n = fix(posR/90) ; if(pnt(posC,n) == 3){ point = point + 1 ; pnt(posC,n) = 15 ; Circle(x-2,y-2,x+2,y+2,pnt(posC,n),pnt(posC,n)) ; return ; } if(pnt(posC,n) == 15){ point = point - 1 ; pnt(posC,n) = 3 ; Circle(x-2,y-2,x+2,y+2,pnt(posC,n),pnt(posC,n)) ; return ; } } // 自機を描画 DrawPos { r = 142 - posC * 16 ; x = sin(posR) * r * 2 + cnt_x ; y = cos(posR) * r + cnt_y ; Circle(x-4,y-4,x+4,y+4,1,1) ; } // 敵機を消去 ClearTek { r = 142 - tekC * 16 ; x = sin(tekR) * r * 2 + cnt_x ; y = cos(tekR) * r + cnt_y ; Circle(x-4,y-4,x+4,y+4,7,7) ; if(tekR % 90 != 24){ return ; } n = fix(tekR/90) ; Circle(x-2,y-2,x+2,y+2,pnt(tekC,n),pnt(tekC,n)) ; } // 敵機を描画 DrawTek { r = 142 - tekC * 16 ; x = sin(tekR) * r * 2 + cnt_x ; y = cos(tekR) * r + cnt_y ; Circle(x-4,y-4,x+4,y+4,2,2) ; } KEYDOWN { // 左移動 if(KEY == 37){ if(posC >= 4){ return ; } if(posR % 45 >= 30){ move = 1 ; } } // 右移動 if(KEY == 39){ if(posC <= 0){ return ; } if(posR % 45 >= 30){ move = -1 ; } } if(KEY == 27){ end ; } // エスケープで強制終了 } // データ初期化 init_data { posR = 0 ; // 角度 posC = 0 ; // コース番号(最外周) move = 0 ; // コース修正方向 tekR = 180 ; tekC = 2 ; point = 0 ; wait = 0 ; n = 0 ; loop(4){ pnt(0,n) = 3 ; pnt(1,n) = 3 ; pnt(2,n) = 3 ; pnt(3,n) = 3 ; pnt(4,n) = 3 ; n = n + 1 ; } } // ゲーム画面描画 GameDraw { cnt_x = 320 ; cnt_y = 200 ; // 画面中心座標 FullPaint(7) ; y = 150 ; x = y * 2 ; loop(6){ r = 10 ; loop(8){ Arc(cnt_x-x,cnt_y-y,cnt_x+x,cnt_y+y,r,r+35,0) ; r = r + 45 ; } y = y - 16 ; x = y * 2 ; } Circle(cnt_x-300,cnt_y-150,cnt_x+300,cnt_y+150,0,-1) ; Circle(cnt_x-140,cnt_y-70,cnt_x+140,cnt_y+70,0,-1) ; n = 0 ; p = 0 ; loop(4){ loop(5){ r = 142 - p * 16 ; x = sin(n*90+24) * r * 2 + cnt_x ; y = cos(n*90+24) * r + cnt_y ; Circle(x-2,y-2,x+2,y+2,pnt(p,n),pnt(p,n)) ; p = p + 1 ; } n = n + 1 ; p = 0 ; } Print(cnt_x-48,cnt_y-36,0,8,16,2,"ステージ") ; PrintData(cnt_x+32,cnt_y-36,0,16,16,2,0,stage) ; } PAINT { call("GameDraw") ; } INIT { call("init_data") ; } CREATE { SetWinSize(640,400) ; SetTimer(50) ; pause = 0 ; stage = 1 ; Data("pnt",5,4) ; // 5コース、各4個 }