Chapter.27 ゲームとリンク
[Chapter27 制作物]

今回は、BGMドライバとゲームプログラムをリンクします。

■mk.bat 等ビルド環境の修正
前回まで BGMドライバだけをアセンブル・実行していましたが、今回からゲームとリンクするために、
mk.bat, sca.link を修正する必要があります。

BGMドライバは、bgmdriver.asm, bgmdriver_h.asm の2つのファイルで出来ているので、前回のアーカイブから
そのままコピーしてきます。
bgmdriver_if.asm は、BASICから BGMドライバを呼び出すためのインターフェースルーチンなので、もう使いません。

mk.bat には、bgmdriver.asm をアセンブルする行を追加します。
※bgmdriver_h.asm は、ソースから include されるものなので、アセンブル行は必要ありません。

sca.link には、bgmdriver.o を追加しておきます。

ビルド環境としてはこれで修正完了です。
しかし、これだけでは、"ただリンクしただけ" で、BGMドライバが呼び出されません。

■sca_vsync.asm の修正
VSYNC割り込みをまとめてある sca_vsync.asm の中に、vsync_interrupt_handler があります。
ここは、VSYNC割り込みによって、1/60秒に1回呼び出されるルーチンになっています。
ここに、BGMドライバの 1/60秒単位処理 bgmdriver_interrupt_handler の呼び出しを追加することで、
BGMドライバを動作可能な状態にします。追加する内容は、プログラム1 に示します。

プログラム1. BGMドライバの 1/60秒単位処理
	; BGMドライバーの割り込み処理ルーチンを呼び出す
	call	bgmdriver_interrupt_handler
		

追加する場所は、「ソフトウェアタイマーの処理」の前あたりに挿入してください。

次に、プログラムの頭の方に、プログラム2も追加してください。

プログラム2. BGMドライバ周りの宣言を include
	.include	"bgmdriver_h.asm"
		

bgmdriver_h.asm には、BGMドライバを使うための様々な宣言がまとめてあります。
.include することで、それらを利用可能にするわけです。

■sca_main.asm に初期化を挿入
sca_main.asm の中の初期化処理に、BGMドライバの初期化を挿入します。
冒頭にプログラム2 を挿入するのも忘れないでください。

初期化処理 game_init の中には、様々な初期化が詰まってますが、vsync_init の呼び出しがあると思います。
vsync_init は、VSYNC割り込み処理の初期化処理ですが、これを実行してしまうと上で追加した bgmdriver_interrupt_handler が
定期的に呼ばれるようになります。
bgmdriver_interrupt_handler が動く前に、確実に BGMドライバの初期化を済ませておかねばならないので、
vsync_init の呼び出しよりも前に BGMドライバの初期化を呼んでおく必要があります。

なので、vsync_init の呼び出しのすぐ上に bgmdriver_initialize を呼び出す記述 プログラム3 を挿入してください。

プログラム3. BGMドライバの初期化処理
	; BGM Driver 初期化
	call	bgmdriver_initialize
		

■sca_clash.asm に効果音発声処理を追加
sca_main.asm の処理までで、BGMドライバは動作し始めます。
しかし、「BGM演奏開始」とか「効果音発声」と指示してやらないと、BGMドライバは何も音を出しません。
BGMは、まだ作成していないので、とりあえず効果音の発声指示だけ追加してみることにします。

まず、効果音データ プログラム4 を作成します。

プログラム4. 効果音データ
se_damage::
	.db	#BGM_SE_VOL
	.db	#15
	.db	#BGM_SE_FREQ
	.dw	#30
	.db	#BGM_SE_NOISE_FREQ
	.db	#0 + 0x80
	.db	#BGM_SE_WAIT
	.db	#1
	.db	#BGM_SE_VOL
	.db	#8
	.db	#BGM_SE_FREQ
	.dw	#28
	.db	#BGM_SE_WAIT
	.db	#1
	.db	#BGM_SE_VOL
	.db	#4
	.db	#BGM_SE_FREQ
	.dw	#26
	.db	#BGM_SE_WAIT
	.db	#1
	.db	#BGM_SE_VOL
	.db	#2
	.db	#BGM_SE_FREQ
	.dw	#24
	.db	#BGM_SE_WAIT
	.db	#1
	.db	#BGM_SE_END

se_bomb::
	.db	#BGM_SE_VOL
	.db	#15
	.db	#BGM_SE_FREQ
	.dw	#32768		; 32768 にすると TONE OFF
	.db	#BGM_SE_NOISE_FREQ
	.db	#31 + 0x80
	.db	#BGM_SE_WAIT
	.db	#5
	.db	#BGM_SE_NOISE_FREQ
	.db	#15 + 0x80
	.db	#BGM_SE_WAIT
	.db	#5
	.db	#BGM_SE_NOISE_FREQ
	.db	#31 + 0x80
	.db	#BGM_SE_WAIT
	.db	#5
	.db	#BGM_SE_NOISE_FREQ
	.db	#15 + 0x80
	.db	#BGM_SE_WAIT
	.db	#5
	.db	#BGM_SE_NOISE_FREQ
	.db	#31 + 0x80
	.db	#BGM_SE_WAIT
	.db	#10
	.db	#BGM_SE_NOISE_FREQ
	.db	#15 + 0x80
	.db	#BGM_SE_WAIT
	.db	#10
	.db	#BGM_SE_END
		

se_damage 以下は、敵に弾が当たって爆発しなかったときの音。
se_bomb 以下は、敵に弾が当たって爆発したときの音です。

次に発声指示を挿入します。

挿入箇所は、enemy_clash の「敵と自機弾の当たり判定処理」の部分です。
敵を壊せなかった場合のところに、se_damage の発声処理を挿入し、壊せたところに se_bomb の発声処理を追加。

プログラム5. 敵と弾のあたり判定
enemy_clash::
	; 敵にダメージを与える
	ld	a, SCA_INFO_ENEMY_POWER(ix)
	sub	SCA_INFO_SHOT_POWER(iy)
	; 敵が壊れたか判定
	jr	c, enemy_clash_enemy_destroy		; 壊れた場合、敵消去処理へ
	ld	SCA_INFO_ENEMY_POWER(ix), a		; 耐久力を更新
	; 敵にダメージを与えた音を発声
	ld	hl, #se_damage
	call	bgmdriver_play_sound_effect
enemy_clash_shot_destroy:
	; 衝突した自機弾を消滅させる
	ld	SCA_INFO_YH(iy), #212			; 非表示
	ld	SCA_INFO_SHOT_POWER(iy), #0		; 発射中でない
	ret
	; 敵消去処理
enemy_clash_enemy_destroy:
	; 敵が爆発した音を発声
	ld	hl, #se_bomb
	call	bgmdriver_play_sound_effect
	; 衝突した自機弾を消滅させる
	ld	SCA_INFO_YH(iy), #212			; 非表示
	ld	SCA_INFO_SHOT_POWER(iy), #0		; 発射中でない
	; 敵を爆発パターンに変更する
	call	enemy_bomb
	; 点数を追加
	ld	de, #0x10				; 敵破壊は 10点  ★暫定
	call	score_add
	call	top_score_check
	call	score_update
	ret
		


今回は、こんな感じでした。
次回は、BGMを追加したいと思います。

[▲トップページへ]