2023年11月24日
メモリの問題
今回MSX1でロールプレイングゲーム作って、改めて感じましたがやはりメモリが厳しい…。
DISK-BASICだと約23kバイトくらいしか使えない…。
まぁ、FONT読込用に4kバイト(&HB000~&HBFFF)空けてるから、そこがまだ使えると言えば使えますが…。
うーん、そう言えばファミコン版の「ドラクエ」ROM容量が64Kだったかと思います。
MSX1版の容量って、どなたかご存じでしょうか?
32kバイト程度だったなら、凄いけど…。
マップスクロールの歪さから察するに、マップデータ圧縮かけて、展開しながら描いてるっぽいですね。
やむを得ないけど、なんかすごい違和感のあるスクロールですからね。
そう考えると、確かにMSX1でメガROM使っていないロールプレイングゲームは少ないですね。
テープ版の「ハイドライド」や、ROM版の「ウルティマ」「ザナドゥ」位なのかな?
キャラクタデータの容量の少ないARPGだし。
以前にメモリ不足に悩んで、断念したMSX1版ロールプレイングゲーム「デビルズバスター」の事を書きましたが、マップ10面位作って、動くイベント(町人等)20個以上作ってたらメモリ不足になりました。
FONT読込をデータとカラーに分けて&HB000~&HB7FFまでにして、残りはプログラムエリア。
しかも、戦闘ロジックは敵FONTを読込、設定し終わった後、&HB000~&HB7FFに読み込んで実行するというデータロード時間を犠牲に色々やったのですが、結局、どう考えてもやりくりできない状態になりました…。
ディスク使ってるので、マップの広さや数、敵のグラフィックなんかは、どうとでもなるのですが、一度に読み込めるデータ量に問題があります。
なんといっても、イベント関連の変数は、マップ移動してもメモリ内に残しとかないといけないので、容量食います…。
特に移動するイベント(町人)だったので、1つのイベントにワーク10バイト程度、移動のロジックが結構とんでもなく多かった覚えがあります。
あとスクリプト命令。
イベントの動作を凝らしていった結果、アニメーションさせて移動させたりする命令がバンバン増えて、それに比例しプログラムも増大。
マップを増やせば増やすほど、イベント数がどんどん増えて行って、結果イベント管理用のメモリも増えてしまうという…。
まぁ、メモリ気にせずイベント配置しまくった自分が悪いんですが…。
この時、MSX1の機能だけでの製作を諦めて、MSX2の機能使ってれば問題なかったんですが、やっぱりMSX1での制作にこだわってしまいました。
ここで仕事でWindowsでのプログラミングが始まったこともあり、プライベートでもWindowsでのゲーム制作に移行してしまいました。
2023年11月23日
細かく修正M
「ダウンロード」の記事の飛び先の誤りを修正。
・作品14「PAC-MAN」
・ツール6「MAP16 EDITOR Ver.2.2」
「ゲーム制作」の「3Dダンジョンロールプレイングゲーム」で前後回へのリンク切れが、また複数見付かったので修正。
「Laboratory」テーマメニューの公開分記事へのリンク追加。
・Laboratoryテーマ26「SCREEN1.5を使いたい」
・Laboratoryテーマ27「SCREEN1.5でSPRITEモード2を使いたい」
それ以外は、画像の貼り直しや、記事の誤記の修正程度です。
2023年11月22日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第51回
3Dダンジョンロールプレイングゲーム 第51回目です。
今回はタイトルFONTを作成します。
「なぜ突然?」と思うかも知れませんが、システムメニューが終わったら、いよいよ戦闘になります。
戦闘には当然、敵グラフィックが表示されます。
方眼紙と「FONT EDITOR」で、ちまちま描いていては時間も労力も足りませんので、以前に書いた案を実践してみようと思います。(2023年9月20日記事参照「画像系」)
…そう、その練習です。
まず、Excelで文字を書きます。
それをコピーして、グラフィックソフトに貼り付け、画像サイズをMSX1のサイズ(256×192)にし、16色に減色して「.BMP」形式で保存。
そしてそれを、「BMP2MSX」にドラッグ&ドロップで、「.SC2」にコンバート。
その「.SC2」ファイルを、「SC2toFNT.BAS」と一緒に「Disk-Manager」でイメージディスク化。
そのイメージディスクを「BlueMSX」で起動し、「SC2toFNT」で「.SC2」ファイルを「.FNT」にコンバート。
そして出来た「**1.FNT」、「**2.FNT」、「**3.FNT」の内、今回は上段の「**1.FNT」を3Dダンジョンロールプレイングゲームのディスクにコピーします。
「3DRPG.BAS」で、タイトル表示させれば完了です!(表示が遅いので、マシン語で組みました。)
簡単!
「FONT EDITOR」でポチポチしなくても、出来ました!
これなら、敵グラフィックもWindowsで過去に描いたものを流用可能です!
それぞれのツールの作者様、便利なツールをありがとうございます!
因みにタイトルはとりあえず(仮)です。
次回はシステムメニューの「どうぐ」を作成します。
2023年11月21日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第50回
3Dダンジョンロールプレイングゲーム記念すべき第50回目です。
今回は文字FONTを書き換えて、ゲームの雰囲気を盛り上げます。
前回も書きましたが、やっぱり標準FONTじゃ味気ないなぁ…。
抑揚がなく、読み辛い…。
そこで、文字フォントを「FONT EDITOR」で書き換え。
久しぶりのFONT作成は楽しい!!
ここまでする気なかったのに、気付けば全文字FONTを書き換えていました。
素晴らしい集中力です。(←自画自賛)
調子に乗って色まで付けてる…。
こんな感じになりました。
良い感じです!
おぉ、見易い!
一気にゲームっぽくなりましたね!
もうちょっと、FONT崩してもいいかも?
そろそろタイトルFONTも文字じゃなく、ちゃんとしたのにしたいですね。
という事で、次回はタイトルFONTを作成します。
2023年11月20日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第49回
3Dダンジョンロールプレイングゲーム第49回目です。
今回はセーブ処理を組んでいきます。
「セーブ」はシステムメニューの4番目。
セーブ数は3つです。
ファイル選択後、一旦BASICに戻り変数エリア(&HE000~&HE0FF)をBSAVEにて保存し、再度マシン語に復帰します。
マシン語プログラムリストです。
BASICプログラムリストです。
元々のメインルーチンに601行〜604行を追加しています。
システムメニューからセーブして、ちゃんとゲームに戻る事を確認。
とりあえず以前のようなBSAVEの悪夢は起こらず…。
ちゃんと保存されているかは、「CONTINUE」処理を組む際に分るでしょう。
何にしても一番最後です。
駄目ならまた変数エリアのアドレスをズラすしかない…。
でも、それで解決できるのが判ってるから気は楽です。
さて、次回…。
ん−、処理を進めたいところですが、ステータス表示してみて、「やっぱり標準FONTじゃ味気ないなぁ…。」と痛感。
次回は閑話休題、文字FONTを書き換えてみます。
2023年11月19日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第48回
3Dダンジョンロールプレイングゲーム第48回目です。
では、今回は前回設計した通りに「ステータス」表示を組んでいきます。
「ステータス」はシステムメニューの3番目。
1ページ目は強さに関する表示を左右に分けて表示します。
中央線(!)は専用のFONT作る予定です。
仮にアイテム装備させてみて、攻撃力・防御力・素早さの()内装備品込値にちゃんと反映されてるかチェック。
問題なしです!
2ページ目は装備品に関する表示です。
こちらも仮に装備させた装備品が、ちゃんと反映されてます。
ステータス表示のプログラムリストです。
容量節約しないといけないのに、これだけで&H128も使ってしまった…。
まぁ必要な処理故、止むを得ない…。
次回はセーブ処理を作成していきます。
BSAVEの悪夢が再現しないことを祈ります…。
2023年11月18日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第47回
3Dダンジョンロールプレイングゲーム第47回目です。
第19回にシステムメニュー表示して、「次回以降それぞれの処理を作ります。」と、言っておきながら、システムメニューすっかり後回しになってしまいました…。
今回はシステムメニューの「ステータス」の表示について設計します。
今作では、画面下部1/3にしか文字が表示できないため、そこに収まる範囲の表示しかできません。
しかし、表示項目が多く標準メッセージウィンドウに一度に表示し切れないので、2ページに分けて表示することにします。
1ページ目は強さに関する表示を左右に分けて表示します。
[ステータス (つよさ)] | ||
レベル:値 | | | こうげきりょく:値(装備品込値) |
たいりょく:値/上限値 | | | ぼうぎょりょく:値(装備品込値) |
まりょく:値/上限値 | | | すばやさ:値(装備品込値) |
じょうたい:状態 | | | けいけんち:値 |
おかね:値 | | | つぎ:>値 |
2ページ目は装備品に関する表示です。
[ステータス (そうび)] | ||
けん:区分0装備品名 | ||
たて:区分1装備品名 | ||
よろい:区分2装備品名 | ||
かぶと:区分3装備品名 |
ステータス表示は、1項目ずつ変数を16進数→10進数変換掛けて、桁数指定(ゼロサプレス処理有)表示ルーチンでメッセージワークに書き込み、全項目書き込み終わったら表示となります。
しかもその項目数が、3桁数値11個、5桁数値3個、文字列5個もあり、完全な力技になります。
圧縮しようのない、最も容量を食う処理の1つです。
装備品込みの攻撃力・防御力・素早さ表示のために、算出ロジックを組みます。
これは戦闘時にも必要なのでサブルーチン化します。
同じく、レベルアップに必要な経験値表示のために、算出ロジックを組みます。
これも戦闘後のレベルアップ判定に必要なのでサブルーチン化します。
次回は今回設計に則り、ステータス表示を作成します。
2023年11月17日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第46回
3Dダンジョンロールプレイングゲーム 第46回目です。
さて、今回はマップ移動時発生イベントを組んでいきます。
何それ?と、思われるかもしれませんが、前回組んだイベントの中で、「宝箱」や「ゲート」等に関して「移動後座標って何?」と思われた方もいるのではないでしょうか?
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | 武器屋案内 | (19,18) | (0,0) | 設置 |
7 | 道具屋案内 | (19,17) | (0,0) | 設置 |
8 | 宿屋案内 | (19,16) | (0,0) | 設置 |
9 | ボス戦闘 | (19,9) | 接触 |
「宝箱」は初期座標が通路に面していない壁の中(0、0)ですので接触できません。
また、「ゲート」はイベント終了後そこに存在すると先に進めません。
「案内」イベントは、毎回表示すると煩いので初回通過時のみとします。
そこで、フラグ値に応じてイベントを移動させる必要があります。
実際のイベントを使って説明します。
ゲートがあって進めません。
鍵を使ってゲートをあけます。
本来なら、これでゲートは開いているはずので通過できるはずなのですが、現状だとイベントがそのまま残っていますので、進もうとすると…
進めません。
そこで、フラグ値に応じてイベントを消す必要があるのです。
イベントを消すには絶対に触れられない場所(今作だと座標(0,0))に移動させれば良いです。
このルーチンはマップを移動した際(イベント位置が初期座標にある)、そのマップ内のイベントを毎回フラグ値に応じて移動させる(移動後座標に配置換え)必要があるので、マップ移動時発生イベントと私は呼んでいます。
複雑なイベントを組むのなら、これも別ファイルでスクリプト化した方が便利です。
例えば学校探索系のロールプレイングゲームで、教室のドアが複数あるなど。
今作は5つなので、直プログラムします。
これで、敵がいない状態で最後のボス戦まで進むことが出来るようになりました。
次回は、システムメニューを組んでいきます。
2023年11月16日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第45.5回
3Dダンジョンロールプレイングゲーム 第45.5回目です。
.5ですが、バグではありません。
簡単なイベントを追加します。
前回、イベントの配置と進行を組みました。
ただ、やはり壁に店屋と宿屋がめり込んでいるのは、「普通気付かないだろう」と考えました。
そこで、大した容量も労力も費やさないので、「案内イベント」を用意することにしました。
「武器屋」、「道具屋」、「宿屋」の前を最初の通過時のみ、「東に『**屋』がある。」と表示するのです。
すると、壁にめり込んでいても、壁側に何かあると気付きますよね。
1回表示したら「ゲート」同様、イベントを移動させます。
そうする事で、2回目の通過以降はイベントが発生しなくなります。
イベント一覧です。
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | 武器屋案内 | (19,18) | (0,0) | 設置 |
7 | 道具屋案内 | (19,17) | (0,0) | 設置 |
8 | 宿屋案内 | (19,16) | (0,0) | 設置 |
9 | ボス戦闘 | (19,9) | 接触 |
通路上にあり、その座標に乗ったら発生するイベントなので、「設置」型となります。
今作は「設置」型のイベントがなかったので、ちょうどいい紹介になりました。
次回はマップ移動時発生イベントを組んでいきます。
2023年11月15日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第45回
3Dダンジョンロールプレイングゲーム 第45回目です。
さて、今回はイベントの配置と、進行を組んでいきます。
要するに敵が出ない状態でエンディングまで進めるようにします。
今回の3Dロールプレイングゲームは、マップが1面でイベントも6種類しかありませんので、簡単です。
イベントに座標と、設置型か接触型かのフラグと、発生イベントb持たせておいて、イベント発生した時、そのイベントbフメッセージが表示される仕組みとします。
イベント部分の変数表です。
イベントの配置と座標です。
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | ボス戦闘 | (19,9) | 接触 |
可能なら、3D画面表示の際、これらのイベント画像(宝箱など)を表示できればいいのですが、容量節約のため、とりあえず表示はナシのメッセージのみとします。
(最後、余裕があれば表示するようにします。)
とりあえずメッセージデータは全て組みました。
しかし、このままでは「ゲート」の鍵を開けられても、イベントがその座標に残っているので、先に進めません。
その対策として、イベントが終了したらイベントを移動させる必要があります。
というわけで、次回はマップ移動時発生イベントを組んでいきます。