ゲーム開発講座
Chapter2-2
-自作ツールを作るだよの巻-
 
 
-はじめに- 
RPG・シューティング・アクション――― 
ゲームをギリギリ作る事が出来る男G・ケムニャ。 
彼の放った一言は人々を講座へと駆り立てた。 
「ゲームの作り方か? 
 知りたきゃ教えてやる、学べ! 
 プログラムのすべてをそこに置いてきた」 
男たちは講座へ入りオリゲーを追い続ける。 
世はまさに大オレゲー賊時代!
Guten Morgen! 
ポーチカだよ。 
ってなにそのワンピース的な何か
いや、そっちじゃなくて大亜門の読みきり漫画 
「もて塾恋愛相談」ってののパロディだったんだけど・・・。
なんという三次創作。 
そんな事はどうでもいいから。 
今日は何をするの?
ゲームを作るツールを作るぞ。 
アドベンチャーツクールを自分用に作る感じと思ってくれ。
どういうのか想像つかないけど、 
キャラクター登録画面とか音楽登録画面とか 
メニューを作っていくの?
そりゃおめえさん 
完璧にツクールシリーズじゃねえか! 
そういうのも良いけど、今回は自作の開発言語みたいなのを作るんだ。
・・・それって別に作らなくてもいいんじゃないの? 
HSPのコードにそのままゲームデータを作っていけばいいんじゃあ?
前回にもいった通りソースをあまり膨らませるのはよくない。 
それに長い文章を書き続けた時、HSPの命令文じゃ結構面倒くさいよな? 
オリジナルの言語を作るってことは、その面倒くささをいくらでも解消 
出来るってことも忘れちゃいけない。 
まぁ何にせよ、外部ファイルを読み込んでゲームを動かすという作りは 
色々便利だから是非覚えておきたい所。 
そんじゃ始めるぜ。 

サンプルダウンロード 
前回の使いまわしデータが多いから作業フォルダの同じファイルは
上書きしても問題ないぞ。
 

ファイルをロードしてみよう。 
ほんじゃ、ファイルのロードやってみるか。
画像みたいにロードして使うの?
そうだなぁ、画像のロードとはちょっと違うかな。 
まずロードした内容を入れておく変数を用意して、その中にファイルを入れるんだ。
ふーん。 
変数にファイルねぇ。 
エクセルとかのファイル読み込んで表表示とかできるの? 
あとフォトショップとかの画像読み込んでレイアごとの表示とか。
それはちょっと難しいな。 
ロード自体はどのファイルでも出来るんだけど、ファイルごとに内部構造が違って 
データの構造を理解していないと使えないんだ。 
だけどtxtファイルはロードするとその内容をそのまま使えるから便利だ。 
ってことでちょっとtxtファイルを読み込んでみるか。 
まず下の文章をメモ帳とかで描いてプログラムソースと同じフォルダに保存してくれ。 
ロードして 
このデータを 
表示するですとも。
このデータの名前を「gaibu02_01.txt」としてみよう。 
つぎにロードするプログラムソースを描く前にロードする命令の説明をしておこう。 

bload p1,p2 
p1にロードするファイル名、p2にロードしたファイルを入れる変数を指定。 
ファイルを入れる変数はあらかじめsdimである程度容量を確保しておかないと  
エラーが出るから注意してくれ。 
容量はある程度多目に確保しておくといいぞ。 
	sdim data,1000			;ロードするための変数の用意
	bload "gaibu02_01.txt",data		;ファイルをロード
	mes data				;内容を表示してみる
	stop
どうだ?

あ、テキストの内容が表示された。 
でもなんていうか、凄くだから何だ感が凄いんだけど? 
ゲームを作るとき 別画面にテキスト表示させて毎回1行づつコピーしていくとか 
そういう事するわけ?
いやぁ、コレだけじゃそんな感じになっちゃうよな。 
そこで次にノートパッド命令ってのが出てくるってもんだ。
なんだいそれは?
テキストファイルを行ごとに処理する事が出来るんだ。 
テキストを1行ごとにロードしていって表示とかな。 
あとその取り出した1行をさらに分割してコマンドを認識したりも出来るぞ。 
って事で次はノートパッドを使うぞ。
ノートパッド命令を使ってみよう 
ってことでノートパッド命令を使うぞ。 
この命令は今回の中心になるポイントだし、 
これは多くのジャンルのゲームに使えるんだ。 
RPGでもアクションでもシューティングでもな。
それは是非とも習得しなきゃいけないじゃないか!
おうよ、是非とも習得してくれ。 
さて、まずノートパッド命令を使うにはちょっと準備が必要だ。 
まぁ準備っていってもほんの一行、キバることはないぜ。 

