;画面の初期化 screen 0,600,480,1 cls 4 yy=350 bsixe=5 gamex=winx-20 gamey=winy-30 gosub *newball map="1111111"+"1010101"+"1110111"+"1111111" ;マップデータ str nowmap nowmap=map ;-----------------この間省略しています。 ;ボールを移動しよう! *ballmove if bf=0:return bx=bx+dx if bx<0:bx=0:dx=0-dx if bx>gamex:bx=gamex:dx=0-dx gosub *blckx byy=by:by=by+dy if by<0:by=0:dy=0-dy if (byy<350)&(by>=350):goto *rcheck gosub *blcky if by>480:bf=0:color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe return ;-----------------この間省略しています。 *blckx if (bx<19)|(bx>579):return if (by<39)|(by>119):return xof=(bx-20)/80:yof=(by-40)/20 i=yof*7+xof peek code,nowmap,i if code='0':return dx=0-dx:zz='0' poke nowmap,i,zz gosub *allbl return *blcky if (bx<19)|(bx>579):return if (by<39)|(by>119):return xof=(bx-20)/80:yof=(by-40)/20 i=yof*7+xof peek code,nowmap,i if code='0':return dy=0-dy:zz='0' poke nowmap,i,zz gosub *allbl return *allbl i=0:cc=0 repeat 4 cty=cnt repeat 7 peek code,nowmap,i i++ if code='0':color 0,0,0 if code='1':color 50,50,155:cc++ boxf cnt*80+20,cty*20+40,cnt*80+20+75,cty*20+40+15 loop loop if cc=0:nowmap=map:goto *allbl return |
やっとブロックが出ます!!
前回まで、壁うちのテニスでしたが、 今回やっとブロックを出すことに成功しました!
ブロックを出すには以下のサブルーチンを使っています。
1)当たり判定 *blcky
2)当たり判定 *blckx
3)表示 *allbl
*blckyと*blckxは、ほとんど同じスクリプトですが、反射の方向が違います。
縦と横です。
当たり判定は、ブロックが80*20のサイズで隙間なく並んでいる仕様なので、
座標を割り算して行っています。
「if (bx<19)|(bx>579):return
if (by<39)|(by>119):return」
最初に、ブロックの表示されない部分を除外します。
「xof=(bx-20)/80:yof=(by-40)/20」これが、割り算です。
ボールがブロックのどの位置にあたるかを見ています。
そして、「 i=yof*7+xof」と「peek code,nowmap,i」でマップデータを見るのです。
文字が'0'なら空白。'1'ならブロックが有る状態です。
ブロックにボールが当たったら、マップを書き換えて、
ボールの変化率をプラスならマイナスへ、マイナスならプラスへ変えます。
ちなみに、今回のスクリプトでは全てのブロックを消すと、ブロックがもとに戻るようになっています。
表示部分で、表示したブロックを変数ccで数えています。
さて、ブロック崩しは今回で終わりです。
最後はすごく長いスクリプトになってしまいましたが、
構造としては前回までのものと同じですから、そちらと比べて見るのもいいでしょう。
今回、すべてのスクリプトを載せるには少々長くなってしまったので、ダウンロード出来るようにしました。
all.zipのダウンロード