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月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月24日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第16回
3Dダンジョンロールプレイングゲーム第16回目です。
ゲームの雰囲気を高めるため、なぜ3Dダンジョンに挑むのかの説明を兼ねた、簡単なオープニングを作ります。
オープニングの実装には、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」で製作した、独自スクリプト付の「メッセージウィンドウ」を利用します。
まずはタイトル画面(上図)を表示し、「PUSH SPACE」でボタンを押したコントローラーを、操作コントローラーとして登録し、以降そのコントローラーでのみ操作可能とします。
次に、オープニング表示。
「MESSET.BAS」でメッセージデータを作成します。
今回は、ありきたりで単純なストーリーにしておきます。
タイトル画面とオープニングだけで、グッとゲームらしくなりました!
スクリプトを使わないメッセージウィンドウの利用方法です。
赤枠にイベントb代入しコールすると、イベントのフラグ値に応じたメッセージbフメッセージが表示されます。
2023年09月18日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第15回
3Dダンジョンロールプレイングゲーム第15回目です。
今回は、いよいよ3Dマップの中をウロウロできるようにします。
これが出来れば、ゴール判定付ければ3D迷路ゲームなら完成ですね。
更に上下階段付けて、「MAP8 EDITOR」で2Dマップを立体迷路にすれば、高難度迷路の出来上がりです。
では、今回はキー入力処理と言う事で、BIOSの「GTSTCK」(&H00D5)を利用します。
Aレジスタにジョイスティック番号(0:キーボード、1:ジョイステックPORT1、2:ジョイスティックPORT2)を入れてコールすると、Aレジスタに押された方向値(BASICのSTICK関数と同じ値)が入ります。
今作のキー操作は下記の通りとします。
キー | 行動 |
↑ | 向いている方向に前進 |
→ | 向いている方向に対して、右を向く |
↓ | 向いている方向に対して、後ろを向く |
← | 向いている方向に対して、左を向く |
「↑」が押された時だけ、向きに合わせて移動。
それ以外は向きを変えるだけになります。
凄く単純な操作なのでロジックも短いです。
方向は4方向なので、方向転換に下位2ビット(0〜3)のビット操作を使い、ロジックの短縮化を図っています。
移動が「↑」だけなので、正面が壁なら移動できないようにするだけなので楽です。
無駄なこと結構しているにも拘らず、3D描画が早すぎて思ったとこに停まれなかったので、1移動ごとにキーリピートをかけました。(移動後1回移動キーを離さないと、次の移動が出来ない。)
BASIC部です。
今はまだ製作途中で、値を変更することもあるので初期変数をREAD、POKEしています(500行以降)が、完成したらこれも初期値という事でファイル化し(拡張子「.INI」)BLOADします。
上中段と下段で別のフォント(上中段:ダンジョン用FONT、下段:メッセージ用FONT)を設定しています。(2023年9月13日記事参照「Laboratoryテーマ25「SCREEN2のグラフィックをFONTデータにして扱いたい」」)
ここまで「ダウンロード」
プログラムは、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@のサンプルプログラムに、3Dロールプレイングゲームの追加分を足しています。
今後、メッセージ表示部にメニュー選択ロジックが追加されたら、3Dロールプレイングゲーム部を後ろにズラシます。
2023年09月16日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第14回
3Dダンジョンロールプレイングゲーム第14回目です。
今回はダンジョン描画があまりにもチープなので、もう少しだけマシにしてみます。
まぁ、まだ本格的なものを作るわけではないのでこれでもいいのですが、あまりにもチープすぎて…。
MSX1の画像能力なので、すごいことは出来ませんが、ちょうど「FONT EDITOR」のマウスが使えなかった時に、とりあえずで描いたものですので、もう少しなら何とかなるかな?と…。
今回はこんなところでヨシとします。
まぁ、雰囲気的な物は出せたかな?と、思います。
後は気が向いたらもう少し描き込みます。
本格的に作るのなら、上段と中段別々にFONTを用意した方が綺麗になります。
何なら実際の洞窟画像をキャプチャしてもいいかも。(FONT足りないか…。)
昔なら考えられなかった手法が、今なら当たり前に使えてしまう…。
では、次回は3Dマップの中を歩かせます。
併せて、途中経過プログラムを公開しますね。
2023年09月09日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第13回
3Dダンジョンロールプレイングゲーム第13回目です。
今回は遂に、3D表示のプログラミングに挑戦します。
前々々回(【ゲーム制作】3Dダンジョンロールプレイングゲーム 第10回)に書いたロジック通りに、前回設定した表示ワークの地形を描画します。
これはもう簡単。
条件に従って表示ロジックを記述していくだけです。
気を付けなければいけないのは一カ所だけ。
正面Dに壁があった時、Vだけでなく、その両サイドUとWの壁も描画し、T描画のロジックへ飛ぶくらいですね。
壁の描画はLaboratoryテーマ15「任意サイズのFONTキャラクタを指定座標に表示させたい」のサブルーチンで描画します。
前回同様各向きで描画してみました。
期待通りの動きです、問題なしですね。
マウスが使えなかった時に、とりあえずで作成したFONTなのでチープです。
では、次回は描画が非常にチープなのでもう少し(ほんの少し)見栄え良くしてみます。
2023年09月06日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第12回
3Dダンジョンロールプレイングゲーム第12回目です。
随分久しぶりになってしまいました。
Laboratoryテーマ23「コマンドを選択肢メニューを開いて、選択したい」のサンプル作りにてこずっておりまして、時間だけが過ぎていく…。
まぁ、おかげで「MSX回顧録」、だいぶ進めることが出来ましたが…。
さて、今回は3D表示のプログラミングに挑戦します。
前々々回(【ゲーム制作】3Dダンジョンロールプレイングゲーム 第9回)で考えたロジック通り、@〜Gの表示ワークへセットするプログラムを作ります。
これ、BASICの配列変数を使えれば簡単にできるんですが、マシン語にはそんな便利な機能はありません。
ただ、考え方は配列変数の考え方がそのまま使えます。
BASICですと、配列変数にマップデータを代入(MAP(21,21))し、自機のX座標、Y座標をそれぞれ変数X、Yとすると、X、Yを起点に、調べたい座標位置に加減算をします。
例えば、上向きの場合、@=MAP(X-1,Y-2)、A=MAP(X,Y-2)…と言った感じです。
簡単ですね。
それをマシン語で実現するためには、この加減算値でデータベースを作成します。(8ワーク×4方向×X/Y=64バイト)
XとYの加減算値は-2〜2の5つしかないので、容量節約のためにBレジスタ上4桁をX加減算値、下4桁をY加減算値とします。
これで、容量を半分に削れました。(8ワーク×4方向=32バイト)
先ほどの加減算値のルール通り変換しました。
データベース登録完了したら、向きにより自動でデータベースアドレスを算出し、データベースから加減算値を取得し、マップデータから地形データを読んでワークに設定するマシン語サブルーチンを作ります。
&HC370からは、Bレジスタに加減算値を代入しコールすると、マップデータ上の自分の位置+加減算値のアドレスを計算し、Aレジスタにその座標のキャラクタコードが返されるルーチンです。
&HC3B8は、向きによってデータベースアドレスを算出し、データベースを読んで8つ分ワークへ地形データを設定するルーチンです。
各向きで読み込んだキャラクタコードを表示してみました。
期待通りの動きです、問題なしですね。
では、次回は3D表示のプログラミングです。
2023年08月23日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第11回
3Dダンジョンロールプレイングゲーム第11回目です。
今回は3D表示のプログラミングに挑戦する予定だったのですが、ゲーム製作久しぶりすぎて、最初にやらなくてはならない事を忘れていました。
メモリマップの作成です。
ゲームを製作する時には、ツールを使うなりして各種データを作成し、最後すべて読み込んで1本のゲームにします。
と、いう事は、それぞれのデータの保存アドレスが重ならないように、データ保存する必要があります。(若しくは読込先アドレスを変更する。)
しかも、ロールプレイングゲームは、データの種類が多いジャンルです。
・マップデータ
・イベントデータ
・メッセージデータ
・アイテムデータ
等々…。
これらが重ならないように事前にデータ量と範囲を決めておく必要があります。
今回の3Dロールプレイングゲームのメモリマップは、現状下記としました。
アドレス | データ名 | 備考 |
A000〜A1B8 | 2Dマップデータ | 21マス×21マス=441バイト |
A200〜A7FF | 壁キャラクタデータ | 前回から保存先アドレス変更 |
A800〜AFFF | 空き | |
B000〜B7FF | フォントキャラクタデータ | 256キャラ×縦8バイト=2,048バイト |
B800〜BFFF | フォントカラーデータ | 256キャラ×縦8バイト=2,048バイト |
C000〜CFFF | マシン語エリア | |
D000〜D0FF | 変数エリア | |
D100〜DFFF | メッセージデータエリア | アイテムデータも含む |
ゲームの種類によっては、各面の最初にフォントを設定してしまえばフォントデータのエリアは不要なのですが、ロールプレイングゲームの場合は、敵キャラフォントを毎回読み込む必要があるので、読込先エリアとして空けておく必要があります。
うーん、キツキツですね。
MSX2以降だと、データをVRAMに保存してといったことが可能なのですが、MSX1だと厳しいです…。
メッセージ表示ルーチンとか、選択ルーチンとかは、かなり巨大なサブルーチンだけど、マシン語エリア(&HC000〜&HCFFF)に収まるのか?
因みに、タイトル背景の「Devils Busters」製作中にメモリ不足に悩まされて、ロールプレイングゲーム製作止めた過去があります…。(2023年4月14日記事参照「ブログタイトル画像更新」)
とりあえず、今のところはこれだけ決めておけば大丈夫です。
これに合わせて、各データの保存先アドレスを変更しておきます。
では、次回こそ、3D表示のプログラミングをしましょう。
2023年08月20日
MAP16 EDITOR 活用方法A
「MAP16 EDITOR」で作ったデータの活用方法、そのAです。
「MAP16 EDITOR」の最大のメリットは、「MAP8 EDITOR」に比べ、同じメモリ容量で4倍の広さのマップを表示できるところです。
あと、通常ゲームの基本となる16×16キャラクタを配置するのが「MAP8 EDITOR」では、かなり面倒ですが、「MAP16 EDITOR」だと簡単です。
前回、「MAP16 EDITOR」で作成したデータの、全画面キャラクタスクロール(16ドット)版のサンプルを公開しました。
そのサンプルでも、スクロールしない画面切り替え型のパズルゲームや、アクションゲーム等には問題なく使えます。
ただ、やはりドラクエタイプのロールプレイングゲームが作りたいと思った時、最低でも1FONTスクロール(8ドット)であって欲しいですよね。
と言う訳で、今回は表示範囲指定可能な8ドットスクロール版のサンプルを公開します。
「M16SMPL2.BAS」【ダウンロード】
自作プログラムに組み込むには、下記の部分が必要です。
8ドットずらして表示するためには、各アドレスに任意の値をセットしてサブルーチンコールして下さい。
このプログラムでは、最も時間のかかるであろうマップ表示部分をマシン語で組んでいます。
「MAP16SC8.BIN」(70行)
下記機能を提供します。
マシン語アドレスを変えたい人用に、MAP16SC8.BIN作成用のBASICプログラムを用意しました。
起動すると、MAP16SC8.BINを作成します。
「MAP16SC8.BAS」【ダウンロード】
いやはや、なかなかに苦労しました…。
昔に「MAP16 EDITOR」で作成したマップデータを使って作っていたゲームは、全画面のドラクエタイプのロールプレイングゲームでした。
だから気付きませんでしたが、上下スクロールで8ドットずらして表示した時、表示範囲の上下に残りの8ドット分が表示されてしまうバグがなかなか直らず、苦労しました。
おかげでマップ表示のロジック結構長くなったなぁ…。
まぁ、あまり時間かけてる余裕がなかったので、短縮化は図っていません。
「MAP16 EDITOR」の最大のメリットは、「MAP8 EDITOR」に比べ、同じメモリ容量で4倍の広さのマップを表示できるところです。
あと、通常ゲームの基本となる16×16キャラクタを配置するのが「MAP8 EDITOR」では、かなり面倒ですが、「MAP16 EDITOR」だと簡単です。
前回、「MAP16 EDITOR」で作成したデータの、全画面キャラクタスクロール(16ドット)版のサンプルを公開しました。
そのサンプルでも、スクロールしない画面切り替え型のパズルゲームや、アクションゲーム等には問題なく使えます。
ただ、やはりドラクエタイプのロールプレイングゲームが作りたいと思った時、最低でも1FONTスクロール(8ドット)であって欲しいですよね。
と言う訳で、今回は表示範囲指定可能な8ドットスクロール版のサンプルを公開します。
「M16SMPL2.BAS」【ダウンロード】
自作プログラムに組み込むには、下記の部分が必要です。
行番号 | 内容 | 説明 |
70 | MAP16SC8.BIN | FONT単位マップ表示マシン語プログラム |
160〜230 | マップ表示値指定 | 画面に表示する際の座標と、表示する縦横幅、マップ全体の縦横幅、表示する左上の座標を指定 |
300 | マップ表示サブルーチン | マップ表示値を指定し、300行のサブルーチンをコールするとマップを表示するサブルーチン |
8ドットずらして表示するためには、各アドレスに任意の値をセットしてサブルーチンコールして下さい。
方向 | アドレス | 設定値 |
上 | &HC004 | &HFF |
右 | &HC005 | &H01 |
下 | &HC004 | &H01 |
左 | &HC005 | &HFF |
このプログラムでは、最も時間のかかるであろうマップ表示部分をマシン語で組んでいます。
「MAP16SC8.BIN」(70行)
下記機能を提供します。
実行アドレス | 機能 | 詳細 |
&HC0E8 | マップ表示 | 指定されたマップ表示値から表示される先頭アドレスを算出しマップを表示する 最大16キャラクタ×12キャラクタ |
マシン語アドレスを変えたい人用に、MAP16SC8.BIN作成用のBASICプログラムを用意しました。
起動すると、MAP16SC8.BINを作成します。
「MAP16SC8.BAS」【ダウンロード】
いやはや、なかなかに苦労しました…。
昔に「MAP16 EDITOR」で作成したマップデータを使って作っていたゲームは、全画面のドラクエタイプのロールプレイングゲームでした。
だから気付きませんでしたが、上下スクロールで8ドットずらして表示した時、表示範囲の上下に残りの8ドット分が表示されてしまうバグがなかなか直らず、苦労しました。
おかげでマップ表示のロジック結構長くなったなぁ…。
まぁ、あまり時間かけてる余裕がなかったので、短縮化は図っていません。
2023年08月17日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第10回
3Dダンジョンロールプレイングゲーム第10回目です。
今回は、前回設定した表示ワークの内容を表示する順番と条件を考えます。
以前に書いたパターン番号で説明します。
プレイヤーに近い順に壁があるパターンを優先して描画していきます。
まず、Vのパターン。
1歩前に壁があるパターン。
この場合は、UVWを壁描画し、X描画に飛びます。
次、2歩前が壁があるパターン。
あとは、壁がないパターン。
次はWのパターン。
1歩前右に壁があるパターン。
あとは、壁がないパターン。
次はUのパターン。
Wのパターンの左右逆に同じです。
次はXのパターン。
左に壁があるパターン。
壁描画し、T描画に飛びます。
左に壁がなく、その1歩前に壁があるパターン。
あとは、壁がないパターン。
最後Tのパターン。
Xのパターンの左右逆に同じです。
描画条件、描画順も、ほぼこのままで大丈夫です。
それ以外のパターンは、ダンジョンの構造上発生しません。
と言うか、発生しないような構造にしました。(奇数行と奇数列を壁とするダンジョン。)
次回は、今回考えたロジックに則った描画ルーチンを組みます。