;=========================================================== ; 2009/09/13 ; ボウリング(笑) 1.3 ; http://gmr.blog.shinobi.jp/Category/38/ ; GAM-22 ;=========================================================== ; obaq #include "obaq.as" ; hsptv #runtime "hsptv" #regcmd 18 #cmd hsptv_send 0 notesel rank hsptv_send rank, -1 ; font font1 = "Comic Sans MS" ;----------------------------------------------------------- ; graphic ;----------------------------------------------------------- buffer 1 : boxf celdiv ,64,64,32,32 ; ball palcolor 14 circle ,, 63,63 ; pin gradf 64,0, 128,64, 0, $eeeeee,$666666 ; block gradf 128,0, 256,64, 1, $ff0000,$aa0000 ; square gradf 384,0, 64,64, 1, $88ff11,$222222 gsel; 0 ;----------------------------------------------------------- ; definition ;----------------------------------------------------------- ; basic #const basic_w 640/4 #const basic_h 480/4 ; boder #const boder_w basic_w*5 #const boder_h basic_h*2-12 #const boder_w2 boder_w-80 #const boder_h2 boder_h-60 #const boder_w3 boder_w+6 #const boder_h3 boder_h+6 ; cloud 間隔 #const cloud_spx basic_w/4 #const cloud_spy basic_h/4 ; 初期スクロール(EDIT) #const desx -basic_w*5 #const desy 12 ; 初期スクロール(PLAY) #const desx2 170 #const desy2 -boder_h*4+480-24 ; 初期ボール座標 #const demx 16 #const demy boder_h-15 ;----------------------------------------------------------- ; starting ;----------------------------------------------------------- pos 16,352 objsize 112,52, 60 objmode 2 font font1 button "PLAY", *change : hplay = objinfo(0, 2) button "EDIT", *change objsize noteget stage, 2 *reset ;----------------------------------------------------------- ; reset ;----------------------------------------------------------- // reset a obaq qreset qborder -80,-60,boder_w2,boder_h2 // default dim mcnt dim block_max dim pin dim threw dim m ball = 6 sx = desx sy = desy zoom = 2.0 // load repeat strlen(stage)/3 v1 = cnt*3 type = peek(stage,v1) x = peek(stage,v1+1) y = peek(stage,v1+2) gosub *make_block loop *main ;----------------------------------------------------------- ; main ;----------------------------------------------------------- ; 変数modeの説明。 ; 1:EDIT、2:PLAY。組み合わせ可能。 mx_log = mx my_log = my qgetpos m, mx,my,mr click_log = click getkey click ; 離したとき click_up = (click=0)&(click_log) ; 押したとき ;click_down = (click)*(click_log=0) ; オブジェクト上でもマウス座標を取得。 ; EDITで、マウスを速く動かして[PLAY]押したとき、不本意にブロック作るの防止策。 mousex_ = ginfo(0) - ginfo(4) mousey_ = ginfo(1) - ginfo(5) if mode&2 { ;----------------------------------------------------------- ; play ;----------------------------------------------------------- if mcnt<=60 { // スタート時の、自動スクロール。 sx += mcnt*mcnt/76 } if threw { if threw=1 { // カメラ移動 sx = limitf(320.0-zoom*mx, 640.0-zoom*boder_w3,60*zoom) sy = limitf(240.0-zoom*my, 480.0-zoom*boder_h3,6*zoom) zoom = limitf(4.0*(800-mx)/800, 2, 4) if mx<=mx_log { ; ボール移動が負になったら、カメラ停止 threw ++ } } } else { if click { qcnvaxis x,y, mousex_,mousey_, 1 if click_log:else { qinner v1, x,y;, m // catch hold += v1=m } if hold { // hold qpos m, x,y;, mr } } else { if click_log*hold { // throw x = mx-mx_log y = my-my_log ; speed v1 = limitf(sqrt(x*x + y*y)/10, 0,3) r = atan(x,y) qspeed m, sin(r)*v1,cos(r)*v1 dim hold } } if mx>=125 { // ボールのx座標が画面外なら、投げたことに threw ++ } } if threw*click | (mcnt=61) { // 新しいボール qaddpoly m, 15, demx,demy,, 8,8,, 2 if m>=0 { sx = desx2 sy = desy2 zoom = 4.0 dim hold dim threw ball -- qweight m,2 qmat m, mat_spr, 1;,0 } } // 倒した判定 dim laid repeat block_max, 1 qgetuser cnt, v1,x,y if v1=1 { qgetpos cnt, x,y,r ; laid += sin(r+m_pi/2)<=0.5 laid += cos(r)<=0.5 } loop ; sendmsg hwnd, $F5 ; で、ボタンを押したことになり、ラベルへも飛べる。 if (laid>=pin) * pin { dialog "おめでとう" if mode=3 { dialog "投稿する?",2 if stat=6{ // 投稿 noteget v1 hsptv_send rank, 1+v1, stage mode ^= 1 } } sendmsg hplay, $F5 } if ball<=0 { dialog "ドンマイ" sendmsg hplay, $F5 } // 物理計算は、obaqに下請け qexec } ;----------------------------------------------------------- ; draw ;----------------------------------------------------------- redraw 0 // background color $ee,$ee,$ff : boxf qcnvaxis x,y, ,boder_h v1 = zoom*boder_h gradf ,y-v1, 640,y+v1, 1, $eeeeff,$0000aa // cloud repeat 182 font font1,zoom*10 palcolor 10 pos zoom*cloud_spx*(cnt\13-2)+(sx\(zoom*cloud_spx)), zoom*cloud_spy*(cnt/13-2)+(sy\(zoom*cloud_spy)) mes " cloud" loop ;----------------------------------------------------------- ; drawn by obaq ;----------------------------------------------------------- qview zoom,zoom, sx,sy qdraw ;----------------------------------------------------------- ; TITLE(menu) ;----------------------------------------------------------- gradf 8,8, 128,464,, $111111,$999999 pos 13,10 : font font1, 24 palcolor 10 : mes "bowling(w)" palcolor 17 font font1, 15 pos 18,60 if mode:else { ;------------------------------------------------------- ; SELECT ;------------------------------------------------------- select = (mousey_-60)/9 if select>=0 & select<=29 { boxf 18,select*9+60, 125,select*9+68 if click_up * (/*mousex_>=18 & */mousex_<=125) { noteget stage, select*3+2 goto *reset } } palcolor 10 : font "", 11 repeat 30 noteget v1,cnt*3 noteget v2,cnt*3+1 pos 20,cnt*9+60 mes strf("#%03d "+v2,v1) loop } if mode=1 { ;------------------------------------------------------- ; EDIT ;------------------------------------------------------- mes "block "+block_max+"/85" gosub *get_block if type { ; block of menu pos 72,152 : gosub *draw_block ; block of cursor pos mousex_/12*12+6,mousey_/12*12+6 gosub *draw_block } else { pos 50,140 : mes "delete" } ; ステージは、幅41縦38マス。 ; 左上が(65,65)なのは、'&'(38)を踏まないため。 ; 画面上の左上座標は(144,12)。 ; 画面上のブロックの一辺は12dotだが、640/12は割り切れないという設計ミス。 ; だから、右端が中途半端に4dot余っているotz。 if click_up { ;x = (mousex_-144)/12+65 x = mousex_/12+53 ;y = (mousey_-12)/12+65 y = mousey_/12+64 if x>=65 & y>=65 & x<=105 & y<=102 { gosub *make_block } if x>=54 & y>=71 & x<=63 & y<=81 { type = (type+1)\7 } } } if mode&2 { ;------------------------------------------------------- ; PLAY ;------------------------------------------------------- mes "pin "+laid+"/"+pin+"\nball "+ball } else { ;------------------------------------------------------- ; save/load (file) ;------------------------------------------------------- getkey Skey, 'S' if Skey { // save dialog "bow", 17 if stat { gosub *save bsave refstr, stage } } getkey Lkey, 'L' if Lkey { // load dialog "bow", 16 if stat { sdim stage,255 bload refstr, stage goto *reset } } } redraw /* stick key if key&16 : bmpsave "hoge.bmp" */ await 30 mcnt ++ goto *main *make_block if type { if block_max>=85 { dialog "85個までだよ" return } // add block_max++ pin += type=1 gosub *get_block ;qaddpoly block, 4, x*6-desx/2+144/2-6*65+3,y*6-6*65+3,, w,h, 0 qaddpoly block, 4, x*6+85,y*6-387,, w,h, 0 qweight block, 7, 1200+8800*(type>=2) qmat block, mat_spr, 1,type qtype block, type_bind*(type=6) quser block, type,x,y } else { // del qcnvaxis x,y,mousex_,mousey_,1 qinner v1,x,y if v1>=0 { block_max-- qdel v1 } } return *get_block // size of block w = 4 : h = 21.4 if type=2 : h+=17 if type>=4 : h=4.3 if type=4 : w = 38 if type=5 : w = 21 return *draw_block // draw block celput ,type, 0.045*w,0.045*h return *change // ボタンの動作を制御 ; [PLAY]と[EDIT]のオンオフ ; mode ^= 2*(stat=0) +1*(stat=1) mode ^= 2*(stat=0) +stat if stat { sdim stage } else { gosub *save } ; DEFPUSHボタンで、擬似的にトグルボタンを再現。 ; 本当にトグルボタン化すると、on/offの管理が面倒なのと、 ; SetWindowLongを使わないので、容量削減になる。 sendmsg hplay, $f4, mode>>1 sendmsg objinfo(1, 2), $f4, mode&1 ; PLAYモードなら、[EDIT]使用不可 ; objenable 1, (mode&2)!2 objenable 1, mode<=1 goto *reset *save sdim stage,255 qfind 1 ; repeat block_max で検索すると、 ; EDITで、ブロックをdeleteした後だと、バグる。 repeat // save qnext v2 if v2<0 : break qgetuser v2, type,x,y v1 = cnt*3 poke stage,v1,type poke stage,v1+1,x poke stage,v1+2,y loop return