;=========================================================== ; 2009/08/30 ; ボウリング(笑) 1.0 ; 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 ; user32.dll #uselib "user32.dll" #func SetWindowLong "SetWindowLongA" sptr,sptr,sptr #const toggle $50000003 | $1000 ; key code #const click 256 #const non_trigger click ; font font1 = "Comic Sans MS" ;----------------------------------------------------------- ; graphic ;----------------------------------------------------------- buffer 1 : boxf celdiv ,64,64,32,32 ; ball color 100,220,100 circle ,, 63,63 ; pin gradf 64,0, 128,64, 0, $eeeeee,$666666 ; block gradf 128,0, 128,64, 0, $ff0000,$552222 ; square gradf 192,0, 64,64, 1, $88ff11,$222222 gsel; 0 ;----------------------------------------------------------- ; definition ;----------------------------------------------------------- ; world #const basic_w 640/4 #const basic_h 480/4 ; boder #const boder_w basic_w*5.5 #const boder_h basic_h*2 #const boder_w2 boder_w-80 #const boder_h2 boder_h-60 #const boder_w3 boder_w+8 #const boder_h3 boder_h+8 ; cloud space #const cloud_spx basic_w/4 #const cloud_spy basic_h/4 ; リング座標 #const ring_x basic_w/3 #const ring_y boder_h-20 ; click to contine! 座標 #const ctc_x boder_w2-160 #const ctc_y boder_h2-45 ; 初期スクロール(EDIT) #const desx -basic_w*5-176 #const desy -16 ; 初期スクロール(PLAY) #const desx2 170 #const desy2 -boder_h*4+480-32 ; 初期ボール座標 #const demx 16 #const demy boder_h-20 ;----------------------------------------------------------- ; starting ;----------------------------------------------------------- pos 16,352 objsize 112,52, 60 objmode 2 font font1 button "PLAY", *change : gosub *change_toggle : play_hwnd = objinfo(0, 2) button "EDIT", *change : gosub *change_toggle objsize sdim stage *reset ;----------------------------------------------------------- ; reset ;----------------------------------------------------------- // obaq reset qreset qborder -80,-60,boder_w2,boder_h2 // default dim mcnt dim block_max dim pin 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 key_log = key stick key, non_trigger*(mode>=2) clicked = key&click ; オブジェクト上でもマウスx座標を取得。 ; EDITで、マウスを速く動かして[PLAY]押したとき、不本意にブロック作るの防止策。 mousex_ = ginfo(0) - ginfo(4) if mode&2 { ;----------------------------------------------------------- ; play ;----------------------------------------------------------- if threw*clicked | (mcnt=0) { // new ball sx = desx2 sy = desy2 zoom = 4.0 qaddpoly m, 15, demx,demy,, 8,8,, 2 qmat m, mat_spr, 1;,0 dim threw ball -- } if threw { // fly sx = limitf(320.0-zoom*mx, 640.0-zoom*boder_w3,60*zoom) sy = limitf(240.0-zoom*my, 480.0-zoom*boder_h3,8*zoom) zoom = limitf(4.0*(960-mx)/960, 2, 4) } else { if clicked { qcnvaxis x,y, mousex_,mousey, 1 if key_log&click:else { qinner v1, x,y;, m // catch hold += v1=m } if ((mx-ring_x)*(mx-ring_x) +(my-ring_y)*(my-ring_y))>=3600 { // リングから出たら、アウト dim hold } if hold { // hold qpos m, x,y;, mr } } else { if (key_log&click)*hold { // throw x = mx-mx_log y = my-my_log ; speed v1 = limit(sqrt(x*x + y*y)/15, 0,5) r = atan(x,y) qspeed m, sin(r)*v1,cos(r)*v1,v1/30 dim hold ; 低スピードの時は、投げてなかったことにしてあげる ; threw += v1>=0.5 threw += v1*2 } } } // 倒した判定 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 } } sendmsg play_hwnd, $F5 } if ball<=0 { dialog "ドンマイ" sendmsg play_hwnd, $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 // ring palcolor 17 v1 = zoom*60 qcnvaxis x,y, ring_x,ring_y circle x-v1,y-v1, x+v1,y+v1 // 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 // click to continue! palcolor 13 qcnvaxis x,y, ctc_x,ctc_y pos x,y : mes "click to continue!" ;----------------------------------------------------------- ; 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 clicked * (/*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_-143)/12)*12+150,((mousey-8)/12)*12+14 gosub *draw_block } else { pos 50,140 : mes "delete" } ; ステージは、幅40縦38マス。 ; 左上が(20,20)なのは、改行コード(13,10)を踏まないため。 if clicked { x = (mousex_-143)/12+20 y = (mousey-8)/12+20 if x>=20 & y>=20 & x<=59 & y<=57 { gosub *make_block } if x>=10 & y>=26 & x<=19 & y<=36 { type = (type+1)\7 } } } if mode&2 { ;------------------------------------------------------- ; PLAY ;------------------------------------------------------- mes "pin "+laid+"/"+pin+"\nball "+ball } redraw ; 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+basic_w*3+23-6*10,y*6-45-6*10,0, w,h, 0 qaddpoly block, 4, x*6+443,y*6-105,, w,h, 0 ; qweight block, 6, 400+(type>=2)*2000 qmat block, mat_spr, 1,1+(type>=2)+(type=6) 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 if type=2 : h=38 if type>=4 : h=4 if type=4 : w = 38 if type=5 : w = 21 return *draw_block // draw block celput ,1+(type>=2)+(type=6), 0.045*w,0.045*h return *change // ボタンの動作を制御 id = stat sdim stage,256 if id!1 { 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 } ; [PLAY]と[EDIT]のオンオフ ; mode ^= 2*(id=0) +1*(id=1) mode ^= 2*(id=0) +id ; PLAYモードなら、[EDIT]使用不可 ; objenable 1, (mode&2)!2 objenable 1, mode<=1 goto *reset *change_toggle // トグルボタン化 SetWindowLong objinfo(stat, 2), -16, toggle return