2023年09月14日
Laboratoryテーマ25「SCREEN2のグラフィックをFONTデータにして扱いたい」そのA
さて、今回はLaboratoryテーマ25「SCREEN2のグラフィックをFONTデータにして扱いたい」そのAです。
いつものテーマ説明は前回終わっているので、いきなり本題です。
SCREEN2の画像データをFONTに変換するサンプルプログラムです。
「SC2toFNT.BAS」【ダウンロード】
SCREEN2「.SC2」画像ファイルのファイル名(「ALPHA.SC2」の場合「ALPHA」)を入力すると、上段、中段、下段の3ファイルに分けて「.FNT」ファイルを作成します。(上段「ALPHA1.FNT」、中段「ALPHA2.FNT」、下段「ALPHA3.FNT」)
難しい事は何もしていません。
サンプルデータとして、「ALPHA.SC2」が同梱してあります。
2023年09月13日
Laboratoryテーマ25「SCREEN2のグラフィックをFONTデータにして扱いたい」その@
今回は、Laboratoryテーマ25「SCREEN2のグラフィックをFONTデータにして扱いたい」その@です。
初回はテーマに挙げるに至った理由です。
アドベンチャーゲーム等のグラフィック主体のゲームを作る時、MSX1ではSCREEN2を利用することが多いと思います。
画像出典: 『Tagoo』 ZARTH MSX1版
https://msx.jpn.org/tagoo/s_check.cgi?LINE=482
SCREEN2はMSX1では、フルグラフィック(横256ドット×縦192ドット、16色)を扱える唯一のモードとなります。
ただ、横8ドット毎2色と、独特な仕様で、色の滲みを抑えるためテクニックが必要になります。
また、SCREEN2上で文字を表示させるときはFONTが使えないため、標準のFONTになります。
そこで、SCREEN2の綺麗なグラフィックを、SCREEN1のように簡単に扱えると言う事で、普段使われているのがSCREEN1.5と呼ばれるモード。
表面上はSCREEN1ですが、VRAM上はSCREEN2と言う便利なモードです。
これを利用することで、SCREEN2の綺麗さでFONTが扱えます。
MSXは全部で256種のキャラクタがFONTとして扱えます。(2023年7月16日記事参照「Laboratoryテーマ15「任意サイズのFONTキャラクタを指定座標に表示させたい」)
それをズラーっと画面に並べると256種÷横32列=縦8行しか並びません。
そこで、それを縦に3つ並べると、縦8行×3=縦24行で横32列×縦24行と、MSXの画面サイズになります。
SCREEN1.5でFONTが上中下段で別のキャラクタが設定できるのはこういう理由です。
しかしながら、SCREEN1.5ではグラフィックツールで絵が描けないため、「FONT EDITOR」でキャラクタを作成する必要があります。
しかし8×8ドットのFONTで全画面分描くのはまず無理です。
出回っているFONTを描くツールを探しても16×16ドットが多いかな?
そう言った理由から、今回のLaboratoryテーマとなりました。
SCREEN2のデータをFONTデータに変換できるツールがあれば、WindowsのグラフィックツールでMSX1の16色で絵を描いて、「BMP to MSX」等でMSX1のSCREEN2へコンバート。
コンバートしたSCREEN2画像を、ツールを使ってFONT化。
これが出来れば、背景やボスキャラなど、大きなキャラクタの作成が非常に楽になります。
そろそろ「ゲーム制作」カテゴリで制作中の3Dロールプレイングゲームの敵グラフィックに取り掛かる必要があるため、Windowsで絵が描けるのは凄い効率アップです。
2023年09月12日
Laboratoryテーマを再々々追加!
今回も、「ゲーム製作」で制作中の3Dダンジョンロールプレイングゲームに関連するテーマを1つ追加します。
そろそろ、3Dダンジョンロールプレイングゲームに出現する敵グラフィックを描く事を考える必要がありますが、なんとか楽に描ける方法はないか検討した結果、SCREEN2で描いた絵をそのままFONTとして扱えれば簡単ではないか?と考えました。
Laboratoryのテーマに挙げ、SCREEN2のVRAM構成の説明も併せて考えたいと思います。
テーマ | ||||
25 | SCREEN2のグラフィックをFONTデータにして扱いたい |
SCREEN2のグラフィックをFONTデータとしてSCREEN1.5で扱えれば、いちいち方眼紙にグラフィック描いてそれをツールでFONTファイル化する手間が省けるので、キャラクタ作成が捗ると思います。
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月05日
バグ発見
Laboratoryテーマ22「文字列中の数字を数値に変換したい」のロジック中にバグを発見しました。
DEレジスタに、文字列中の数字部分の先頭アドレスを代入しコールするとAレジスタに数値として取り出せるサブルーチンです。
単体での動作は問題ありません。
問題はスクリプト内のコマンドに記述された数字を連続で読みだす際、その中に3桁の数字があるとエラーとなります。
なぜかと言うと、仕様では数値変換終えた後、DEレジスタは文字列中の数字の最後尾アドレスを指しているはずが、プログラミングミスで先頭アドレスのままとなっていました。
そこから読み込もうとする時、2つアドレスを進めたところから読み始めるので、2桁なら数字から抜けたところスタートなのでよかったのですが、3桁だと1の位スタートになるのでエラーとなります。
2023年9月1日の記事、Laboratoryテーマ22「文字列中の数字を数値に変換したい」と、
そのロジックを内包する、2023年8月29日の記事、Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@を改訂しました。
サンプルプログラムの再ダウンロードをお願いします。
ご迷惑おかけし申し訳ありません。
ロジックが複雑なサンプルが多くなるのでバグが増えそうです…。
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へ製作移行した理由の大半はそれです。
2023年08月30日
Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」そのA
さて、今回はLaboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」そのAです。
その@で公開したメッセージウィンドウに表示するメッセージデータを、レイアウトに合わせて作成するツールを公開します。
MESSET.BAS【ダウンロード】
使い方はサンプルに倣って、DATA文にメッセージを入力し「RUN」実行するだけです。
データレイアウトは下記となります。
【 レイアウト 】
イベント開始(0),メッセージ開始(1),メッセージ,スクリプト開始(2)(,スクリプト),1,メッセージ,2(,スクリプト),0,1,メッセージ,2(,スクリプト),1,メッセージ,2(,スクリプト),…,2(,スクリプト),END
0 | イベントデータ開始コード |
1 | メッセージデータ開始コード |
2 | スクリプト開始コード |
END | データ終了 |
イベント@ | 0,1,"おはよう。",2,"NX",1,"きのうはよくねむれた?",2 |
イベントA | 0,1,"やあ!",2,"NX",1,"きょうはねぶそくだよ。",2 |
イベントB | 0,1,"・・・",2 |
イベントC | 0,1,"ちょっとはなしかけないで・・・。",2 |
スクリプトは、次回説明します。
サンプルの中にある「NX」がそれです。
因みに「NX」は、「入力待ちして、メッセージエリアをクリア後、次のメッセージを表示」の命令です。
スクリプトが不要でしたら、記載の必要はありません。
記載がなければ、「ED」(EnD)命令が実行されます。
「ED」は、「入力待ちして、イベントを終了」の命令です。
下表はメッセージ中に組み込む制御コードです。
組込文字 | キャラクタコード | 動作 |
^ | &H5E | 改行 |
_ | &H5F | 入力待ち |
2023年08月29日
Laboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@
さて、今回はLaboratoryテーマ21「指定座標に指定サイズのメッセージウィンドウを開きたい」その@です。
「ゲーム製作」カテゴリで制作中の3Dダンジョンロールプレイングゲームで利用する、ドラクエ風メッセージウィンドウの実装準備をします。
実はちょっと自信作です。
メッセージ本文中に「^」(キャラクタコード&H5E)で改行、「_」(同&H5F)で入力待ちとなります。
ウィンドウ枠の右端までメッセージが行くと、自動で改行されます。
また、ウィンドウ枠下端まで行くと、メッセージが上にスクロールします。
詳しくはサンプルプログラムで機能デモをしていますのでご覧ください。
メッセージデータは、レイアウト通りに登録しないといけないので、専用の「メッセージエディタ」を後日公開しますね。
「MWOPSMPL.BAS」【ダウンロード】
メッセージウィンドウの機能を紹介するデモが実行されます。
説明しだすと切りがないので、BASICサンプルと、下部変数表で色々試してみて下さい。
D006 | 表示先Y座標 |
D007 | 表示先X座標 |
D008 | 表示幅 |
D009 | 表示高さ |
D00E | ジョイスティック |
D010〜11 | イベント1フラグアドレス(&HD042) |
D012 | メッセージ表示速度 |
D014 | メッセージ枠無しフラグ(0:有 1:無) |
D042 | イベント1フラグ |
マシン語のサンプルです。
起動すると、MWOPSMPL.BINを作成します。
「MWOPSMPL.BAS」【ダウンロード】
かなり長いサンプルとなっています。
「選択肢」のサンプルはもっと凄いことになります。
因みに1260行から1380行は、独自スクリプトを組み込む予定です。
2023年08月22日
Laboratoryテーマを再々追加!
前回「Laboratory」に追加したテーマに、何も手を付けられていないのに新たにテーマを追加しました。(2023年7月21日記事参照「Laboratoryテーマを再追加!」)
「ゲーム製作」で制作中の3Dダンジョンロールプレイングゲームで利用するメッセージウィンドウのサブルーチンが、他のゲームにも色々使えるのでこちらで紹介しようと思い追加しました。
これは制作進捗によりますが、メッセージウィンドウが必要になったら先んじて公開します。
あと、ずっと名前だけ上がっている「なんちゃって弾道計算」も追加しました。
テーマ | ||||
21 | 指定座標に指定サイズのメッセージウィンドウを開き、メッセージを表示したい |
ロールプレイングゲームなどによくある「メッセージウィンドウ」を、指定の座標に指定のサイズで開きます。
メッセージがあれば、ウィンドウ内に表示し、ウィンドウ内に収まらなければスクロール表示します。
22 | 文字列中の数字を数値に変換したい |
文字列データの中の数字部分を、数値として取り出す。
例えば、メッセージデータ中として「100えんあげる。」とあった時、数字部分の100はキャラクタコードの31,30,30の3バイトデータとしてデータ化されているが、それを数値の100としてAレジスタに入れる。
23 | コマンドを選択肢メニューを開いて、選択したい |
メッセージウィンドウを開き、その中に選択肢を表示し選択させます。
ウィンドウに収まりきらない選択肢は、選択肢の最上段で「↑」、最下段で「↓」でスクロール表示します。
24 | 簡単な、自機に向かって飛んでくる敵弾(なんちゃって弾道計算) |
三角関数を使った弾道計算は処理が遅いので、もっと簡単な弾道計算ロジックを考えます。
「Laboratory」で紹介したサンプルを組み合わせるだけでいろんなジャンルのゲームが作れそうですね。