notesel p1 
ノートパッド命令はまず操作する変数を決めておかなければいけない。 
p1にテキストデータの入った変数を入れてくれ。 
これで準備完了だ。

・・・それに入れた変数が他の命令に反映されるってこと? 
なんか面倒な作りね。
んー、なんでこんな仕様にしたかは知らないけど 
そういう作りだから気にするな。 
じゃあ次は指定した変数から指定した行を抜き取ってみるか。 

noteget p1,p2 
p1に変数を入れると、p2で指定した行の内容が入る。 
例えば、 
notesel data 
noteget nakami,2 
と書くと、変数dataの三行目の内容が変数nakamiに入る

三行目? 
その書き方だったら二行目じゃないの?
今までやってきた事を思い出せよ。 
プログラムは何でも最初は0から始まるだろ? 
プログラム的に最初は0でも文字的には最初は一行目。 
その辺りごっちゃにならないように気をつけろよ。 
油断せずに行こう。
ああ、なるほど。 
たしかにそうだね。
ほんじゃ、サンプルを見てくれ。 
テキストファイルはロードしたtxtじゃなくても使えるぞ。 
	sdim data,1000			;変数の用意
	data={"おはようさん		;テキストデータをとりあえず三行入力
	こんちゅーッス
	バンワー"}

	notesel data			;変数dataをノートパッドに指定
	noteget nakami,2			;変数nakamiにdataの三行目を入れる

	mes nakami			;内容を表示してみる
	stop
ちなみに豆知識なんだけど{""}でくくって改行する他に「\n」 
という改行コードを入れて改行する方法もあるぞ。 
	sdim data,1000				;変数の用意
	data="おはようさん\nこんちゅーッス\nバンワー"	;\nと入れると改行処理される
	mes data					;改行されているか確認

	notesel data				;変数dataをノートパッドに指定
	noteget nakami,2				;変数nakamiにdataの三行目を入れる

	mes nakami				;内容を表示してみる
	stop
 
なるほど。 
これで指定行ごとにテキストデータを読み込んで 
メッセージを表示させていく事が出来るんだな。 
ちょっと実験してみる。 

・・・よし、これでどうだい? 
	sdim data,10000			;変数の用意
	sdim nakami,200
	data={"
 空を見上げると太陽が『燦々』と輝いている。
アスファルトを見下ろすと『揺揺』と熱で空気が揺れている。
そして木を見ると蝉が『ミンミン』と鳴いていて、
そして私は犬みたいに舌をだして『ハァハァ』言ってる。
「あっつー」
 今日は8月4日。
夏休みってことで朝から探偵業のアルバイトをしているんだけど、
あまりにも熱すぎて脳みそが『沸々』と湯掻きそうになる。
仕事の内容は人探し。
家出をした40過ぎのオッチャンを探しているんだけど、今いるのは
オフィス街の駅前。
見渡すかぎりオッチャンが『うようよ』いる。
「この辺りにいるハズなんだけどなぁ」
 私はベンチに座り、汗を『だくだく』と流しながらじっと流れる人の
波を観察した。
汗がシャツに張り付いて気持ち悪い。
べっとりと張り付くシャツに下着が透け、ソレを見たおっちゃんらの視線は
『悶々』としておりうっとおしい。
だが動きやすいし一番涼しいしで私は夏はシャツ一枚と決めているから
視線に負けて他の服を着るつもりはない。
『じりじり』と照り付ける太陽に焼き尽くされ、体は褐色色に日焼けする。
良い感じにバーベキューになった頃、日が落ち、19時を回り辺りが暗くなってゆく。
結局探していたオッチャンを見つける事は出来ず、ただ熱くて溶けてしまいそうな
『ぐだぐだ』な一日を過ごし、終わってしまった。
おしまい"}
	notesel data			;変数dataをノートパッドに指定
	y=1

	repeat 25
		noteget nakami,cnt		;変数nakamiにループした回数と同じ数値の行目を抜き出す
		mes nakami		;メッセージの表示

		repeat
			stick stc		;クリック待ち
			wait 1
			if stc=256:break
		loop
		if y=4:cls:y=0:pos 0,0	;4行表示ごとにクリア
		y+1
	loop
 

おお、いいねぇ。 
repeatにテキストの行数を入れて最後は終了する作りになってるよな。 
行数数えるの面倒だったらテキストの行数を取得する 

notemax p1 
ってのがある。 
p1に入れた変数にnoteselで指定したテキストデータの行数が入る。 
あと折角だからコマンドを作ってみようか。

コマンド!? 
どんなのが作れるんだ!?
簡単だよ。 
取得した行の文字が特定の文字だったら?をするって作りにするんだ。 
if nakami="click":gosub *クリック処理 
こんな感じだな。 
ああ、あと話変るがプログラムを終了させる時いつもプログラムを最後にもっていってるけど 
end 
って書いても終了するからな。 
そういや最初に教えるべき命令だったなコレ。
唐突だな。 
じゃあとりあえずこんな感じはどうかな? 
	sdim data,10000			;変数の用意
	sdim nakami,200
	data={"
 空を見上げると太陽が『燦々』と輝いている。
clk
アスファルトを見下ろすと『揺揺』と熱で空気が揺れている。
clk
そして木を見ると蝉が『ミンミン』と鳴いていて、
そして私は犬みたいに舌をだして『ハァハァ』言ってる。
clk
clr
「あっつー」
clk
clr
 今日は8月4日。
clk
夏休みってことで朝から探偵業のアルバイトをしているんだけど、
あまりにも熱すぎて脳みそが『沸々』と湯掻きそうになる。
clk
仕事の内容は人探し。
clk
家出をした40過ぎのオッチャンを探しているんだけど、今いるのは
オフィス街の駅前。
clk
見渡すかぎりオッチャンが『うようよ』いる。
clk
clr
「この辺りにいるハズなんだけどなぁ」
clk
clr
 私はベンチに座り、汗を『だくだく』と流しながらじっと流れる人の
波を観察した。
clk
汗がシャツに張り付いて気持ち悪い。
clk
べっとりと張り付くシャツに下着が透け、ソレを見たおっちゃんらの視線は
『悶々』としておりうっとおしい。
clk
だが動きやすいし一番涼しいしで私は夏はシャツ一枚と決めているから
視線に負けて他の服を着るつもりはない。
clk
『じりじり』と照り付ける太陽に焼き尽くされ、体は褐色色に日焼けする。
clk
良い感じにバーベキューになった頃、日が落ち、19時を回り辺りが暗くなってゆく。
clk
結局探していたオッチャンを見つける事は出来ず、ただ熱くて溶けてしまいそうな
『ぐだぐだ』な一日を過ごし、終わってしまった。
clk
clr
おしまい
clk
end
"}
	notesel data				;変数dataをノートパッドに指定
	y=1

	repeat
		noteget nakami,cnt			;変数nakamiにループした回数と同じ数値の行目を抜き出す
		a=0
		if nakami="clk":a=1:gosub *click	;変数nakamiの中がclkの時、サブルーチンに飛びクリック待ち
		if nakami="clr":a=1:cls:pos 0,0	;変数nakamiの中がclrの時、画面をクリアする
		if nakami="end":end		;変数nakamiの中がendの時、プログラムを終了する
		if a=0:mes nakami			;↑の三つが実行されなかった場合コマンドでないと認識
	loop

*click
	repeat
		stick stc				;クリック待ち
		wait 1
		if stc=256:break
	loop
	return
「clk」って書くとクリック待ち 
「clr」って書くと画面クリア 
「end」って書くとプログラム終了。 
それで変数aを毎回最初に中身を0にして 
コマンドが実行されたら中身を1になるようにして、 
もし0のまま進むとコマンドではないと認識して 
その行を画面に表示するようにしたよ。
エクセレントだぜポチ。 
ソレでいい、俺の言わんとすることが大体理解できてるぜ。 
それに俺ももちろん透けた下着とか好きさ。 
ありがとう、ポチありがとう! 
じゃあ次行ってみるか。
なんて嬉しくない褒めっぷり!
細かいコマンドを作ってみよう。 
じゃあ次は取得した行を分解してみようか。 
前回はコマンドを作った時、その行全部がコマンドだったけど 
今度はコマンドにパラメーターをつけれるようにしてみようか。
パラメーターってなにアルね?
HSPの命令で例えば、 
wait p1 
があるよな? 
このp1の部分がパラメーターあるよ。
なるほど、それが出来ないとツールとして不足だからな。
文字を分解する命令文はコレ。 

getstr p1,p2,p3,p4 
p2に元となる文章の入った変数を入れ、 
p1に指定した範囲を抜き出した結果を入れる変数を指定する。 
そしてp3に数字を入れ、p4に文字を入れると 
p3文字目からp4で指定された文字までの間の文字を抜き出す事が出来る。

・・・・凄い解かりにくい日本語つかいますなあんた。
うん・・・ちょっと説明が変かも。 
まぁサンプルを見れば一目瞭然だぜ! 
	a="abc,defghijk,lnm"	;所々「,」で区切ってみる
	getstr b,a,0,','		;0文字目から次の「,」までの文字を抜き出し、変数bに入れる
	mes b			;出力してみる
	stop
こうすると0文字目から次の「,」までの文字が抜き出されて 
出力された文字は「abc」になっただろう?
あれ? 
noteselで指定してないのに結果が出たぞ? 
それにp4の指定した区切りの文字「"」じゃなくて「'」だな?
ああ、これは別にノートパッド命令じゃないから。 
それと「"」でくくったものは文字で「'」でくくったものはASCIIコードとして認識されるんだが、 
その辺りはよく解からなかったら深く考えずに 
この命令文のp4は「'」にしておけばいいんだなと思ってくれ。
むう、 
電子レンジは構造を知らなくても暖めれるの法則か。 
まぁいいや。
getstrのp3は検索開始する場所を指定できるってことは 
例えば全てのコマンドが3文字だった場合、コマンドの後、 
1文字分スペース等で区切ったとした場合4文字目から最後までを 
抜き出すとその抜き出したものがパラメーターとなる、 
という構造の場合こうなる。 
	a="abc 200"		;コマンドとパラメーターを半角スペースで区切る
	getstr b,a,0,' '		;0文字目から次の半角スペースまでの文字を抜き出す
	getstr c,a,4		;p4を書かない場合最後まで抜き出せる。
	mes "コマンドは"+b		;出力してみる
	mes "パラメーターは"+c
	stop
 
pos p1,p2 
みたいに複数のパラメーターを作りたい時はどうするの? 
全部同じ文字数のコマンドを作った場合、 
p1の検索開始位置は決まってるけど、コマンドの文字数が決まってない場合、 
p2の検索開始位置が解からないよね?
いい所に気がつくじゃないか明智君。 
この命令文を使うとシステム変数strsizeに 
今抜き出した文字数が入る。 
この時、抜き出した文字は最後の検索終了の記号は入らないけど 
抜き出した文字数には記号もカウントされるから、 
a="abc,def" 
getstr b,a,0,',' 
とした場合、bの中身は「abc」だけどstrsizeの中身は4になる。 
そしてそのサイズを他の変数に入れておき、パラメーターをさらに分解して 
さきほどサイズを入れた変数にさらにstrsizeを加算すると 
次のコマンドの検索開始位置が解かる。 
サンプルを書いてみよう。 
	a="abc 200,酢飯,ko_usagi"		;コマンドとパラメーターを半角スペースで区切る

	getstr b,a,0,' '			;0文字目から次の半角スペースまでの文字を抜き出す
	count+strsize			;いま抜き出した文字数を変数countに格納
	mes "コマンドは"+b

	getstr b,a,count,','		;変数countに開始位置が入っている。
	count+strsize			;さらに今抜き出した文字数を加算する
	mes "1つめのパラメーターは"+b

	getstr b,a,count,','
	count+strsize
	mes "2つめのパラメーターは"+b

	getstr b,a,count,','
	mes "3つめのパラメーターは"+b

	stop
どうだい。 
これならパラメーター設定し放題だろ?
よし! 
さっそくゲームっぽい感じに作るぞー・・・ 
あるぇ〜? 
waitみたいな命令文を今作ったんだけどエラーがでるよ?
ああ、数字を入れないとダメな所に文字を入れたんだな。
え、でもこれ数字だよ? 
wit 20 
って命令とパラメーターを作って 
パラメーター部分の変数をwaitに入れたんだけど。
いいや、 
見た目が数字でも中身を取り出した時、それは数字ではなく文字として扱われるんだ。 
a=10 
は数値型で 
a="10" 
は文字列型 
っての最初にやっただろ?
うぎぎ、じゃあどうすればいいの?
文字列型を数値型にする命令文があるんだ。 
入っている文字が半角の数字のみの場合、 
それを数字として作り変えてくれるありがたい命令文だ。 

int p1 
p1に変数を入れると数値型に作り変えてくれる。 
また逆に数値型を文字列型にしたい場合、 
str p1 
ってのをつかえばいいぞ。

そうなんだ。 
あ、あとゲーム作るのに他に重要な事あるじゃん。 
音楽とかどうやって流すの?
そうだったな。 
HSPがサポートしている音のデータは 
wav(非圧縮) 
midi 
mp3 
ASF 
あとCDとAVIとMPEGだ。 

sndload p1,p2,p3 
p1に音のファイル名を入れ、 
p2に登録番号・・・画面IDの音用版だと思ってくれ、0〜255の好きなのを入れて良い。 
p3はその音を再生するモードを入れる。 
モードは 
0 通常再生。効果音とかに使える。 
1 ループ再生。バックミュージックとかに使える。 
2 再生終了まで待つ。再生が終わるまで次の命令を実行しない。 
sndloadで登録した音は 
snd p1 
でいつでも再生する事が出来る。 
p1にsndloadで指定した登録番号を入れるとその音が発せられる。 
あと 
sndoff 
で再生中の音を終了させる事が出来る。 
	sndload "neko02_01.mid",0,1		;0番にmidiファイルをループ再生登録
	sndload "se02_01.wav",1,0		;1番にwavファイルを通常再生登録
	snd 0					;0番を再生
	button "効果音",*se
	button "消音",*off
	stop

*se
	snd 1					;1番を再生
	stop
*off
	sndoff
	stop
あと注意点として、音を再生している時に、他の音を出すと 
前の音は消えるので注意したい。 
wav再生中にwavやmp3を再生すると前になっていたものは消えてしまう。 
しかしmidiは演奏中にwavやmp3を再生してもmidiはなり続けwavを再生させる事は出来る。 
なんで、音楽は主にmidiを使うといい。 
一応wavやMP3再生中にwavを再生する裏技はあるけどソレはまた次回ってことで。 

もう一つ注意したい事は、midiを演奏して他の曲を演奏したい場合、数秒あけて再生しないと 
音楽が再生できなくなるというエラーがあるからsndoffで音楽を停止し、 
wait20くらいいれた後に次の音楽を流すようにしてくれ。

おおう、使うのは簡単だけど制限が面倒くさいなぁ。 
じゃあ早速作ってみる。 

・・・へっへっへ、できちまったぜ。 
ポーチカさんオリジナルのノベルエンジンがよぉ〜。 
サンプルの「snple02_03.as」を実行してみてくれ。 
	;---------------------------------初期設定
	buffer 2:cls 4				;背景用ウィンドウ
	buffer 3:cls 4				;キャラクター用ウィンドウ
	buffer 4:picload "02_mes_02.bmp"	;メッセージボックス用ウィンドウ
	gsel 0
	sdim txtdata,30000			;テキストデータ読み込み用変数
	sdim gyou,256				;行を読み取る変数
	bload "scenario02_01.txt",txtdata	;変数txtdataにデータを読み込み
	notesel txtdata				;変数txtdataをノートパッド指定
	color 255,255,255

	;---------------------------------コマンドの認識
	repeat
		a=0
		count=0				;行を分解した時の文字数を取得する変数の初期化
		noteget gyou,cnt		;毎回1行を変数gyouに読み込み
		getstr cma,gyou,0,' '		;0桁目から半角スペースまでを変数cmaに取り込み
		count+strsize			;読み取り文字数取得

		if cma="c":a=1:gosub *clik		;クリック待ち処理。
		if cma="k":a=1:gosub *clik:gosub *clear	;クリック待ち後、画面更新。
		if cma="r":a=1:gosub *clear		;画面更新。
		if cma="efe":a=1:gosub *clear		;エフェクトつき画面更新。
		if cma="wit":a=1:gosub *waits		;一時停止。
		if cma="bgm":a=1:gosub *bgm		;バックミュージックを流す。
		if cma="mute":a=1:sndoff		;バックミュージックを流す。
		if cma="se":a=1:gosub *se		;効果音を鳴らす。
		if cma="car":a=1:gosub *chara		;キャラクターデータをロードする。
		if cma="bak":a=1:gosub *back		;背景データをロードする。
		if cma="///":a=1			;注釈文表示用
		if a=0:mes gyou			;コマンドでなかった場合、文字として画面に出力

		if cma="end":end		;コマンドがendの時、プログラムを終了する。
		if cnt=10000:mes "ERROR":stop	;終了命令を入れ忘れた時のためのフリーズ回避ブレーキ
	loop
	;--------------------------------各種サブルーチン

*clik
	repeat
		stick stc,512,1			;右クリックの連射解禁状態に
		if (stc=256)|(stc=512):break	;クリック待ち処理、右クリックはオート状態に
		wait 1
	loop
	return

*clear
	redraw 0					;一時非表示設定
	gmode 0
	pos 0,0:gcopy 2,0,0,640,480			;背景表示
	gmode 2
	pos (640-cx)/2,480-cy:gcopy 3,0,0,cx,cy		;キャラクターを中央に表示
	gmode 4,,,200
	pos 20,310:gmode 4,0,0,200
	gcopy 4,0,0,600,160				;メッセージウィンドウを半透明表示
	if cma="r":redraw 1				;命令がrの時一括表示
	if cma="k":redraw 1				;命令がkの時一括表示
	if cma="efe":gosub *efectr			;命令がefeの時エフェクト表示サブルーチンへ
	pos 40,320					;文字の表示初期位置
	return

*efectr
	efe=0
	repeat 4
		repeat 160
			redraw 1,(cnt*4)+efe,0,1,480
		loop
		efe+1
		wait 5
	loop
	return

*waits
	getstr para,gyou,count		;パラメーター部分を変数paraに読み込み
	int para			;変数paraを数値型に変換
	wait para			;指定された数値分wait
	return

*bgm
	sndoff				;現在流れている音楽を停止する
	wait 20				;すこし待つ
	getstr para,gyou,count		;パラメーター部分を変数paraに読み込み
	sndload para,0,1		;0番のバッファに無限再生としてファイルを読み込む
	snd 0				;音楽再生
	return

*se
	getstr para,gyou,count		;パラメーター部分を変数paraに読み込み
	sndload para,1			;1番のバッファに通常再生としてファイルを読み込む
	snd 1
	return

*chara
	getstr para,gyou,count		;パラメーター部分を変数paraに読み込み
	gsel 3
	if para!"off":picload para		;パラメーターがoffではない時画像をロード
	if para="off":cls 4		;パラメーターがoffの時、画像を消す
	cx=winx:cy=winy			;画面サイズを変数に入れておく
	gsel 0
	return

*back
	getstr para,gyou,count		;パラメーター部分を変数paraに読み込み
	gsel 2
	if para!"off":picload para		;パラメーターがoffではない時画像をロード
	if para="off":cls 4		;パラメーターがoffの時、画像を消す
	gsel 0
	return
右クリックで文章を高速再生できるようにしたよ。

良い感じじゃないか。 
あと選択肢とかセーブとか実装したら完璧だな。
選択肢の作り方は前回やったけどソレを実装させる方法が 
よくわからないのよね。
そうだなぁ。 
次回は細かい設定とかの作り方するか。 
今回はここまで。
次回予告 
じゃあ次回は選択肢とセーブをやってみようか。
セーブってどんな感じ? 
今の状態の画面や変数を一つのデータに保存できるの?
うーん、そう便利な機能でもないんだ。 
基本的に一つの変数を一つデータにしか保存できない。 
しかしその一つのデータの中にあらゆるデータを入れる方法もある。 
まぁ詳しいことは次回さ。
難しそうだなぁ。
今までの知識でどうにでもなる程度だ。 
問題ない。 
しかし次回で終わらせたいのにまだやりたい事多いんだよなぁ。 
次回はエンジンに実装するものを箇条書きして簡潔に完結させるか 
二回にわけてじっくりやるかは 
じゆうだー。
自由じゃねえし!
でも他のジャンル早くやりたいし、 
でもじっくり書いたほうが私わかりやすいし。 
次はたっぷりじっくりな方向で。
無茶いうなよ。 
じゃ、また次回な!
・・・・あれ? 
今回バイオレンスは無し!?
今日はここまで。
 
 
今回のまとめ 
bload p1,p2 
p1で指定ファイルの中身をp2変数の中に入れる。 
ファイルがテキストデータの場合その内容を表示する事が簡単で便利。 
ロードしたデータを入れる変数はあらかじめそのファイルが入るだけの 
サイズをsdimで確保しておく必要がある。 
	sdim data,1000			;ロードするための変数の用意
	bload "gaibu02_01.txt",data	;ファイルをロード
	mes data			;内容を表示してみる
	stop
 
notesel p1 
p1で指定した変数に対しノートパッド命令を使えるようにする。 
ノートパッド命令は主にテキストデータを処理する時に使う。 

noteget p1,p2 
noteselで指定した変数から指定行の内容を抜き出す。 
p2で抜き出す行を指定し、p1にその内容を入れる。 
行数は1ではなく0から始まるので注意。 

notemax p1 
noteselで指定した変数の内容は何行まであるか調べる。 
p1に結果を出す変数を入れる。 

	sdim data,1000
	data="古池や\n蛙ぶちこむ\n水の音"	;\nを入れると改行される。
	mes data				;内容を出力してみる。
	notesel data				;変数dataをノートパッド処理指定
	noteget naka,1				;変数nakaに変数dataの二行目を抜き出す。
	notemax gyou				;変数gyouに変数dataの最大行数を取得しいれる。
	mes "notegetで抜き出した文字は「"+naka+"」"	;抜き出したデータを出力
	mes "変数dataは"+gyou+"行まである。"		;行数の表示
	stop
 
getstr p1,p2,p3,p4 
文章の指定した列から指定した記号までの間の文字を抜き出す。 
p2に文章の入った変数、そしてp1に結果を入れる変数を記入。 
p3に検索開始位置を入れ、p4に検索終了の記号を「'」でくくって入れる。 
抜き出した文字の長さ+終了記号の文字数はシステム変数strsizeに代入される。 
	sdim data,1000
	data="古池や,蛙ぶちこむ,水の音"		;「,」で文章を区切ってみる。
	mes data
	getstr naka,data,0,','			;0列目から「,」が有る所までを変数nakaに入れる。
	mozi=strsize				;抜き出した文字数はシステム変数strsizeに入っている。				
	mes "最初の区切りまでの文字は="+naka	;抜き出した文字を表示してみる。

	getstr naka,data,mozi,','		;さきほど抜き出した文字数から検索を開始してみる。
	mes "最初の区切りまでの文字は="+naka	;抜き出した文字を表示してみる。
	stop
 
sndload p1,p2,p3 
サウンドデータを指定したバッファに読み込む。 
p1に読み込むデータ 
p2に読み込み先のバッファ、0〜255 
p3に再生モードを入れる。 
モードは 
0 通常再生。効果音とかに使える。 
1 ループ再生。バックミュージックとかに使える。 
2 再生終了まで待つ。再生が終わるまで次の命令を実行しない。 
この命令ではデータを読み込むだけで再生はされない。 
ロードできるデータの種類は、 
wav(非圧縮) 
midi 
mp3 
ASF 
AVI 
MPG 
CD 

snd p1 
sndloadで指定したバッファに読み込んだサウンドデータを再生する。 
p1にバッファを入れる。 
midiを再生中にwavやmp3を再生する事は出来るが、 
wavを再生中にwavやmp3を再生すると今鳴っている音は終了する。 

sndoff 
再生中のサウンドを停止する。 
midiは再生中に新しいデータを急遽再生するとフリーズする恐れがあるため、 
sndoffで再生を停止し、wait命令などで20ほど待った後に他のmidiを再生する 
ようにしよう。 
	sndload "neko02_01.mid",0,1		;0番にmidiファイルをループ再生登録
	sndload "se02_01.wav",1,0		;1番にwavファイルを通常再生登録
	snd 0					;0番を再生
	button "効果音",*se
	button "消音",*off
	stop

*se
	snd 1					;1番を再生
	stop
*off
	sndoff
	stop
 

int p1 
文字列型変数を数値型変数に変換する。 

str p1 
数値型変数を文字列型変数に変換する。 
	a=123		;変数aに123という数字を入れる
	b="456"		;変数bに456という文字を入れる
	int b		;変数bの文字を数字に変換する
	str a		;変数aの数字を文字に変換する
	a=a+456		;計算
	b=b+123
	mes a		;結果の出力
	mes b
	stop
 

もどる