#include "obaq.as" #const gr_ball 1 #const gr_wall 2 ; ; drop game ; ; 上から落ちてくる5角形のパネルをうまく消していくゲームです。 ; パネルの上にマウスカーソルを合わせて、ボタンを押しながら ; 同じ色のパネルをなぞってください。 ; すると、同じ色のパネルが消えて、新しいパネルが上から ; 降ってきます。 ; 一度に同じ色のパネルをたくさん消すと、高いスコアがもらえます。 ; 時間内にできるだけ高いスコアを出せるように頑張ってください。 ; name="ドロップパズル" randomize screen 0,800,600 ; ウィンドウ初期化 cls 4 title name celload dir_tv+"koma.bmp",3 celdiv 3,75,80 mmload dir_tv+"se_puyo.wav",0 mmload dir_tv+"se_break3.wav",1 mmload dir_tv+"se_block2.wav",2 high=0 *demo if score>high : high=score ; 最高得点を更新する font msgothic,40 color 255,255,255 pos 250,160 mes name pos 140,300 mes "さいこうスコアは["+score+"]です" objsize 200,60 pos 280,400 button "スタート",*start mmplay 2 stop *start cls 4 font msgothic,20 qreset ; OBAQの初期化 qborder -200,-200,200,200 qaddpoly bg, 24, 100,75-20,0,90,90 ; 壁を追加 qtype bg, type_bind|type_inner qgroup bg, gr_wall qmat bg,mat_wire, -1 score=0 max=40 dim combo,max ; コンボ用IDリスト size=12 farsize=size*size fr=0 tmode=0 cmax=0 climit=2 timer=3000 *main ; メインループ ; stick key,$11f ; キーの取得 if key&128 : end ; [ESC]キーで終了 gosub *go_drop gosub *go_touch redraw 0 ; 画面の更新を開始 gradf ,,,,1,0,128 ; 画面クリア qexec ; OBAQによるオブジェクトの更新 qdraw 1 ; オブジェクトの描画 color 255,255,255 pos 40,570 mes "SCORE:"+score pos 680,570 mes "TIMER:"+timer/62 redraw 1 ; 画面の更新を終了 await 16 ; 一定時間待つ timer-- if timer<=0 : goto *demo goto *main *go_drop ; コマを落とす left=0 qfind gr_ball repeat qnext id:if id<0 : break left++ ; コマの残り数を数える loop if left4 { ; 新しいコマを落とす fr=0 x=rnd(90)-45:k=rnd(5) qaddpoly my, 5, x+100,-10,0,size,size ; 追加 quser my,k qmat my,mat_spr, 3,k qmat3 my,2 qgroup my, gr_ball } } return *go_touch ; タッチする qcnvaxis ax,ay,mousex,mousey,1 ; 画面座標から内部座標に変換 qinner res,ax,ay ; 座標を含むオブジェクトを調べる ; if tmode=1 : goto *go_thold if tmode=2 : goto *go_tover if key&16 { ; 風を発生 qblast 100,140,1 } ; タッチを受け付け if res<0 : return ; タッチできない if key&256 { ; ボタンを押している tmode=1 gosub *sub_select } return *go_thold ; タッチ中 if (key&256)=0 { ; ボタンを離した tmode=2 return } if res<0 : return ; タッチできない qgetuser res, u1,u2,u3 if tcol!=u1 : return ; 同じ色ではない dx=abs(ax-tx):dy=abs(ay-ty) if dx*dx+dy*dy < farsize { ; 距離が近いか? gosub *sub_select } return *sub_select ; コマをマークする tobj=res tx=ax:ty=ay qgetuser res, u1,u2,u3 tcol=u1 qgetmat3 res, var_gm, var_rate if var_rate=128 : return qmat3 res, 3, 128 mmplay 0 return *go_tover ; タッチ終了 tmode=0 cmax=0 qfind gr_ball repeat qnext id:if id<0 : break qgetmat3 id, v_gmode, v_rate if v_gmode=3 { qmat3 id,2 combo(cmax)=id cmax++ } loop if cmax