2023年11月30日
プログラムのロジック
ゲームで「こういうことがしたい!」と思いロジックを考える時、閃いたロジックにより、プログラミングの難度や、処理速度、プログラムの長さが全然変わります。
結果は全く同じなのに、それを実現するプログラムのロジックは全く違う訳です。
そこがプログラミングの面白いところです。
ただ、全く閃かない時もあります。
そんな時は、無駄に長く、効率の悪いプログラムを組んでしまいます。
後で、「あれ?なんでこんなロジック組んでるの!?」と、猛省する事も…。
例えば、今制作中の3Dロールプレイングゲームのシステムメッセージの表示で、今回、アイテム名+メッセージの表示を組みました。
アイテム名が10桁で、後ろにスペースが付いているのでそれを除いて表示するロジックです。
私は今回、アイテム名をワークにセットし、10桁目から前に(9桁目)スペースかどうかチェックをかけて行き、スペースでなくなった位置から、残りのメッセージをワークにセットし、VRAMに一括転送して表示するロジックとしました。
特に問題はありませんが、桁が変動する部分を前に持ってこなければならないため、回復薬を使った時にこのロジックだと「25たいりょくが、かいふくした。」としか表示できませんし、合成用のメッセージルーチンを専用に組まなければなりません。
他の方法としては、メッセージデータとして「たいりょくが、〇〇〇かいふくした。」と用意しておき、〇部分にゼロサプレス若しくは左詰めで3桁の数値をセットし、表示する際VRAMに一括転送するのではなく、1文字ずつスペースかどうかチェックしながら転送すれば良いです。
これだと他のメッセージ表示ルーチンと共通で使えます。
ただ、この場合メッセージ中にスペースは含められません。
(&H20以外にスペースFONTを用意して、それをメッセージ中のスペース代わりにする事で対応可。)
今回反省点は、標準のメッセージ表示ルーチンがあるのに、それを使わずなぜわざわざシステムメッセージ表示専用のルーチンを作ってしまったのか…!?
言い訳ですが、一応毎日更新しているので、深く考慮できていません。
最初の方に組んだサブルーチンは、ほぼ忘れています。
でも、ここまで進んでしまったので、もう今更修正する気力はありません…。
こんな感じでロジックを考えていきますが、時々、自分でも驚くような、もの凄い効率的なロジックを組むことが出来ます。
凄い感動です。
こうしてプログラミングにハマっていくのでした…。
2023年11月29日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第55回
3Dダンジョンロールプレイングゲーム 第55回目です。
今回もシステムメニューの「どうぐ」処理を作成します。
今回は、最後の「つかう」を組みます。
まず、システムメニューから、「つかう」を選択。
所持品を使ったメッセージと、効果が表示されます。
選択された所持品が装備品の場合は、今作では使えません。
それ以外の所持品は、今作では使っても何も起こりません。
その場合、所持品は無くなりません。
それら所持品は、イベント発生時に勝手に使います。
因みに「どくけしそう」は、毒状態からの回復。
「宿屋」は体力、魔力しか回復しないので、ゲーム序盤では毒状態からの唯一の回復方法です。
「エリクサー」は体力、魔力、状態異常(毒状態)からの全回復です。
今作では、各用途のアイテムが1種類ずつなので直接アイテムnw定でロジック振り分けていますが、本来なら用途区分を持たせ、用途によって振り分けるようにします。
そして、別途効果値を持たせ、その効果値で使用した際の効力を変動させます。
そのあたりは、「魔法」でやります。(回復1(弱)、回復2(強)等)
これで「どうぐ」全ての処理完了です。
次回は「システムメニュー」の最後、「まほう」を作成します。
2023年11月28日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第54.5回
3Dダンジョンロールプレイングゲーム 第54.5回目です。
.5なので、バグです。
システムメニューの「どうぐ」の「そうび」処理を前回作成しました。
その際に発見したバグになります。
ステ−タス表示をするために、メッセージデータに直接値を書き込んでいます。
一度、装備した状態でステータスを表示。
装備を外した状態で、再度、ステータスを表示。
「つよさ」欄の攻撃力には外した状態が反映されているのに、「そうび」欄は装備したままになっています。
これは、装備している時のみメッセージデータに装備品名を書き込んで、装備していないときは何もしていないためです。
何も装備していないときは、「空白」を書き込む必要があります。
と言う訳で、解消するには、ステータス表示する前に一度全装備品名エリアと、状態エリアをスペースクリアすればいいです。
これを忘れていました…。
その他の数字エリアは、必ず上書きするので問題なし。
で、修正。
無事、装備を外した際、装備名が空白になりました。
2023年11月27日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第54回
3Dダンジョンロールプレイングゲーム 第54回目です。
今回もシステムメニューの「どうぐ」処理を作成します。
今回は、「そうび」を組みます。
まず、システムメニューから、「そうび」を選択。
選択された所持品が、装備品でない場合はメッセージ表示。
選択された所持品が、既に装備されている場合は装備を外します。
装備品を装備する際、気を付けなければいけないのが、装備部位(剣、盾、鎧、兜)。
選択した装備品が、剣なら他の剣を装備していないか?、鎧なら他の鎧を装備していないか?と、部位毎にチェックする必要があります。
ロジックを組んでみました。
選択した装備品の部位に、既に他の装備がされていればAレジスタに「1」を、されていなければ「0」を返します。
「1」の時は、HLレジスタに既に装備されている装備品の、所持品格納ワークのアドレスを返します。
装備します。
なお、既に装備されていた装備品は、自動で外します。
いちいち装備外すの面倒ですからね。
ステータスで装備品込みの値が変化したか確認。
「どうのけん」装備時。攻撃力は「10」。
「てつのけん」装備時。攻撃力は「15」。
「そうび」処理完了です。
次回は「どうぐ」の最後、「つかう」を作成します。
2023年11月26日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第53回
2023年11月25日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第52回
3Dダンジョンロールプレイングゲーム 第52回目です。
今回からシステムメニューの「どうぐ」処理を作成します。
その前に、「どうぐ」のシステムメッセージには、「『やくそう』をつかった!」など、アイテム名+メッセージを表示する処理が必要になります。
そこで今回はアイテム名などの後ろにあるスペースを削除(トリミング)し、メッセージと引っ付けて表示するロジックを組んでいきます。
通常はアイテム名を『』で囲って表示するが、ダメージ値の表示など囲わない場合は&HD33Bをコールする。
IN | OUT | |||
HL | アイテム名先頭アドレス | なし | ||
DE | メッセージ先頭アドレス | |||
B | アイテム名桁数(スペース含む) | |||
C | メッセージ桁数 |
やってることは簡単。
アイテム名をワークに転送して、その転送し終わったアドレスから前向きに、スペースか確認していき、スペースではなくなったアドレス+1から今度はメッセージを転送し、それを表示するだけです。
このロジックを使えば、「どうぐ」だけでなく、「『スライム』が、あらわれた!」や「『かいふく』のじゅもんを、となえた!」など、名前+メッセージが簡単に表示できます。
では、次回は「どうぐ」の「すてる」を作成します。
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を作成します。