自機の弾の発射



弾の発射は結構面倒です。Ver2.5位のHSPの文献に乗っているシューティングゲームのサンプルは、弾を1個撃つとその弾が消えるまで次の弾が撃てないというインベーダー式の物でした、確か。
弾の個数に制限を持たせるとなると、弾の有無のチェックがめんどくさかったりします。
そういう場合は、全部いっぺんに表示できないくらいたくさんの配列を作っておけばいいのです。
前回のサンプルに続きまして。

	;四角い謎の物体の弾発射

	screen 0,300,400,1	;パレットモードの方がとりあえず早い

	jx=130		;自機の初期位置x
	jy=180		;自機の初期位置y
	jsizex=40	;自機の大きさx
	jsizey=40	;自機の大きさy

	jtm=100		;自弾の最大数
	jtmsizex=10	;自弾の大きさx
	jtmsizey=10	;自弾の大きさy
	dim jtmc,jtm	;自弾の表示フラグ
	dim jtmx,jtm	;自弾の位置x
	dim jtmy,jtm	;自弾の位置y
	jtmno=0		;次の弾のナンバー

*mainloop
	redraw 0	;描画ストップ
	color : boxf	;背景塗りつぶし
	gosub *keycheck
	gosub *jdraw
	gosub *jtmdraw
	redraw 1	;再描画
	await 1		;ウェイトを入れておかないとキー取得が出来ない。入れないと止まる
	goto *mainloop

*jdraw
	color ,255 : boxf jx,jy,jx+jsizex,jy+jsizey	;■の描画
return

*jtmdraw
	repeat jtm
		if jtmc.cnt=1 {
			jtmy.cnt-2	;上方向へ移動
			if jtmy.cnt<(-jtmsizey) : jtmc.cnt=0	;上端までいったらフラグをオフにする
			color 255 : boxf jtmx.cnt,jtmy.cnt,jtmx.cnt+jtmsizex,jtmy.cnt+jtmsizey	;自弾の描画
		}
	loop
return

*keycheck
	stick ky,15,1
	if ky!=0 {
		if ky&1 {
			jx-- : if jx<0 : jx=0		;画面外へ行かないように
		}
		if ky&2 {
			jy-- : if jy<0 : jy=0
		}
		if ky&4 {
			jx++ : if jx>(winx-jsizex) : jx=winx-jsizex
		}
		if ky&8 {
			jy++ : if jy>(winy-jsizey) : jy=winy-jsizey
		}
		if ky&16 {
			jtmc.jtmno=1				;自弾表示ON
			jtmx.jtmno=jsizex-jtmsizex/2+jx		;自機の真ん中
			jtmy.jtmno=jy				;自機の先端
			jtmno++ : if jtmno=jtm : jtmno=0	;次の弾へ
		}
	}
return


スペースキー押しまくってください。
弾打ちまくれます。jtmの数値ぶんまで弾を出すことが出来るようになります。しかし表示数が多いとすぐ遅くなってしまうので注意してください。
前回からの変更点を述べますと、
まず各処理をサブルーチン化しました。
*keycheck…上下左右とスペースキーのキー判定をしています。
*jdraw…ここでは1行だけですが、自機をboxfで描画しています。
*jtmdraw…スペースキーが押されてフラグがオンになった弾のみ描画を行うようになっています。
次は敵の移動をやります。


前へ 戻る 次へ