BGM(2/2)

 まとめますと、以下の通りです。

	; プログラム起動時の初期設定
	; BGMファイルを開く
	repeat 3
		i=cnt+1
		mci "open samplebgm"+i+".mid alias abogadrobgm"+i
		mci "set abogadrobgm"+i+" time format milliseconds"
	loop
	mci "open bossbgm.mid alias bossbgm"
	mci "set bossbgm time format milliseconds"
	mci "open endbgm.mid alias endbgm"
	mci "set endbgm time format milliseconds"
	bgmname=""

	; ステージスタート時の初期設定
	; BGMを鳴らす。
	mci "play abogadrobgm"+stageno+" from 0"
	bgmname="abogadrobgm"+stageno

	; 敵が爆発中の処理
	f=0
	repeat 10
		if enemyf.cnt=3 {
			eplcnt.cnt=eplcnt.cnt+1
			k=enekind.cnt
			if (eneclass.k!2)&(eplcnt.cnt=15) { enemyf.cnt=0 }
			if (eneclass.k=2)&(eplcnt.cnt=300) {
				enemyf.cnt=0
				gosub *BGM_Stop
				stageno=stageno+1
				if stageno<=3 {
					f=1
					break
				}
				else {
					gosub *Ending
					f=2
					break
				}
			}
		}
	loop
	if f=1 { goto *Stage_Start }
	if f=2 { goto *Game_Start }

	; 自機爆発中の処理
	if playerf=3 {
		peplcnt=peplcnt+1
		if peplcnt=100 {
			noption=0
			nplayer=nplayer-1
			if nplayer=0 {
				playerf=0
				govercnt=0
				gosub *BGM_Stop
			}
			else {
				playerf=2
				revcnt=0
				playerx=xsize/2-16
				playery=ysize-64
				nbomb=3
			}
		}
	}

	; ボス登場の2秒前にBGMを止める。
	if mappnt=3846 { gosub *BGM_Stop }

	; ボス登場時、ボス用BGMを鳴らす。
	if (playerf!0)&(mappnt=4096) {
		mci "play bossbgm from 0"
		bgmname="bossbgm"
	}

	; エンディング
*Ending
	gosub *Clear_Screen
	msx=24:msy=64
	mescont="君の活躍によりアボガドロ軍は撤退した。"
	gosub *wrtmes
	msx=48:msy=96
	mescont="C O N G R A T U L A T I O N S"
	gosub *wrtmes
	msx=64:msy=160
	mescont="Y O U R  S C O R E  "+score
	gosub *wrtmes
	msx=64:msy=192
	mescont="H I G H  S C O R E  "+hiscore
	gosub *wrtmes
	ddredraw
	endingcnt=0
	gosub *In_Key
	repeat
		await 16
		if endingcnt=125 {
			mci "play endbgm from 0"
			bgmname="endbgm"
		}
		gosub *In_Key
		if (pckey=0)&(ckey=1) {
			gosub *BGM_Stop
			break
		}
		endingcnt=endingcnt+1
	loop
	return

	;BGMの演奏を終了する
*BGM_Stop
	if bgmname!"" {
		mci "stop "+bgmname
		bgmname=""
	}
	return

[プログラム全体と絵と音をダウンロード]

 完成です!
 コンティニューやポーズがなかったりと、細かい機能ははしょっていますが、ここまで理解できた方なら自分で作れることと思います。
 それと、このゲームには安全地帯(そこにじっとしていれば絶対に敵や弾に当たらない場所)があります。ステージ1と3のボスです。簡単に見つかる場所ですので探してみて下さい。角度が256通りしか指定できないのと、敵弾が小さいためにこのような安全地帯ができてしまっています。みなさんが作る際には、固定小数の小数部のビット数をもうちょっと多くするか、弾をもっと大きくした方がいいと思います。
 そして、ゲーム作りはこれで終わりというわけではありません。上に書いた不備以外にも、「ちょっと自機の弾が多すぎるかなあ」とか、不満な点があります。テストプレイを繰り返し、細かい点を追加、修正していって、出来上がるのです。(「調整」という言い方をします。)
 と書くと、「うわあ、やっぱりゲーム作るのって面倒くさそうだなあ」と思う方がいるかもしれませんが、最初から自分の求めるゲームを作ろうとする必要はありません。初めは1度に出る敵は1匹、弾も1発だけ、でいいのです。そこから徐々にすごいゲームを作れるようになっていくのが王道です。
 あと補講をちょっと追加するかもしれませんが、本講座は今回で終わりです。

ひとくちメモ:
・BGMのファイルって、どうやって用意するの?
 これもまた、一番手っ取り早いのはフリー素材を探すことです。
 自分で作曲する場合、手軽にできるツールとしては例えばサクラがあります。「ドレミファソ」と書けばドレミファソと鳴るという、簡単に扱えるツールです。
 
・mci命令について
 mci命令はここに書いたもの以外にもいろいろあります。ループして(つまり終了したらまた最初から)再生することもできます。途中で止めて、止めた所から再生することもできます。  mci命令の詳細については、例えばsprocketさんのサイトShinさんのサイトで解説されています。
 
・エイリアス(別名)について
 普通に文章を書く場合にも、「弾幕が画面を覆い尽くすタイプ(以降弾幕系)の……」などとして、以後は「弾幕系」としか書かなかったりしますよね? このように別名を付与した方が便利な場合があります。
 mes , print , ddprintの3つはすべて引数の内容を画面に書く命令ですが、ddprintはDirectX用で、mesはそうではないという意味で全然別の機能です。これに対し、printはmesに別名を付与しているだけであって、全く同じ命令です。mesでもprintでも、好きな方を使えばいいのです。
 また、「代入のイコールと比較演算子のイコールが同じ"="であるのはまぎらわしくて嫌だ」という人のために、比較演算子の方は"=="と書くこともできます。これも"="に付与された別名です。
 


[目次へ][前へ][次へ] inserted by FC2 system