その10 ブロック崩しを作ろう(2)

	;画面の初期化
	screen 0,600,480,1
	cls 4
	bsixe=5
	gamex=winx-20
	gamey=winy-30
*mainlp
	gosub *newball
	gosub *ballmove
	gosub *ballput
	wait 1
	goto *mainlp
	;ボールの発生
*newball
	if bf!0:return
	rnd rr,400
	bx=50+rr
	by=1:dx=2:dy=2:bf=1
	return
	;ボールの移動
*ballmove
	if bf=0:return
	by=by+dy:bx=bx+dx
	if by<0:by=0:dy=0-dy
	if bx<0:bx=0:dx=0-dx
	if bx>gamex:bx=gamex:dx=0-dx
	if by>gamey:by=gamey:dy=0-dy
	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

今回はボールを動かします。
ボールといっても四角いんです。
壁に当たると、常に反射するようになっています。
全体的には「ブロック崩しを作ろう(1)」のスクリプトの構造と似ていますね。

さて、ボールや敵キャラには、たいてい3つの状況があります。

(1)発生する。
(2)移動する。
(3)消滅する。

今回のプログラムでは、ボールは消えません。
将来的には、「下に落ちたらボールは消えて、上から発生する」
というふうにしたいなぁと思いながら作りました。

その時有効なのが、ボールの存在フラグ「bf」です。
ボールが画面上に有るときには「bf=1」。
ボールが消えたら「bf=0」というルールを決めた変数です。
ボールが存在しないときには、移動も表示もしません。
表示部分はラケットの表示とかなり似ています。
座標が変化している場合には、前の座標に黒い四角を表示して、ボールを消します。

■端の処理

dxやdyは1回分の座標の変化です。
dxはxの変化分で、dxが1だと1回分で右に1ドット移動します。
この1回分の座標の変化を何度も繰り返して、ボールは動いていきます。

if bx<0:bx=0:dx=0-dx

これは左の壁に当たったときの処理です。
このときには最初dxが-2とかのマイナスの値です。


dx=0-dx

この処理で符号が逆になります。
最初-2なら、この処理で2になり、ボールが右に動くようになります。

その11に行く

目次に戻る