◆ゲームシステム
ゲームのシステムというと最近はWindows 95も、そのような方面を取り込んでいたりするようです。雑誌ではGame OSとか書かれていたりする事もあります。
いくつかゲームを作っていくと次第に使い回しのプログラムが増えていきます。これは普通「ライブラリ」と呼ばれアセンブルまたはコンパイルするときに使用され使い回します。が、やがて同じプログラムを使うのだから、いちいちアセンブルやコンパイルするなんて面倒です。となるとアセンブル・コンパイルしておいて(オブジェクトの状態で)使えば手間も省けるというのものです。こうやってゲームのシステムができあがっていきます。
どこでも同じ様な事をやっていますが、これを自分なりにまとめて4Kバイトというコンパクトなサイズにまとめたのが「System-7B」でした。
◆サンプルゲーム
このSystem-7Bを使用したサンプルゲームが、このFirst Roadでした。サンプルなどでプログラムも短く、ゲームも2Dのレースゲームになっています。がただの2Dではなく、斜め俯瞰する感じになっています。という事はX,Y座標だけではなく奥行きZ座標も必要とします。ただ道幅が狭いので「透視変換」は行っていません。また、Z方向にあわせてキャラクタもソートしていません。この頃ソートは「バブルソート」「クイックソート」あたりしか知らなくてクイックソートは面倒だったので使った事はありませんでした。バブルソートも遅いので結局つかってません。しかし、Z座標にあわせて表示キャラクタをソートしない事にはぐちゃぐちゃになって奥にある車が手前の車に上書きされてします。
◆手抜き
面倒な事はやらない方なので(笑)、表示する際にカウンタを用意しておき、そのカウンタと一致したキャラクタを表示するという方法にしました。これは以前作成したメトロクロスに手を加えて流用したものです。ここで、よくよく考えてみると邪魔をする車だけではなく、自分の車も邪魔する車と一緒に表示してやらないとおかしな事になってしまいます。スペースハリアーなど疑似3Dでは、自分は常に一番手前なので最後に自分を表示してやるだけです。
今までは自分のキャラクタと敵の必要とするパラメータ(バッファ)は異なっていましたが、ここからは敵も自分も同等にみなす、という方式に変化していきました。この方式のおかげで今まで自機と敵の表示プログラムを別々に作っていましたが1つですみます。このように敵と自分を同じ扱いにすることで、かなり利点が増えていきました。
◆System-7Bと、その役割
このゲーム以降、私が発表していくゲームは、このSystem-7Bを使用したものになりました。プログラムサイズが4Kとコンパクトな事と4Kごとのブロック単位で移動させる事ができたからです。必要なプログラム(ルーチン)は、ほとんどこの中に収まっていました。しかし、LOGINなどで売っている「RPGツクール」とかとは違って特にシューティングゲームとかRPG(ロールプレイングゲーム)しかできないといった汎用性のないものではありません。Eyelarthなどゲームでもない変なものも作れてしまうほどです。
このSystem-7Bがほぼできあがっていた時にMacintosh (II/SE)との出会いがありました。もし、このMacIIと出会わなかったらSystem-7Bの完成度は少し低くなっていたかもしれません。MacIIの面白そうなウィンドウとかメニューとかを最後にSystem-7Bに強引に入れ込みました。ところが、空きメモリがすでにほとんどなく、とてもウィンドウ表示ルーチンなどを入れる余裕はありませんでした。そこで一計を案じて「ウィンドウをPRINT文(ルーチン)で行う」という暴挙にでたのです。ウィンドウ表示プログラムが作れないほどメモリが少なかったため、ウィンドウ表示をするデータをPRINTルーチンに渡しているのです。
他にもメモリを節約するために一計を案じたものがたくさんあります。また、汎用性を欠いてしまうルーチンは取り払いました。こうして発表時には、かなり完成度の高いものになっていったわけです。そして、もう1つ完成度を高くするために同時進行としてSIDE ROLL -F-も制作しました。このゲームについては、また別の所で書くことにしましょう。
◆System-7Bのルーチン群
Oh!Xに発表されましたが、すでにバックナンバーもなく雑誌もないので資料も何もあったものではありません。という事で、どのようなルーチンがあったのか紹介しておきます。手元にはプログラムリストを出力したものもありますが、ここでは掲載する必要はないでしょう。
・キャラクタの当たり判定 ・最大値でなければカウント増加 ・最小値でなければカウント減少 ・BCD (Binary Code Decimal)を表示 ・平方根演算 ・8ビットx8ビット乗算 ・8ビット符号演算(SGN) ・16進数から10進数に変換 ・16ビット÷8ビット除算 ・16ビットx16ビット乗算 ・10進数から16進数に変換 ・乱数発生 ・実画面の座標計算 ・仮想画面の座標計算 ・プログラムカウンタの値を読み出す ・プログラムカウンタオフセットジャンプ ・リスタート ・一時停止制御/復帰処理 ・キー入力待ち ・ファンクションキー入力チェック ・1文字入力 ・カラー変更 ・仮想画面を実画面に転送 ・スコア表示 ・スコア演算およびハイスコア自動更新処理 ・自機移動処理(移動範囲指定あり) ・自機移動処理(デモ用) ・自機移動処理(4方向のみ) ・自機移動処理(横2方向のみ) ・自機移動処理(縦2方向のみ) ・PUTルーチン(キャラクタ描画) ・PUTルーチン(クリッピング処理あり) ・PUTルーチン(手前と背景の間にキャラクタを描画する) ・PUTルーチン(拡大縮小処理つき) ・ボックス描画(枠のみの箱) ・ボックスフィル描画(塗りつぶされた箱) ・ボックス描画(表示の際、色反転) ・GET(仮想画面の内容をメモリに取り込みます) ・円を描画 ・円を描画(表示の際、色反転) ・ラインを描画 ・ラインを描画(表示の際、色反転) ・水平高速ライン描画 ・連続ライン描画 ・セミグラフィックのドット表示 ・セミグラフィックのドット消去 ・パターン描画 ・カラーのマスキング処理 ・カラーコード減算処理 ・カラーコード演算(AND, OR, XOR, +1, -1, 反転, 補色, 1/2, 2倍, 加算, 減算, etc.) ・カラー変更 ・スムーズな色変換処理 ・カセットテープからサンプリングする ・サンプリングしたサウンドを出力する ・データ圧縮 ・データ展開 ・塗りつぶし(PAINT) ・サークル描画後塗りつぶし ・敵から自機に発射する弾のデータを求めます(確実に狙ってくるタイプ) ・敵から自機に発射する弾を1回分移動させます ・文字列表示 ・メニュー表示 ・メニュー選択 ・ドット単位でのゲージ表示 ・メニュー表示後、メニュー選択処理 ・ウェイト処理 ・イニシャルメッセージ表示処理