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を追加したいと思います。
[▲トップページへ]