その11 ブロック崩しを作ろう(3)

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分けて行いました。
この方がヒットチェックなどでうまくいくのです。

動きが早過ぎる場合には、メインループのウェイト時間を変えて調整します。


その12に行く

目次に戻る