奮闘図
超初心者向け
「FXGAゲーム作成日誌」

ご案内
この「日誌」はあくまでフィクションです。実在の人物団体とたまに関係がありますが、脚色が入っていることをお断りしておきます。
なお、この日誌の作者は今だに「GMAKER」をWin3.1上で使用しているため、所々に古い表現が出てきます。Win95上でご使用の方は適当に翻訳して下さい(例:「ディレクトリ」>「フォルダ」)
現在「第八日」まで掲載
第六日以降から読む

PC−FXのトップページに戻る
「PC−FXGAとは?」を見る
「「GMAKER」とは?」を見る
「「んーにゅー」とは?」を見る

第一日「GMAKERとの出会い!の巻」

さて、FXGAを購入し、「GMAKER」もインストールが済んだ。「よっしゃー!さっそくゲームを作るぜ!」徹夜君は雄叫びを上げた。「まずは手始めにパズルでも作るか。そしてお次はシューティング、格闘も外せないな。技術が蓄積されてきたら3Dアドベンチャー、そして究極のRPGを製作し、世界配給してがっぽり大儲けじゃ!」勝手な想像と期待を膨らませつつ、徹夜君はパソコンを立ち上げた。
Windows3.1の画面上には「PCFXGATOOLS」「DoGACGASystem」のグループが出現し、確かにインストールに成功している。勇んで「PCFXGATOOLS」をクリック、中身を見る。「・・・?」何やらアイコンが5、6個並んでいる。片っ端からクリックし、実態を確認する。「AIDMARGE」…概要を見ると、画像データ変換に関するものらしい。しかしどうもよく分からず次を見る。「BMP2AID」…あ、これは何となくわかる。WindowsでおなじみのBMPファイルをFX用に変換するツールってわけね。じゃあ「ペイントブラシ」でも充分FX用の絵を描けるっちゅうことだ(考えがせこい)。「AIDMARGE」はこれとの組み合わせで使われるようだ。「MpConv2」…なになに、WindowsやMACの動画データをFX用に変換する?そ、そりゃすごいやんけ(何人だか不明)。あの美麗なFXの動画を自作出来るのか!ふっ、太っ腹!
…とか何とか言いつつ、いじくりまくる徹夜君。しかしこれだけでどうやってゲームを造ると言うんであろーか。少々不安に駆られてきた徹夜君は「FXGA」と書かれたディレクトリへと手を延ばした。ルートにはお約束の「readme.txt」が。さっそく読んでみる。説明には「FXGA」ディレクトリ内の構成が示されていた。「DOCディレクトリ内に解説が集中してる訳か。読んでみよう」と、そこへ進む。「fxgasys.txt」を読むと、FXGAのゲーム開発の流れが簡単に書いてある。「おおっ。これだこれだ」ざっと目を通した結果、徹夜君は次の事を理解した。
「…とりあえず今日は寝よう…」
目を閉じた彼の脳裏には見知らぬ無数の英数字が飛び交っていたのでありました。
次回予告「GMAKER内大探索!の巻」

第二日「GMAKER内大探索!の巻」

