その12 ブロック崩しを作ろう(4)

	;画面の初期化
	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のダウンロード


その13に行く

目次に戻る