screen 0,600,480,1 cls 4 yy=350 bsixe=5 gamex=winx-20 gamey=winy-30 bx=100:by=20:dx=5:dy=10:bf=1 *mainlp gosub *ballmove gosub *ballput gosub *memove gosub *newball await 5 goto *mainlp ;------------------- ;ボールの発生 *newball if bf!0:return rnd rr,400 bx=50+rr rnd rr,4 by=1:dx=5:dy=5+rr:bf=1 return ;ボールを移動しよう! *ballmove if bf=0:return ;xを足す bx=bx+dx ;当たった? ;1)壁かな? if bx<0:bx=0:dx=0-dx if bx>gamex:bx=gamex:dx=0-dx ;yを足す byy=by:by=by+dy ;当たった? ;1)壁かな? if by<0:by=0:dy=0-dy ;2)ラケットに当たったかな? if (byy<350)&(by>=350):goto *rcheck ;3)おちた if by>480:bf=0:color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe return ;ラケットチェック *rcheck if bx<xx:return ;bx < xx ラケットより左 if bx>(xx+100):return ;bx > xx+mesize ラケットより右 ;hit! by=350:dy=0-dy return *overcheck if by<450:return bf=0 ;ball flag clear color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe:return ;ボールの表示 *ballput if bf=0:return color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe color 100,100,255:boxf bx,by,bx+bsixe,by+bsixe bxx=bx:byy=by:return ;------------------- *memove xx=mousex if xx<0:xx=0 if xx>490:xx=490 if xxx!xx:color 0,0,0:boxf xxx,yy,xxx+100,yy color 100,100,255:boxf xx,yy,xx+100,yy xxx=xx return |
今回はボールとラケットの両方を動かします。
「ブロック崩しを作ろう」の(1)と(2)のスクリプトを合わせて、 ボールとラケットの当たり判定を入れています。
さらに、ボールが下に落ちると、消えて次のボールが出てくるようにしました。
ラケットの幅は100ドットとしていますが、ボールの座標は手抜きで、考慮していません。
ボールの移動処理をXY分けて行いました。
この方がヒットチェックなどでうまくいくのです。
動きが早過ぎる場合には、メインループのウェイト時間を変えて調整します。