前日突然睡魔に襲われた徹夜君は、この日目覚めると、頭がまだ真っ白なうちに改めて「fxgasys.txt」を読んでみた。それによればFXGAのゲーム開発は、「C言語」でプログラムを書き、それを「FXCCコンパイラ」にかけ、さらに「FXLKリンカ」にかけて「EXファイル」などの実行形式ファイルにする、という流れをとるらしい。「アセンブラ」なる言語による開発をすると高速度のプログラムが打てる事も分かったが、「スターターキット」ではアセンブラ言語はサポートされていなかった。
「ちゅうことは、「C言語」でプログラムを書きゃ良いわけね」
さっそく徹夜君は学校の帰りに本屋に立ち寄り「C言語」の初心者向け解説書を購入、勉強を始めた。(この日誌では「C言語」の解説まではやってらんないので飛ばそう。全然知らん、という人は簡単な入門書を買ってから以下を読むことをお勧めする)
上記のような事情もあって、徹夜君はその聡明さのあまり、帰宅中の電車内で「C言語」のおおよそはつかんでしまったことにして先へ進もう。さて帰宅後パソコンを立ち上げた徹夜君は、再び「fxgasys.txt」に向かった。そこには「実際の開発手順」として「DoGAGINIE」で作成した3Dモデルを、FXGAでTVに表示する手順が示されていた。C言語で書かれたコードも載っており、そのままコンパイル、リンクすれば実行ファイルができちまうらしい。それにしてもたったこれだけのために何やら無数の未知の単語が並んでいる。「Farl」「AGL」とは?「HuC6261」「HuC6273」とは?謎が謎を呼ぶ。大ざっぱな開発手順は判明したものの、肝心のプログラムを書くためにはあれこれFXGA独特の知識を吸収しなければならぬらしい。
「しょーがねぇなぁ。じゃあ「DOC」ディレクトリ内の文書を全部読んでやるか」
思い立ったのは良かったが、これが予想を遥かに超える膨大な量にのぼることを、徹夜君は知らなかった。文章だけながら総量15メガバイト以上。テキストファイルとWindowsのライト形式で様々な情報が書かれている。内容ごとに以下のディレクトリに分類され、実際の「GMAKER」インストール時のディレクトリ構成に対応している。
いかに聡明な徹夜君といえども、この膨大かつ難解な解説書オンパレードの前にはただ呆然と立ちすくむのみであった。
「…今日はもう寝よう…」
またしても睡魔の襲撃を受けた徹夜君。それでいいのか?こんな彼に明日はあるのか?
次回予告「とりあえずサンプルを動かせ!の巻」
第三日「とりあえずサンプルを動かせ!の巻」

さてまたしても睡魔に襲われた徹夜君であったが、取り敢えず目覚めて考えた。
「そういやSAMPLEというディレクトリがあったような…」
そう、確かに「SAMPLE」というディレクトリが存在する。人に売り付ける商品たるもの、大概お試し用のサンプルが存在している。「GMAKER」のような商品には当然「これを使えば、こんなモノが出来まっせ」というようなサンプルを提供しているハズではないか?膨大かつ難解な解説を読むより、まずは何かを動かしてみるべきではないか?このままではいつまでたっても何も出来ない、と思い立った徹夜君は、さっそくサンプルプログラムを覗いてみた。
ここもまた色々なサンプルがあるようで内容により分類されている。ざっと見渡していた徹夜君は「game」というディレクトリを発見した。「おおっ、やはりあったか」早速中身を見てみる。「〜.c」やら「〜.h」やらいうファイルがやたらにあって、何が何だか分からない。とりあえず救いの神「readme.txt」を発見し読んでみる。そこには各ファイルの役割がざっと説明されていた。すると「start.bat」なるファイルがサンプルゲーム起動用バッチファイルであることが判明。拡張子「bat」のファイルを実行すると、そこに書かれている一連の動作が一挙に実行されるという程度のことはさすがに知っている徹夜君は、早速このファイルを実行に移した。
Windows上にはDOS窓が出現、何やら英数字が黒い画面にドワーッと出現する。「…」しばし待つ。やがてTV画面は青くなり警告文が表示された。「これは営利目的としないものです…以下略」てな文。「おお、どうやら動いた」喜びつつ待っていると、やがて画面は真っ暗に。画面上方に「NowLoading…」の文字が。これが長い。パソコン画面を見ると次々とロードされるファイル名が表示されているので別に異常はないようだ。そして約一分後ついに!音楽と共に「BULLYOFF」のトップ画面が出現!ただちに対CPU戦を選択する(ここからパッドによる操作が可能になる)。
TV画面は再び暗くなりロード中の表示が出る。これがまた長い。「うーむ、やはりCD−ROMのようにはいかないのかなあ」とつぶやきつつ待っていると、音楽と共にゲーム画面が現れた。いきなりポリゴンの敵機がこちらへ迫ってくる。「え?え?操作は?」バタバタとパッドを操作するうちに自機はあっさりリングアウトし漆黒の闇へ落ちていく。情けない音楽と共に「ゲームオーバー」の声。
「ま、いいや。とりあえず動いたし。さてと止めるか」パッドでリセットを指令する。あれ?ポーズがかかるだけである。何度やってもダメ。「…ってことはどうやって終了すりゃいいのだ?」結局わからず98をリセット。もう一度立ち上げて調査を開始する。
「game」内のいくつかのテキストファイルを読んでみるが、ファイルの説明やメモリマップ、操作方法の説明があるものの、終了方法が分からない。最後の手段として徹夜君は起動バッチファイル「start.bat」の中身をメモ帳で読んでみることにした。そこには「fxdb ysound;ybullyoff;rg」の一行があるのみである。たった一行ながら意味不明。ただfxdbの文字からデバッガ「FXDB.EXE」を起動している事が判明した。「そうだよな、製品じゃないんだからデバッガで起動する訳か」悟った徹夜君はdocディレクトリに戻り、デバッガFXDBの解説を読むことにした。
悪戦苦闘の末、以下のことが判明した。「fxdb yファイル名;rg」でFXGA標準実行ファイル「〜.ex」がデバッガで実行されるということ。ゲームを中断するには「CTRL」キーと「B」または「C」を同時に押せばいいこと。さらにデバッガそのものを終了させるには「q」コマンド一発で良いことも判明した。その他の細かいことは依然理解していないものの、これだけ知ってれば取り敢えずデバッガでプログラムを実行できる。徹夜君は少しは前進したのでありました。
「そーとなりゃ、他のサンプルも実行してやろう!」と、徹夜君は「sample」ディレクトリに収められた各種サンプルに手を出した。ほんとにいろんなサンプルが存在するが、ゲームは存在しない。以下にディレクトリごとにそれを挙げよう。
他にも「common」などというディレクトリも存在したが、何やら意味不明なのでここでは触れない。
さて、一通りいじり倒した徹夜君は考えた。「とりあえずこれらサンプルプログラムを改造して動かす事から始めるのが無難なんだろうな…」と、一応各サンプルのソースコード(拡張子「.c」)をメモ帳で読んでみる。確かにC言語で書かれたソースであり、何となく分からないでもないのだが。
「よしっ!とりあえず今日はもう寝よう!」 なぜかこの日は気負いたって睡眠に入る彼であった。
次回予告「自分の絵をTVに映せ!の巻」
第4日「自分の絵をTVに映せ!の巻」

