2023年09月09日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第13回
3Dダンジョンロールプレイングゲーム第13回目です。
今回は遂に、3D表示のプログラミングに挑戦します。
前々々回(【ゲーム制作】3Dダンジョンロールプレイングゲーム 第10回)に書いたロジック通りに、前回設定した表示ワークの地形を描画します。
これはもう簡単。
条件に従って表示ロジックを記述していくだけです。
気を付けなければいけないのは一カ所だけ。
正面Dに壁があった時、Vだけでなく、その両サイドUとWの壁も描画し、T描画のロジックへ飛ぶくらいですね。
壁の描画はLaboratoryテーマ15「任意サイズのFONTキャラクタを指定座標に表示させたい」のサブルーチンで描画します。
前回同様各向きで描画してみました。
期待通りの動きです、問題なしですね。
マウスが使えなかった時に、とりあえずで作成したFONTなのでチープです。
では、次回は描画が非常にチープなのでもう少し(ほんの少し)見栄え良くしてみます。
2023年09月08日
夏休み
専門学校の夏休みは短い…。
2週間くらいしかなかったと記憶しています。
私の兄が大学生で、夏休みが2ヶ月以上あったので「大学って何しに行ってるんだろう?」と思ってました。(兄だけかと思いますが…。)
その短い夏休みを、購入したMSX2+の機能検証に費やしました。
CPU的な違いはないので、その他の機能強化となります。
まずは追加機能。
「HB-F1XDJ」だけになりますが、FM音源が内蔵されています。
音色が綺麗。
次に漢字ROMが内蔵されています。
んー、漢字表示ですがMSXの解像度では文字が大きくなりすぎてやっぱり使いづらい。
小さくするとインターレースになり、ブレるし…。
あと、スピードコントロールと、連射機能が付いています。
ゲームプレイではお世話になりました。
次にグラフィック関係。
やはり、特筆すべきはSCREEN12の自然画モード。
YJK方式により19,268色の同時発色が可能で、とても綺麗でした。
…が、それだけ。
元々グラフィックデータのフロッピーディスクからの読み込みに時間が掛かるところ、圧縮掛けてるので展開に更に時間が掛かる。
しかも、1画面に必要なVRAM容量は128KB(2画面)。
2DDのフロッピーディスクしかないMSX2+では容量的にも扱いにくく、コンパイルの「真・魔王ゴルベリアス」のようにオープニング、エンディングくらいでしか使えない…。
画像出典: 『電撃オンライン』 真・魔王ゴルベリアス MSX2+版
https://dengekionline.com/articles/96649/
本編を自然画モードで作ったら、フロッピーディスク何枚組のゲームになるんだろう…。
他にはハードウェア横スクロールの実装!
ただ、これも後にコナミの「スペースマンボウ」のようなSETADJUSTの応用による1ドット横スクロールがMSX2で実現されてからは、MSX2+だけの特徴ではなくなりました。
画像出典: 『GameFAQS』 スペースマンボウ MSX2版
https://gamefaqs.gamespot.com/msx/917251-space-manbow/images?pid=917251&img=6
と言う訳で、特にMSX2+だからこれが出来る!と言うのもなく、結局そのまま今まで通りのゲーム作りとなりました。
2週間くらいしかなかったと記憶しています。
私の兄が大学生で、夏休みが2ヶ月以上あったので「大学って何しに行ってるんだろう?」と思ってました。(兄だけかと思いますが…。)
その短い夏休みを、購入したMSX2+の機能検証に費やしました。
CPU的な違いはないので、その他の機能強化となります。
まずは追加機能。
「HB-F1XDJ」だけになりますが、FM音源が内蔵されています。
音色が綺麗。
次に漢字ROMが内蔵されています。
んー、漢字表示ですがMSXの解像度では文字が大きくなりすぎてやっぱり使いづらい。
小さくするとインターレースになり、ブレるし…。
あと、スピードコントロールと、連射機能が付いています。
ゲームプレイではお世話になりました。
次にグラフィック関係。
やはり、特筆すべきはSCREEN12の自然画モード。
YJK方式により19,268色の同時発色が可能で、とても綺麗でした。
…が、それだけ。
元々グラフィックデータのフロッピーディスクからの読み込みに時間が掛かるところ、圧縮掛けてるので展開に更に時間が掛かる。
しかも、1画面に必要なVRAM容量は128KB(2画面)。
2DDのフロッピーディスクしかないMSX2+では容量的にも扱いにくく、コンパイルの「真・魔王ゴルベリアス」のようにオープニング、エンディングくらいでしか使えない…。
画像出典: 『電撃オンライン』 真・魔王ゴルベリアス MSX2+版
https://dengekionline.com/articles/96649/
本編を自然画モードで作ったら、フロッピーディスク何枚組のゲームになるんだろう…。
他にはハードウェア横スクロールの実装!
ただ、これも後にコナミの「スペースマンボウ」のようなSETADJUSTの応用による1ドット横スクロールがMSX2で実現されてからは、MSX2+だけの特徴ではなくなりました。
画像出典: 『GameFAQS』 スペースマンボウ MSX2版
https://gamefaqs.gamespot.com/msx/917251-space-manbow/images?pid=917251&img=6
と言う訳で、特にMSX2+だからこれが出来る!と言うのもなく、結局そのまま今まで通りのゲーム作りとなりました。
2023年09月07日
バグ発見A
連続バグ報告でスイマセン…。
Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@のロジック中にバグを発見しました。
「3Dロールプレイングゲーム」の制作中、プレイヤー移動用にジョイスティック入力処理追加したとたんに暴走しました。(フリーズ)
キーボード操作では、問題ありません。
原因は、ジョイスティックのボタン操作判定用のBIOS「GTTRIG」(&H00D8)。
メッセージ表示速度調整用の時間稼ぎループをBレジスタでループさせていて、そのループ中にボタン判定(WAIT飛ばし)しているため、Bレジスタの内容が壊れフリーズしたものと思われます。
「MSXテクニカルハンドブック」には、「GTTRIG」の使用レジスタは「AF」のみとなっているので、これを信じて他レジスタの退避していなかったのですが、よく考えたらジョイスティックを使うとなぜかBレジスタが壊れるんです。
このことは経験則で知っていたのですが、あまりに久しぶりだったので「MSXテクニカルハンドブック」を信じてしまいました…。
と、言う事で「GTTRIG」使う際には必要ならBレジスタを退避しなければなりません。(調べてないけど他のレジスタも?)
うーん、ブランクって怖いですね…。
2023年8月29日の記事、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@を再度改訂しました。
(サンプル自体はキーボード入力固定なので問題はありませんが、バグ有ロジック放置するのも嫌なので…。)
サンプルプログラムの再ダウンロードをお願いします。
ご迷惑おかけし申し訳ありません。
…ん?今回は私のせいなのか…?
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年09月05日
バグ発見
Laboratoryテーマ22「文字列中の数字を数値に変換したい」のロジック中にバグを発見しました。
DEレジスタに、文字列中の数字部分の先頭アドレスを代入しコールするとAレジスタに数値として取り出せるサブルーチンです。
単体での動作は問題ありません。
問題はスクリプト内のコマンドに記述された数字を連続で読みだす際、その中に3桁の数字があるとエラーとなります。
なぜかと言うと、仕様では数値変換終えた後、DEレジスタは文字列中の数字の最後尾アドレスを指しているはずが、プログラミングミスで先頭アドレスのままとなっていました。
そこから読み込もうとする時、2つアドレスを進めたところから読み始めるので、2桁なら数字から抜けたところスタートなのでよかったのですが、3桁だと1の位スタートになるのでエラーとなります。
2023年9月1日の記事、Laboratoryテーマ22「文字列中の数字を数値に変換したい」と、
そのロジックを内包する、2023年8月29日の記事、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@を改訂しました。
サンプルプログラムの再ダウンロードをお願いします。
ご迷惑おかけし申し訳ありません。
ロジックが複雑なサンプルが多くなるのでバグが増えそうです…。
2023年09月04日
ゲーム専用機
前回、MSXturboRと他のゲーム専用機との価格について書きましたが、私の記憶となんか微妙に時期のズレがあったので調べてみました。
機種 | メーカー | 価格 | 発売日 |
ファミリーコンピュータ | 任天堂 | 14,800 | 1983年7月15日 |
セガ・マークIII | セガ | 15,000 | 1985年10月20日 |
PCエンジン | NECホームエレクトロニクス | 24,800 | 1987年10月30日 |
メガドライブ | セガ | 21,000 | 1988年10月29日 |
PCエンジンCD-ROM² | NECホームエレクトロニクス | 24,800 | 1988年12月4日 |
MSXturboR「FS-A1ST」 | パナソニック | 87,800 | 1990年10月中旬 |
スーパーファミコン | 任天堂 | 25,000 | 1990年11月21日 |
うーん、やっぱりMSXturboRが話題になった1990年10月には、スーパーファミコンって発売されていなかったんだ…。
専門学校1年生の頃に、友人宅でPCエンジンCD-ROM²で遊んだ記憶しかないのはそういう事か…。
納得。
しかし、MSXturboR発売直後にスーパーファミコンなんか発売されたら、そりゃ勝てないよね…。
2023年09月03日
MSX2+購入!
専門学校も、もうすぐ夏休みに差し掛かる頃だったと思います。
友人が入学早々MSX2+を購入し、見せびらかしてくるので、対抗して私も遂にMSX2+を購入しました。
私の製作するゲームはMSX2の機能で十分だったのですが、つい…。
機種はSONYのMSX2+「HB-F1XDJ」でした。
FM音源も漢字ROMも搭載している優れモノでした。
出典: 『MSX Resource Center』
https://www.generation-msx.nl/hardware/sony/hb-f1xdj/748/
でも今思うと、MSX1からMSX2、MSX2+と進化するにつれて、余計な(失礼)機能が付加されて、その分価格も上がってしまいました。
元々家庭用ホビー機として普及したのだから、「機能も抑えて価格も抑えて」にした方が、良かったのではなかったのかと思います。
追加機能(漢字ROMとか、FM音源)はROMで出せばいいだけなので…。
パソコンとはいえ、ゲーム機のイメージが強いMSXなので、どうしても比較対象はゲーム機になります。
MSXturboR発売当時(1990年)だとまだ、スーパーファミコン(希望小売価格25,000円)とメガドライブ(同21,000円)、PCエンジン(同24,800円)が主流だったので、ゲーム機としては高価すぎました。
また、パソコンとしてもMSXturboRが税込10万円台なのに対し、当時普及していた性能面で大きく上を行くPC98互換機の最廉価モデルの販売価格が12万円台と、ゲーム機としてもパソコンとしても、価格競争力がなくなったことがMSXの敗因だったと聞いたことがあります。
MSXturboRの販売価格が、MSX2+の5万円前後+αの税込7万円程度で維持できていれば、全然状況は違ったと思います。
MSX1〜MSX2+までの大きなユーザー数を生かす戦略を取れなかったのかな?
まぁ、PC98互換機の価格が急に下がったなどの要因が、後出しであったのなら仕方ないですが…。
さて、この頃になると、1本のゲームを完成させるのに数か月といった状態になり、ほぼ完成しないといった状態に陥ってしまいました。
友人が入学早々MSX2+を購入し、見せびらかしてくるので、対抗して私も遂にMSX2+を購入しました。
私の製作するゲームはMSX2の機能で十分だったのですが、つい…。
機種はSONYのMSX2+「HB-F1XDJ」でした。
FM音源も漢字ROMも搭載している優れモノでした。
出典: 『MSX Resource Center』
https://www.generation-msx.nl/hardware/sony/hb-f1xdj/748/
でも今思うと、MSX1からMSX2、MSX2+と進化するにつれて、余計な(失礼)機能が付加されて、その分価格も上がってしまいました。
元々家庭用ホビー機として普及したのだから、「機能も抑えて価格も抑えて」にした方が、良かったのではなかったのかと思います。
追加機能(漢字ROMとか、FM音源)はROMで出せばいいだけなので…。
パソコンとはいえ、ゲーム機のイメージが強いMSXなので、どうしても比較対象はゲーム機になります。
MSXturboR発売当時(1990年)だとまだ、スーパーファミコン(希望小売価格25,000円)とメガドライブ(同21,000円)、PCエンジン(同24,800円)が主流だったので、ゲーム機としては高価すぎました。
また、パソコンとしてもMSXturboRが税込10万円台なのに対し、当時普及していた性能面で大きく上を行くPC98互換機の最廉価モデルの販売価格が12万円台と、ゲーム機としてもパソコンとしても、価格競争力がなくなったことがMSXの敗因だったと聞いたことがあります。
MSXturboRの販売価格が、MSX2+の5万円前後+αの税込7万円程度で維持できていれば、全然状況は違ったと思います。
MSX1〜MSX2+までの大きなユーザー数を生かす戦略を取れなかったのかな?
まぁ、PC98互換機の価格が急に下がったなどの要因が、後出しであったのなら仕方ないですが…。
さて、この頃になると、1本のゲームを完成させるのに数か月といった状態になり、ほぼ完成しないといった状態に陥ってしまいました。
2023年09月02日
日商簿記検定試験3級
専門学校生活にも慣れてきた頃…。
「第二種情報処理技術者試験」を目指した授業の中に、簿記の授業が入るようになってきました。
そう、入学早々に申し込んだ「日商簿記検定試験3級」を受けるための授業が始まりました。(2023年8月24日記事参照「資格試験」)
普通高校の私は「簿記」ってなんぞや?レベルの知識しかありません。
「借方」「貸方」「貸借対照表」など専門用語から覚えなければなりません。
「こんなの数回授業で教えてもらっただけで受かるのか?」
そう思いながらも過去問を繰り返しやることで、8割くらい合格圏内まで上げる事が出来ました。
まぁ、3級だと専門用語を覚えていて、「仕訳」が間違いなくできれば、ほぼ受かるレベルでした。(30年前です。)
で、受験結果は「合格」でした。
これが終わり、「第二種情報処理技術者試験」の授業に主軸を移した授業になるのでした。
2023年09月01日
Laboratoryテーマ22「文字列から数値に変換したい」
さて、今回はLaboratoryテーマ22「文字列から数値に変換したい」です。
前回のメッセージウィンドウオープンで説明した通り、イベント制御には自作スクリプトを用意します。
しかし、スクリプトを読み込む際、数字も文字列として読み込んでしまうため、そのままでは数値として利用できません。
例えば、スクリプト「FE,12」(実行中イベントのフラグを12にする。)は、メッセージデータ上は文字列「46 45 2C 31 32」となっています。
そこで、数字部「31 32」を数値「12」化するためのサブルーチンが必要になります。
文字→数値変換のサンプルプログラムです。
「Ato9SMPL.BAS」【ダウンロード】
数字を含む文字列を入力すると、文字列中の数字部分を数値化し、数値として結果を表示します。
文字列データとなっている途中経過をASCIIコード化して表示します。
マシン語のサンプルです。
(因みに、メッセージウィンドウオープンのサンプルに既に入っています。)
起動すると、Ato9SMPL.BINを作成します。
掛け算のサブルーチンを内包しています。
0〜255までの値を変換可能です。
変換用のワークとして、5個の変数を使っています。
サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HD0E0〜&HD0E4)
IN | OUT | ||
DE | 文字列数字部先頭アドレス | A | 数値 |
「BINSET.BAS」【ダウンロード】
マシン語のサブルーチンとして必要なのは&HC000~&HC03Fまでです。
&HC058~&HC06Fは文字列先頭アドレスから、数字部分を見付けサブルーチンコールします。
2023年08月31日
Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」そのB
さて、今回はLaboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」そのBです。
今回公開したメッセージウィンドウは、メッセージを表示するだけでなく、スクリプトを組み込むことが可能です。
スクリプトに命令を追加することで、複雑なイベント管理が可能となります。
今組み込んであるのは、下表の3命令。
命令 | 意味 | 記述 | 動作 |
NX | NeXt | NX | 次のメッセージへ |
FE | FlgsetEnd | FE,n | フラグをn値に設定し、イベントを終了 |
end | イベント終了 |
追加で組み込む予定なのは、下表の命令。
命令 | 意味 | 記述 | 動作 |
YN | Yes/No | YN,x1,y1,m1,m2,m3 | 座標(x1,y1)に「はい/いいえ」の選択ウィンドウを開く。「はい」が選択されたら、メッセージm1、「いいえ」が選択されたら、メッセージm2、キャンセルが選択されたら、メッセージm3へ |
SW | SelectWindow | SW,x1,y1,x2,y2,n | 座標(x1,y1)に幅x2、高さy2の選択ウィンドウを開く。選択肢数はn |
WO | WindowOpen | WO,x1,y1,x2,y2,l | 座標(x1,y1)に幅x2、高さy2のウィンドウを開く。lで枠線の有無設定(0:有 1:無) |
MS | MessageSpeed | MS,n | メッセージ表示速度をnに設定 |
JP | JumP | JP,n | メッセージnへ |
FS | FlagSet | FS,m1,e1,n | マップm1のイベントe1のフラグをn値に設定 |
ES | EventStart | ES,e1 | イベントe1を実行する |
CF | CheckFlag | CF,m1,e1,m0,m1,m2,m3,… | マップm1のイベントe1のフラグが0ならメッセージm0、1ならメッセージm1、2ならメッセージm2...へ |
CS | CheckSelect | CS,m0,m1,m2,m3,… | SWで選ばれた項目番号が、キャンセルならメッセージm0、1ならメッセージm1、2ならメッセージm2...へ |
IN | INn | IN,n,m1 | 宿屋、所持金額から人数×nを減らし、HP・MPを全回復させる。所持金額が足りなければメッセージm1へ |
IS | ItemShop | IS,n,i1,i2,i3…,m1 | 店屋、n種類のアイテムを購入、所持アイテムの売却する。店を出た時はメッセージm1へ |
とりあえず今回は必要最低限、こんなところです。
ロールプレイングゲームでは、キャラクタ移動命令等も必要になるので、あまり多くの命令を組み込むと、メモリが全然足りません…。
私がMSXでのロールプレイングゲーム製作を断念し、Windowsへ製作移行した理由の大半はそれです。