'■ ロボコン用プログラムに向けてちょっと復習 '■ ---------------------------------------- '■ キー入力やその他の処理は別スレッドで動いているので、 '■ プログラムの後ろの部分を変えればオリジナルのステージが '■ それなりに簡単に作れると思います。最終的には、ステージの '■ 部分のプログラムを merge して実行するようにするつもり。 '■ '■ そういや、こんな感じのゲーム、ファミコン(ディスクシステム?)にありましたね '■ #知らんて(^^; skclose clear 100,1300 screen 0: sprwindow ,,,,,0,0 priority 4,7 dim px(15),py(15),p_map(3,3),p_move(3) cx = 320/2 : cy = 224/2 p_ofs_x = cx-64+16 p_ofs_y = cy-64+16 effect 1,0,"@42A16" '▼ バッファの準備 gload "cd:tekst.1" settex 0,320,224,32768:cls 10 setatr 0,1,(0,0,3,0,0,0) obj(1,@type)=1:obj(1,@xs)=&h.fffc:obj(1,@atr)=0:obj(1,@xp)=cx,cy,5000 active 10 for i=0 to 223 gcopy 0,(0,i)-(319,i) to tx$ gcopy tx$ to 10,(0,i) next line (cx-65,cy-65)-(cx+64,cy+64),3767,bf line (cx+96-1,cy+64-33)-(cx+96+32,cy+64),rgb(14,3,2),bf active 0 for i=1 to 16*3 settex i,32,32,32768 setatr i,1,(0,0,3,i,0,0) cls 10+i next settex 49,32,32,32768,strw$(32*32,&h8000+rgb(0,0,31)) setatr 49,1,(0,0,3,49,0,3) obj(20,@type)= 1:obj(20,@xs)=&h.fffc obj(20,@xp) = p_ofs_x,p_ofs_y obj(20,@atr) = 49 display off 0 *system_init gosub *reset_p_position gosub *init on interval(1) gosub *key_input interval(1) ON,1 goto *main '---------------------------------------------------------- ' ▼ ピースの位置の初期化 '---------------------------------------------------------- *reset_p_position rp_c=0 for rp_i=0 to 3 for rp_j=0 to 3 p_map(rp_j,rp_i) =rp_c+1 obj(2+rp_c,@type)=1 : obj(2+rp_c,@xs)=&h.fffc obj(2+rp_c,@xp) = p_ofs_x+rp_j*32,p_ofs_y+rp_i*32 obj(2+rp_c,@atr) = rp_c+1 rp_c=rp_c+1 next next 'はじめにはずしておくピースを選択 pn_x = 3: pn_y = 3 obj(2+pn_x+pn_y*4,@xp) = p_ofs_x+5*32, p_ofs_y+3*32 p_map(pn_x,pn_y) = 0 return '---------------------------------------------------------- ' ▼ キー入力 '---------------------------------------------------------- *key_input LOCK key_data = (pad(0,1) or pad(15,1)) and -7 if key_data = 0 and key_status = 1 then key_status = 0 if key_status = 0 then if key_data and @PAD_UP and pos_y>0 then pos_y = pos_y-1: goto *ki_2 if key_data and @PAD_DOWN and pos_y<3 then pos_y = pos_y+1: goto *ki_2 if key_data and @PAD_LEFT and pos_x>0 then pos_x = pos_x-1: goto *ki_2 if key_data and @PAD_RIGHT and pos_x<3 then pos_x = pos_x+1: goto *ki_2 if key_data and @PAD_START then gosub *reset_p_position gosub *init endif if key_data and @PAD_C then goto *ki_3 endif if key_status = 1 then key_wait = key_wait - 1 if key_wait <= 0 then key_status = 0 UNLOCK:return endif if key_status = 2 then if pm_step = 0 then key_status = 0: UNLOCK:return pm_step = pm_step-1 for pm_i = 0 to pm_count-1 obj(2+p_move(pm_i),@xp)=obj(2+p_move(pm_i),@xp)+pm_vx obj(2+p_move(pm_i),@yp)=obj(2+p_move(pm_i),@yp)+pm_vy next UNLOCK:return endif UNLOCK:return '■ カーソル移動 *ki_2 effect 1 obj(20,@xp) = pos_x*32+p_ofs_x, pos_y*32+p_ofs_y key_status = 1 key_wait = 4 UNLOCK:return '■ ピース移動 *ki_3 if (pn_x = pos_x) and (pn_y<>pos_y) then pm_vx = 0 : pm_vy = sgn(pn_y-pos_y) pm_count = abs(pn_y-pos_y) for ki_i=0 to pm_count-1 swap p_map(pn_x,pn_y-ki_i*pm_vy),p_map(pn_x,pn_y-ki_i*pm_vy-pm_vy) p_move(ki_i) = p_map(pn_x,pn_y-ki_i*pm_vy)-1 next pn_x = pos_x : pn_y = pos_y key_status = 2 pm_step = 32 endif if (pn_x <> pos_x) and (pn_y=pos_y) then pm_vx = sgn(pn_x-pos_x) : pm_vy = 0 pm_count = abs(pn_x-pos_x) for ki_i=0 to pm_count-1 swap p_map(pn_x-ki_i*pm_vx,pn_y),p_map(pn_x-ki_i*pm_vx-pm_vx,pn_y) p_move(ki_i) = p_map(pn_x-ki_i*pm_vx,pn_y)-1 next pn_x = pos_x : pn_y = pos_y key_status = 2 pm_step = 32 endif UNLOCK:return '---------------------------------------------------------- ' ▼ 論理BG0に描画されたグラフィックを各ピースに貼りつける ' [入力] gp_x, gp_y : 元絵の左上の座標 '---------------------------------------------------------- *graphics_paste gp_base = (gp_base+1)mod 3 gp_c = 0 gp_cc = gp_base*16+11 for gp_i=0 to 3 for gp_j=0 to 3 gp_xx = gp_j*32+gp_x gp_yy = gp_i*32+gp_y gcopy 0,(gp_xx,gp_yy)-(gp_xx+31,gp_yy+31) to gp_tx$ gcopy gp_tx$ to gp_cc,(0,0) gp_c = gp_c + 1 gp_cc = gp_cc + 1 next next vsync for gp_i=0 to 15 obj(gp_i+2,@atr)=gp_base*16+gp_i+1 next return '============↑↑ ここまでサブルーチン ↑↑===================== '=============================================================== ' ▼ グラフィック描画に関するプログラムをここにマージします ' *init : ゲームスタート前にこのルーチンが呼ばれます ' *main : スタートするとこのルーチンにジャンプします '=============================================================== '● 初期化ルーチン *init active 0 for i=0 to 100 circle (rnd(128),rnd(128)),rnd(64),rnd(23767),f next return '● メインルーチン *main active 0 *main_loop if sq>rnd(10)+10 then sq=0 if sq=0 then tmp_x=rnd(128):tmp_y=rnd(128):tmp_c=rnd(32768) for t2=2 to 0 step-1 v=(sq+t2)*4 l=-(2-t2)*12 circle(tmp_x,tmp_y),v,rgbadd(tmp_c,l,l,l),f next gp_x=(gp_x+2)mod (320-128) : gp_y=(gp_y+1)mod (224-128) gosub *graphics_paste: '<= 絵が完成したらこれを呼び出す。 ' :論理BG0の(gp_x,gp_y)を左上とする ' :128x128 dot の領域がピースにはりつけられる sq=sq+1 goto *main_loop