さて、サンプルプログラムを一通り動かした徹夜君は考えた。
「ポリゴンは面白いけど…やっぱ難しいからな。初心者は2次元に絞って勉強するべぇ(どこの出身じゃ)」
2次元といってもゲームでは大きく2つの種類がある。簡単に言うと「一枚絵」と「スプライト」である。「一枚絵」のほうは想像できるように背景やビジュアルシーンで使用される「動かないデカい絵」である。よく「BG」などと表現されてるのは、こいつの事だと考えていいらしい。 一方の「スプライト」はかなり一般にも知られるようになったゲーム用語で、プログラムやプレイヤーの指示に従って画面内を動き回る絵のこと。語源は空中を飛び回る「小妖精」のことで、なかなかファンタジックなネーミングである(同名の清涼飲料はどういう意味でつけたか知らんが)。このスプライト表示能力が即ゲーム機の能力に結びついてしまうほどで「ゲームの命」とも言える重要な要素である。
そんなこんなで徹夜君は、よせばいいのにいきなりスプライト表示にアタックする事を決意した。サンプルに「ASL」というスプライトを扱うライブラリを使った物が含まれていたので、これをいじれば何とかなると思ったわけである。
では、とサンプルの「ASL」のディレクトリを覗いてみる。例によって救いの神「readme.txt」を読むと、ここの各サンプルはまず「texload.ex」を実行してテクスチャバッファ(FXGA内の画像をためとく場所、という程度に考えておく)にスプライト画像をロードする。そしてこれを終了した後、各「なんとか.ex」を実行すりゃいいようである。自分の絵を映す前に素直にサンプルを実行してみよう。まずはASLディレクトリに移動してっと、
>fxdb ytexload;rg
これで何やらドカドカ表示された後、TV画面にGA初期画面が出る。ここでRUNボタン。パソコン画面(DOS画面)に「Sprite date Loading…」との表示が出て、やがて「done.(終わったぜ!)」と告げてくる。ここで「CTRL+C(またはB)」を押して強制停止させ、「q」でデバッガを終える。これでテクスチャバッファにスプライト画像が入ったらしい。そこでまずは「sprot.ex」を実行してみる。
>fxdb ysprot;rg
しばらくしてまた初期画面。RUNを押すと…出た!南国の島を描いた切手のスプライトがグルグル回っている。ではまた強制停止して次行ってみよう。テクスチャバッファの画像データはそのままだからもう一回ロードする必要はない。
>fxdb yspquad;rg
今度は先ほどの切手が倒れたり起き上がったり(腹筋運動?)する。台形変化とか言う奴らしい。
>fxdb ysptwist;rg
今度は北京辺りにあるような建物が雑巾絞りのようによじれる。「あれ、さっきと画像が違うぞ?」と思いつつ次へ。
>fxdb yspzoom;rg
今度はいろんな絵が入った長方形の画像が近づいたり遠ざかったり。よく見ると先ほどの切手や建物の絵が含まれている。なるほど、これがロードした画像の全体像であるらしい。このうちの一部分を切り取った奴が先ほどのサンプルで使用されてるらしい。
手順と機能が分かったところで、いよいよ改造に移る。まずは「texload.ex」のC言語ソースコードである「texload.c」をエディター(徹夜君の場合「メモ帳」ですましている)で開いて中を読んでみる(全文引用したいところだが長くなるのでカット。「GMAKER」をお持ちの方はご自分のを見てもらいたい)。徹夜君は始めのほうにある次の一行に目を付けた。
fp = pio_fopen( "spdata.aic", "rb" );
後の部分はよく分からんが、この一行はどうやら「spdata.aic」なる画像ファイルを取り込むよう指定しているものらしい。確かに「ASL」ディレクトリ内に「spdata.aic」が存在している。「ということは、この部分を「なんとか.aic」に書き換えて、「なんとか.aic」を自作しておけば、それがTVに表示されると言うことではないか?」道が開けてきたぞ。
なんちゅうても世の漫画描きにとって自分の絵をTVに表示するのは最大の野望と言っても過言ではあるまい。何か手段が違うような気もするが、とにかく自分の絵をTVに映してみよう。
まずは適当なグラフィックエディターで絵を描く。Win3.1使用の徹夜君はとっとと「ペイントブラシ」で絵を描いてしまった。サムライの絵を描いたのでとりあえず「samurai.bmp」と名づける。これを例の「BMP2AID」で変換すりゃいいのである。そこでさっそく「BMP2AID」を起動だ!
これはWIN上のソフトなので詳細なHELPがついている。手順が書いてあるので、それに従って順番にやればまず間違うことはない。「入力ファイル」のコマンドで「samurai.bmp」を選択すると、左画面にそれが表示される(注:サイズが256×256以上だと文句が出てカットされる)。そして「変換実行」ボタンをクリックすると、あっという間に右側に同じような画面が表示される。「え、もう変換終わったの?」拍子抜けするほどである。ここで「PCーFXイメージ出力」ボタンをクリックすると、TVにそれが表示されると言うのでドキドキもので待つ。しばらく後、「やったーっ!」TV画面にサムライの絵が!ついに自分の絵をブラウン管に映す野望は達成されたのである!
ではおもむろに保存である。「出力ファイル」を選択して「samurai.aid」と名づけ、「ASL」ディレクトリに保存した。「さあて、では例の一行を書き換えて…」と、その時である!徹夜君は根本的かつ重大な問題に今ごろやっと気づいたのである!
「おい、この変換ツールで出来るのは「AID」ファイルじゃんか!「〜.aic」作るにはどないしたらええねん!?」またしても出身地不明の叫びが挙がる。
「くくっ…今日はもう寝るぞ!」
まさに「長い説明したのはいいが、結局ちっとも進歩がない」というところ。さあ徹夜君の運命はいかに。それは次回で。(中国演義小説風のしめくくりでした)
次回予告「スプライトおよびBGとの大格闘!の巻」
第五日「スプライトおよびBGとの大格闘!の巻」

