2023年09月30日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第18回
3Dダンジョンロールプレイングゲーム第18回目です。
BGM演奏に、当初はASCIIの「MuSICA」を利用予定でしたが、思った以上にメモリが厳しいので、「簡易BGMプレイヤー」を利用したBGMに変更します。(2023年5月20日記事参照「3Dダンジョン」)
Windowsでの製作が長かったので、メモリを節約すると言う事を忘れていました...。
BGMの演奏には、Laboratoryテーマ10「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」でやったとおり、「走査線割込み」を利用します。
事前にLaboratoryで走査線割込みのサンプルプログラムを作ったので今は大丈夫ですが、最初、走査線割込みの知識をすっかり忘れていて、何すればいいんだっけ!?状態でした。
…と言う訳で、上手くいくのか心配だったので、もっと後の方の予定だったBGM演奏を前倒しします。
BASIC、マシン語プログラム共にLaboratoryテーマ10「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」での追加分を組み込んで実行。
BASIC部
マシン語部
BGMは、過去に製作した迷宮アクションゲームの「TOWER」のBGMを再利用しております。
ちょうど雰囲気的にもよいかと…。
よし、問題なくBGMが鳴りました。
そう言えば、メモリマップにBGMデータ領域を用意するのを忘れてた…。
&HA800~&HAFFFまでが空いていたので、そこの&HA800〜&HA855をBGMデータ領域にしています。
2023年09月29日
Laboratoryテーマ10「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」
さて、今回はLaboratoryテーマ10「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」です。
MSXには「走査線割り込み」と言う機能があります。
「走査線割り込み」は簡単に言うと、プログラム実行中でも凡そ1/60秒毎に割り込みが掛かり、別処理を走らせる事が出来る機能です。
1/60秒毎と一定間隔なので、タイマーやBGM演奏などに使われます。
別処理が終わると、実行中プログラムの中断した位置から再開します。
今回は以前に公開した、Laboratoryテーマ6「自機に向かって飛んでくる敵弾」と、Laboratoryテーマ14「簡単にBGMを鳴らしたい」のサンプルプログラムを合体させ、ゲーム中にBGMを演奏させてみます。
流石にシューティングゲームのBGMに、「カエルの歌」はなかなかシュールです。
「IITVLSMPL.BAS」【ダウンロード】
STSMPL.BASへの追加分のみ掲載します。
マシン語のサンプルです。
起動すると、ITVLSMPL.BINを作成します。
「BINSET.BAS」【ダウンロード】
STSMPL.BINへの追加分のみ掲載します。
走査線割り込みがされると、特定のアドレス(&HFD9F)がコールされます。
&HFD9F~&HFDA3の5バイトが走査線割込み時の命令格納エリアとなっているので、ここにBGM演奏ルーチン部へのコール命令を設定する事で、走査線割り込みでBGMを演奏する事が出来ます。
因みに、通常はリターン(&HC9)のみ設定されています。
プログラムは、「走査線割り込み初期処理」(&HC310)、「走査線割り込み終了処理」(&HC338)、「割り込みBGM演奏処理」(&HC348)の3つに分かれます。
「走査線割り込み初期処理」は、BGM演奏開始前に一度実行して下さい。
走査線割込み時の命令格納エリアの内容を退避します。
これは周辺機器が取り付けられていたりすると、走査線割込み時の命令格納エリアに既に別処理が設定されている可能性があるためです。
「走査線割り込み終了処理」は、BGM演奏終了時に一度実行してください。
退避した走査線割込み時の命令格納エリアの内容を戻します。
「割り込みBGM演奏処理」は、ルーチン開始時に全てのレジスタを退避(PUSH)し、終了時に戻し(POP)ます。
通常のプログラム処理と、割り込み処理で同じレジスタを使うので、割り込み内でレジスタ変更すると、通常プログラムにも反映されてしまい、必ずバグるので忘れないように。
2023年09月28日
Laboratoryテーマのタイトル変更
Laboratoryテーマ10「スクロールシューティング等で、処理が重いためスクロールの際、他のキャラクタの動きがガクガクする」について、タイトルを変更します。
このテーマは、シューティングゲームで自機の移動中、他の重い処理(スクロール等)が実行されると、その間、一瞬自機の動きが遅くなります。
スクロールの度にガクッガクッとなるので、物凄い違和感があります。
その違和感を解消するために、「走査線割り込み」機能を使おうと言う内容でした。
「走査線割り込み」は簡単に言うと、プログラム実行中でも凡そ1/60秒毎に割り込みが掛かり、別処理を走らせる事が出来ます。
その処理終了後、中断したプログラムを再開する機能です。
時間が一定なので、タイマーやBGM演奏などによく使われます。
シューティングゲームよりも先に、「ゲーム製作」の3DダンジョンロールプレイングゲームのBGM演奏で使いたいので、テーマタイトルを「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」に変更します。
テーマ | ||||
10 | マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい |
2023年09月27日
通産省情報処理検定試験1級
専門学校も、冬に差し掛かる頃、「通産省情報処理検定試験1級」の資格試験がありました。
これは、以前受けた「日商簿記検定試験3級」と同様、「第二種情報処理技術者資格」を取得できなかった生徒のために、何らかの資格を取らせるといった学校側の方針です。(2023年9月2日記事参照「日商簿記検定試験3級」)
私は「第二種情報処理技術者試験」受かったのに、なぜこの資格試験を受けたのか?(2023年9月25日記事参照「第二種情報処理技術者資格」)
そう、「第二種情報処理技術者試験」の合格発表前に申し込みがあったんです…。
既にお金も払い終わっているので、受けないともったいないという事で、私以外の合格者も皆受けてました。
試験内容は、「第二種情報処理技術者試験」に比べれば、簡単カンタン…。
無事、合格しました。
これが終わると、いよいよ春の「第一種情報処理技術者試験」に主軸を移した授業になるのでした。
2023年09月26日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第17回
3Dダンジョンロールプレイングゲーム第17回目です。
今回はタイトル画面に「NEW GAME」/「CONTINUE」のメニュー選択を実装します。
「NEW GAME」選択時は、オープニング開始。
「CONTINUE」選択時は、新たな選択ウィンドウが開き、セーブファイル選択となります。
セーブファイル数ですが、小さなゲームなので1つでいいかなとも思ったのですが、メニュー選択のサンプルも兼ねているのでとりあえず3ファイル位選べるようにすればいいかな?
基本的にファイル操作はBASICに戻って実行します。
よって、マシン語でメニュー選択し、任意アドレス(今回は&HD015)に選択結果を書き込み、BASIC部へ戻る。
バックアップファイルから読み込んで、ゲーム実行。
と言う、処理の流れとなります。
メニュー選択は、Laboratoryテーマ23「選択肢メニューを開いて、選択したい」で製作した「メニュー選択」を利用します。
「NEW GAME」でオープニング開始はOK。
仮のセーブファイル(FILE1〜3.SAV)を用意し、「CONTINUE」でゲーム開始するか動作テスト。
こちらも動作OKですね。
スクリプトを使わないメニュー選択の利用方法です。
赤枠にメッセージデータ先頭アドレスを代入しコールすると、選択ウィンドウが開き、メニュー選択できます。
因みに、メッセージデータは&HC988〜&HC98Fが「NEW GAME」、&HC990~&HC997が「CONTINUE」、&HC998~&HC99Cが「FILE1」、&HC99D~&HC9A1が「FILE2」、&HC9A2~&HC9A6が「FILE3」です。
2023年09月25日
第二種情報処理技術者資格
専門学校も、秋に差し掛かる頃…。
「第二種情報処理技術者資格」を取得するための授業がラストスパートに入りました。
この当時、情報処理技術者資格は4種類あって「第二種」、「第一種」、「特種」、「監査」がありました。
「第二種」は年2回試験実施、春秋に試験があります。
4月に入学して半年で試験て…、なかなかハードです。
合格率は当時で18〜20%と言われていました。
「第一種」の方の合格率は14〜15%なので、まだ楽…んー?
学校では、過去問の成績順にクラス替えが実施されました。
1年生6組中、1〜2組が合格、3組が合格圏内、4組以降が要学習クラスでした。
私は2組で合格クラスでした。
資格試験は、1部と2部に分かれており、1部が「情報処理の知識」及び「一般教養」、2部が「プログラム知識」です。
学校での「第二種情報処理技術者資格」を取るための授業は、1部の過去の出題傾向から必ず出るであろう問題がピックアップされ、それを解説する形の授業でした。
出題率の低い問題は無視。
なかなかにシビアです。
まぁ、半年で素人に合格させようと思ったら、そのくらいしないと無理でしょうしね…。
試験が近付くにつれ、過去問を解く授業ばかり。
因みに過去問の私の成績、1部は7割合格ってとこでした。
合格基準点をいまいち覚えていませんが、「情報処理の知識」で足りない点数を「一般教養」で稼がないといけません。
ここは数学や英語の一般教養になるので、もう出題の運だけ。
得意分野が出ることを祈るだけ…。
2部は毎回ほぼ満点でした。
いよいよ試験日、緊張しました。
日頃の勉強の賜物、思ったよりもサクサク解くことが出来ました。
結果は…、合格でした!
2023年09月24日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第16回
3Dダンジョンロールプレイングゲーム第16回目です。
ゲームの雰囲気を高めるため、なぜ3Dダンジョンに挑むのかの説明を兼ねた、簡単なオープニングを作ります。
オープニングの実装には、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」で製作した、独自スクリプト付の「メッセージウィンドウ」を利用します。
まずはタイトル画面(上図)を表示し、「PUSH SPACE」でボタンを押したコントローラーを、操作コントローラーとして登録し、以降そのコントローラーでのみ操作可能とします。
次に、オープニング表示。
「MESSET.BAS」でメッセージデータを作成します。
今回は、ありきたりで単純なストーリーにしておきます。
タイトル画面とオープニングだけで、グッとゲームらしくなりました!
スクリプトを使わないメッセージウィンドウの利用方法です。
赤枠にイベントb代入しコールすると、イベントのフラグ値に応じたメッセージbフメッセージが表示されます。
2023年09月23日
Laboratoryテーマ23「選択肢メニューを開いて、選択したい」そのB
さて、今回はLaboratoryテーマ23「選択肢メニューを開いて、選択したい」そのBです。
ゲーム中のメニュー選択と言えば、まずはロールプレイングゲームの「お店」系がすぐ思い浮かびます。
ドラクエだと、「武器屋」、「防具屋」、「道具屋」、「宿屋」、「協会」あたりでしょうか。
後は、自分の装備変更、アイテム・魔法使用時ですね。
他には、アドベンチャーゲームのコマンド選択ですかね?
今回は、このロールプレイングゲームで使う「アイテムデータ」を、レイアウトに合わせて作成するツールを公開します。
ITMSET.BAS【ダウンロード】
使い方はサンプルに倣って、DATA文にメッセージを入力し「RUN」実行するだけです。
データレイアウトは下記となります。
【 レイアウト 】
アイテム区分,アイテム名称,価格,効果1,効果2,効果3,
アイテム区分,アイテム名称,価格,効果1,効果2,効果3,
:
アイテム区分,アイテム名称,価格,効果1,効果2,効果3,
データ終了(END)
区分 | アイテム種 | 効果1 | 効果2 | 効果3 |
0 | 武器 | 攻撃力 | 防御力 | 素早さ |
1 | 防具 | |||
2 | 体防具 | |||
3 | 頭防具 | |||
9 | 道具 | 体力回復値 | 魔力回復値 | 状態異常回復 |
効果1〜3は、0〜10,000の範囲で設定します。
なぜ、上限が10,000かと言うと、防御力で説明すると「総防御力(50,000)=自分の防御力(20,000)+装備の防御力(防具10,000+体防具10,000+頭防具10,000)」となるので、各々値にあまり大きな値を設定すると16ビットの上限、65535を超えてしまうからです。
これらの項目は、参考ですので必要に応じて増やしてください。
2023年09月22日
Laboratoryテーマ23「選択肢メニューを開いて、選択したい」そのA
さて、今回はLaboratoryテーマ23「選択肢メニューを開いて、選択したい」そのAです。
前回公開したサンプルの、スクリプトの書き方を説明します。
まず、YN命令。
記述:
YN,y,x,m1,m2,m3 |
因数の説明:
y,x | 選択ウィンドウ表示座標 |
m1 | キャンセル時メッセージ |
m2 | はい選択時メッセージ |
m3 | いいえ選択時メッセージ |
例:座標(2,2)に「はい/いいえ」の選択ウィンドウを開き、キャンセルならメッセージ4を、「はい」ならメッセージ5を、「いいえ」ならメッセージ6を表示する。
1 | 0,1,"げんきかい?",2,"YN,2,2,4,5,6" |
2 | 1,"はい ",2 |
3 | 1,"いいえ",2 |
4 | 1,"むしすんなよ!",2 |
5 | 1,"そりゃよかった!",2 |
6 | 1,"おだいじに。",2 |
メッセージ長は3桁固定ですが、「はい」と「いいえ」のメッセージも変更可能ですので、2択なら「SW命令」よりも「YN命令」を使う方が効率良いです。例えば、「あか/あお」、「けす/つける」等。
次に、SW命令。
SW命令は項目を選択するだけですので、SS命令やCF命令と組み合わせて使います。
記述:
SW,y,x,x2,y2,n |
因数の説明:
y,x | 選択ウィンドウ表示座標 |
x2 | ウィンドウ幅 |
y2 | ウィンドウ行数 |
n | 選択項目数 |
例:座標(2,2)に選択項目を7項目選択できるウィンドウを開き選択する。
1 | 0,1,"だいじなものは?",2,"SW,2,2,6,7,7" |
2 | 1,"いのち ",2 |
3 | 1,"おかね ",2 |
4 | 1,"きぼう",2 |
5 | 1,"ゆめ ",2 |
6 | 1,"かぞく",2 |
7 | 1,"しごと",2 |
8 | 1,"なかま ",2 |
選択項目のメッセージ長は揃えてください。
今回は最長が4桁なので、4桁に揃えてあります。
ウィンドウの幅は、4+2の6で設定してあります。
今回のテーマ、選択とは関係ありませんが、SW命令だけでは使い物にならないので、活用するためにSS命令とCF命令も説明します。
まず、SS命令。
SW命令での選択値をイベントのフラグ値に設定します。(SW命令でキャンセル時は「0」が入ります。)
要するに、イベントのフラグ値を変数として扱います。
記述:
SS,e |
因数の説明:
e | 設定するイベント |
次に、CF命令。
イベントのフラグ値に応じたメッセージbヨ飛ぶ。
記述:
CF,e,m0,m1,m2,... |
因数の説明:
e | 参照するイベント |
m0 | フラグ値0時のメッセージ |
m1 | フラグ値1時のメッセージ |
m2 | フラグ値2時のメッセージ |
例:じゃんけんをする。(選択値をイベント5のフラグ値に設定し、イベント5のフラグ値を参照し、メッセージを表示する。)
1 | 0,1,"じゃんけん…",2,"SW,2,2,5,3,3:SS,5:JP,5" |
2 | 1,"グー",2 |
3 | 1,"チョキ",2 |
4 | 1,"パー",2 |
5 | 1,"ポン! グー!",2,"CF,5,9,6,7,8" |
6 | 1,"あいこだ!",2 |
7 | 1,"まけた…",2 |
8 | 1,"かったー!!",2 |
9 | 1,"やらないのかよ…。",2 |
その他の命令も順次説明していきますね。
2023年09月21日
Laboratoryテーマ23「選択肢メニューを開いて、選択したい」その@
さて、今回はLaboratoryテーマ23「選択肢メニューを開いて、選択したい」その@です。
「ゲーム製作」カテゴリで制作中の3Dダンジョンロールプレイングゲームで利用する、ドラクエ風メッセージウィンドウで、メニューを開いて選択処理を実装します。
前回独自スクリプトを組み込むと書きましたが、今回のサンプルには既に多くの命令を組み込んであります。
その中で、メニュー選択を伴う命令、「はい/いいえ」(YN命令)と、「複数メニュー選択」(SW命令)を使ったサンプルとなっています。
「はい/いいえ」はそのまま、2択のメニュー選択となります。
「複数メニュー選択」は、任意数でのメニュー選択で、選択肢が多くウィンドウに収まらない選択肢は上下スクロールして表示されます。(上図)
詳しくはサンプルプログラムで機能デモをしていますのでご覧ください。
メッセージデータは、前回公開した「メッセージエディタ」を利用します。
スクリプト部の「YN」(185行)、「SW」(255行)命令の次のメッセージからが選択肢となります。
「YN」は、2メッセージ分(190、200行)、「SW」は任意メッセージ分(選択肢数11項目、260〜360行)となります。
注意事項ですが、選択項目の桁数は必ず合わせてください。(280行の「あらいぐま」が6桁で最長なのでそれに合わせてあります。)
この時「SW」のウィンドウ幅は、6+2(選択カーソル+空白)の8を設定してください。
「YN」は3桁固定です。
「MSELSMPL.BAS」【ダウンロード】
メニュー選択の機能を紹介するデモが実行されます。
マシン語のサンプルです。
起動すると、MSELSMPL.BINを作成します。
「MSELSMPL.BAS」【ダウンロード】
スクリプトの大半を実装済みですので、かなり長いサンプルとなっています。
今回のテーマのメニュー選択部分は、実質1,270行〜1,980行となっています。
前回説明した独自スクリプトで一部、引数を変更したものもありますので、また後日改めて説明します。