さて徹夜君は「〜.aic」ファイルの謎を解明するべく、またまたdocディレクトリへと足を延ばした。謎の回答を求めてウロウロするうちに、「bin」の中に「aid2aic.txt」なるファイルを発見した。「これだ!」とさっそく読んでみる。何のことはない。binディレクトリに入っている「aid2aic.exe」を使用すれば「aid」ファイルはあっさり「aic」ファイルに化けてくれるのであった。「そ、そんな簡単な事なら「bmp2aid」のヘルプにでも一言書いといてくれよ〜」とブツブツ言いながら、徹夜君は行動に移った。
>aid2aic samurai.aid
ほとんど一瞬で作業は終わり、ディスク内を見ると、なるほど「samurai.aic」が生成されている。では「texload.c」の書き換えだ。前日に目を付けておいた、
fp = pio_fopen( "spdata.aic", "rb" );
の「spdate」を「samurai」に変えちまえばいいわけである。つまり、
fp = pio_fopen( "samurai.aic", "rb" );
となる。後の文を見渡すが、別に不都合は無いようなので、改造したC言語コードを「stexload.c」とでも名づけて保存しよう。そしてさっそくコンパイル→実行ファイル製造の作業に取り掛かる。
当初、徹夜君はコンパイラ「fxcc」やリンカ「fxlk」の説明文をしつこく読み、その使用に何やらおびえていたが、各サンプルのディレクトリには「mk.bat」なる実行ファイル生成用バッチファイルやリンク用インダイレクトファイル(リンクする際必要な複数ファイルを指定したもの)があらかじめ用意されており、それをちょこっといじればいとも簡単に実行ファイルは作れるのである。とか言ってるが、初めてやる人はエディターなどで「mk.bat」や「linkfile」等の中身をあらかじめよく見よう。何やら難しい事が書いてあるが、この場合「texload」となっている個所を全て「stexload」に書き変えちゃえば問題ない。もとの状態を維持したい人はディレクトリごとよそにコピーしてやってみるのも手だ。
>mk stexload.c
このコマンド一発で、C言語コードがコンパイルされ、そのままリンクされる。成功すればDOS画面に「××× symbol entry.」とか表示されて無事終了する(とにかく「error」の文字さえ見なければだいたい成功している)。実行後、徹夜君がカレントディレクトリを覗くと実行ファイル「stexload.ex」が出来ている。大成功だ!(ちなみにコンパイルに成功してリンクに失敗していると「stexload.o」というファイルが生成されるだけ)
さあ、それではさっそく自分の絵のスプライト表示にアタックしよう。まずは作ったばかりの「stexload.ex」を実行して「samurai.aic」をテクスチャバッファに読み込もう。
>fxdb ystexload;rg
しばらく後「done」と出るので「CTRL+C」「q」で終了する。ここから後は各サンプルを実行すりゃいいわけで、前日とやることは一緒だ。
>fxdb ysprot;rg
「ありゃりゃ…」思わず徹夜君は呻いた。何やら異様な物体がグルグル回っている。よく見るとこの物体、自分が描いた絵の一部であるらしい。「あ、そうだ。全体像が出たのはspzoom.exだったっけ」思い出した徹夜君はさっそく「spzoom.ex」の実行に移る。
>fxdb yspzoom;rg
今度は大成功!サムライの全体像が近づいたり遠ざかったりする。これでようやく自分の絵をスプライトとして扱えるようになった訳である!
もっともまともに実行できてるのは「spzoom.ex」のみ。他のサンプルでは絵の一部分が拡大表示されるだけである。「まあ、そんなのは元のC言語コードをちょいと書き変えりゃいい訳だろ」てな具合に徹夜君はタカをくくり「ではスプライトを制覇したところで、次はBGだ!」とさらなる目標へ前進するのであった(やがて、この時の考えがいかに甘いものであったか彼は思い知ることになる)
スプライトをすっぽかして自分の絵のBG表示にとりかかった徹夜君であったが、大きな問題に直面した。そう、スプライトの時の「ASL」のようなライブラリやサンプルが見当たらないのである!
「どっしぇ〜っ!」慌てる徹夜君は「fxga」ディレクトリ内を、あっちゃこっちゃさまよい歩く。すったもんだのあげく、FXGAのBG表示はどうやら「HuC6272」なる部品が担当しているらしいことが判明した。さらに、この「HuC6272」が「KING」という愛称(?)で呼ばれているらしく、「vlib.a」というライブラリがこれ関係を扱っていることも分かってきた(詳細は「vlib.txt」にある)。さらにさらに、サンプルゲーム「BULLY OFF」が当然背景のBG表示を行っており、これのソースコードを当たれば、どこかにBG表示のプログラムが書いてあるはず、という事も分かった。
「た、大変だが…やるしかあんめ…」 泣く泣く徹夜君は「BULLY OFF」の膨大なソースコードの中へと飛び込んだのであった…。
悪戦苦闘、支離滅裂、前後不覚、阿鼻叫喚、意味不明の戦いの末、徹夜君は「BULLY OFF」の処理の中心部分を記述した「game.c」の中にどうやらBG関係らしい関数(えーと、いまだにC言語を全く知らずに本文を読んでいる人のために説明すると、C言語で「関数」ちゅうのはコンピュータに何か処理をさせる「命令」の事だと漠然と覚えとこうね。分かんなかったらC言語入門書をいいかげん読んでね)を発見した。以下にそれを挙げよう。
KINGScreen();
KINGCls();
KINGScroll();
KINGCylinder();
KINGChangeSize0();
KINGDispOn();
BackScroll1();
READBG();
まあ、見ての通り。「KING」とか「BG」と書いてある関数をしらみつぶしに当たったのである。さてそれらしき関数を発見したのは良いが、それぞれがいかなる処理を行うのかはまだ分からない(字面で見当がつかなくはないが)。
関数と言う奴はプログラムのどこか、あるいはリンクするライブラリにそれの行う処理が記述されているハズ。というわけで探し回るとREADBG()の内容は「fileio.c」に書かれていた。要するに()内に読み込むBG用画像ファイルを指定すると、それをちゃんとFXGAの中に読み込んでくれる関数だ。うんうん、これは使える。後で自作プログラムを作るときにそのまんまかっぱらおう。
BackScroll1()も「game.c」の末尾に処理が書かれているのだが、「KINGScroll(KING_BG0, backpos1 & 0x1ff, RASTER_SCROLL1)」なんて一行が書いてあるだけ。結局「KING」から始まる関数群を調べねばならないわけ。ではその処理はどこに書かれているのか?徹夜君はさんざん探し回ったが、なかなか見つからない。
「うう…もう寝…」
いつものパターンに落ち込む寸前、徹夜君はようやくこれらの関数の説明文を発見した!なんと「game」ディレクトリの下の「lib」ディレクトリ内の「libm.txt」の中にそれらはあったのである!つまりライブラリ「libm.a」内でこれらの処理が定義されている訳だ。いくら探しても見つからないはずである。
「よ、ようやく見つけ…た。で、では…さっそく読も…」
バタリ。徹夜君はここで完全に力尽き、深い眠りに入ったのでありました。
次回予告「BG表示、そして再びスプライト」

第六日以降を読む
☆ご注意☆
そろそろこの「日誌」も佳境に入って参ります(と思う)。というか、だんだん複雑な話になります。逃げを打つようですが私文系ですので、かなり無駄な、あるいは間違ったプログラムをする可能性が大いにあります。一応これを書くに当たって実際にその通りの事をやって確認をしてはいますが、完全な保証は出来ません。FXGAやC言語のプログラミングに詳しい方、お気づきの点がありましたらご教示下さると幸いです。またこの「日誌」の本来の対象であります初心者の方でもお気づきの点、ご要望がありましたらメールでお伝え下さい。