Making「F-DOT2」その1

Home PC-6001mkII Program etc

 このページでは、元ソースの解析から移植開始までの過程を書いています。

Making「F-DOT2」 Top


2011/03/xx:はじめに
 SBFZの作成も一段落したし、次は何を作ろうか...。

今年で初代機も30周年を迎える事だし、やはりここは初代機用のものを作るべきだろう。と思っていた所で、以前に構想だけしてほったらかしにしていたもののノートが見つかった。なんか2009年8月の日付が入ってるぞ?

 はじめはmkII用に考え始めていたものだったが、なんとか初代機で動かせないかな?ちょっとやってみるか。構想中のゲームのタイトルは「F-DOT2」。

2011/03/xx:概要
 「F-DOT」ではSCREEN3の固定画面だったが、今回は「ASALT」で作ったセミグラの回転画面を応用したい。こんな雰囲気で。

こんな雰囲気

 あと、前作でもあった慣性やリプレイは継承したいな。ドリフトも出来れば良いけど、これはまあ目標で。

 ただ、やはりメモリ容量が心配だな...。回転用のマップだけで16KB使ってリプレイ用データも入れるとなると、果たして32KB内に収まるのだろうか?この辺りはおいおい考えていくことにしよう。

2010/03/27:リプレイ枠
 マップと共に容量を食いそうな、リプレイデータについて検討する。

 前作「F-DOT」では、600秒以上のキー操作を記録させていたので、やはり同程度の時間は考慮すべきか。とすると、15fps(目標)で1回あたり1バイト使うとすると...

15fps x 600秒 = 12,000バイト

 約12KBか。マップが16KBなので、合わせて28KB。さすがに心許ないな。

 うーむ、入力情報としては、左右とアクセル、ブレーキでいいか。これで情報は4bit。さらに上位4bitに連続数の情報を入れると、同じ入力が最大16回連続しても情報は1バイトで良くなるか。これで1/4くらいに圧縮されないかな?

2011/04/16:マップ作成方式
 しばらく間が開いてしまった。面データについて考えることにする。

 今回は、「F-DOT」でやったように道部分を描画する方式にしようと思う。この方がデータを少なく出来るからだ。描画に手間がかかるのが難点だが...。

 F-DOTでは道の左右を直線で描画して最後に道の中央部分でPAINTを実行していたが、マシン語でPAINTを実装するのはなかなかホネなので、以下のように若干方式を変える。
  1. はじめにマップ部分をFFHで埋める。
  2. 道幅(路肩を含めて6x6キャラ程度?)の大きさの円をマップ上にAND描画する。
  3. 円の移動用データを用意し、移動用データに沿ってコースを描画する
  4. マップデータのFFH部分を緑系の色に変更する。
  5. スタート/ゴールを追加

 さてデータだが、暫定的ではあるが、以下のように1データ1バイトにしようと思う。この辺りの考え方は、「F-DOT」を踏襲している。
bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
連続移動回数(1-16)左右フラグ曲がり具合(0-3)
 これで、1面あたりの面データは数10バイトに収まる...はず。

2011/04/18〜05/09:細切れ実装
 4/16に検討した方式を元にマップ作成ルーチンの作成を行う。
まずは、道路部分の描画を行うための円キャラクタの移動部分から...こんなものかな?まあ、実際に面を描いてみないとなんともいえないが。

 次に、3/27で考えたリプレイのルーチンを作成する。ただ、これも一通りゲームが出来てからでないとうまく機能するかどうかがわからない。これはしばらく置いておくか。

 次、キー/ジョイスティック入力を1バイトデータにまとめるルーチンを作成する。
↑かスペースキーかトリガがアクセル、↓かシフトキーがブレーキにして...あ、でもタイトル画面では上下で選択してスペースキーかトリガで決定したいな。これを分けた情報も別途用意して...。
KEY/JOYbit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
KEY
JOY
SPC
TRG
SFT
-




↓/SFT
↑/SPC
↑/TRG
 こんな感じ?

 あとは、マップ全体を視覚化するために、簡易縮小表示ルーチンを作るかな?マップ作成時の確認にしか使わないかもしてないけど。マップが96x64(暫定)なので、横が3つおき,縦が4つおきでマップからデータを取り出して画面に反映させるか。
 いくつか細切れで作成はしたが、動作を確かめるにはもう少し足りない。

2011/05/11〜18:マップ作成
 マップ作成ルーチンの中盤、円描画ルーチンを追加する。これで、後は面データを追加すればマップが作成できるはずだ。少しだけ面データを入力して様子を見る。

マップ表示

 ...2つほど問題がある。1つは、曲がり具合が予想以上に急だった事、そしてもう一つは面データを作成するには表示が荒すぎる事。
 とりあえず、もう少し緩やかに曲がることができるように、面データの形式を変更するか。

 4/16に考えた時点では32方向で考えていたけれど、これを256方向と細かくしてみる。合わせてデータ形式を以下のように2バイトを1セットにする。
#bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
1バイト目曲がり具合(-127〜127) 80Hならデータ終了
2バイト目連続移動回数(0〜255)
 さて、次はマップの画面表示だ。今度は、マップの1マスをセミグラフィックの1ドットに対応してみる。当然、64x48の範囲でしか見えないがまあいいか。むしろ有効範囲を64x48にするか。

 こうして、サンプルの面データを1面だけ作成し様子を見る。

マップ表示2

 回転画面でどうなるかはまだわからないが、マップとしてはまあまあかな?ちなみにこれで面データは22バイトになる。

2011/05/21〜25:回転画面表示
 さて、いよいよメイン画面の表示だ。

 ASALTのマシン語ソースから、拡縮回転画面表示部分の処理を抜き出して修正することにする。
 ASALTでは8色+黒表示の豪華仕様(?)だったが、今回は速度重視のため4色+黒表示に変更する。8色+黒だとアトリビュート部分とキャラクタ部分の両方に書き込まないといけないが、4色+黒だとキャラクタ部分への描画だけで良いので、その分若干処理が軽くなる。

 適当な座標をセットして実行!

回転画面表示1

 一見うまく表示できているが、いくつか座標を変えて試してみるとどうもX方向に縮んでいるように見える。
 という事で、日を改めて調査を行った。どうやらASALTとの処理の違いが影響していたようだ。
 ASALTではアトリビュートとキャラクタの2箇所を書く関係上、データも2バイトで1組になっていた。今回データを読み込む処理を変更し忘れていたので2バイトおきにデータを読む形となり、結果X方向が1/2に縮まっていた。とまあ原因がわかったのでサクっと修正。

 あとはそろそろ地面の色もちゃんとするか。ある程度ランダムな感じにしたいがどうしようか。試しにRレジスタの値を2回取得しOR演算した値にしてみたが、思ったほどきれいなランダムにならない。
 それでは と、「く」の字に3つドットを配置したメッシュ(?)キャラとRレジスタの値をOR演算してみる。うん、割とイメージどおりになった。

回転画面表示2


2011/05/25:移動
 画面が出たらやっぱり動かしたいよね、という訳で自機の移動を実装していく。

 はじめにカーソルキー左右で回転...前に作っていたキー/ジョイスティック入力ルーチンにバグがあった。少し修正しつつとりあえず回転まで完成。

 次は前方向に移動する処理だ。まずは↑を押したときに速度固定で動かしてみる。このあたりはASALTでやった処理に速度を掛け合わせる処理を組み合わせるだけなので割と楽だ。

 さて、今度は速度の調整だ。今回パラメータとして、アクセルを押した時の加速度,ブレーキを押したときの現速度,何もしない場合のエンジンブレーキの3種類を用意する。

 合わせて、約15fpsになるようにウェイトを入れる処理を追加する。Timer値から換算した値だとなぜか遅くなってしまったので、エミュ上の描画をみて微調整する。この状態で、自機の最高速度のあたりを付ける。
 少し速いくらいだけど、きりの良いところで64/256マス位かな?これで速度情報8bitのうち6bitで事足りるので、内部的にあと2bit細かくして1/1024マス単位にする。

2011/05/26〜27:オフ会準備
 一応動くところまではきたので、コリジョン処理を追加しようかな?

 緑は地面、黄色が砂地、青と赤が周回判定というような判定にしたいので、データを64で割って1と足した値をコリジョンデータとして設定する。ただ、道路(00H)も緑の部類に入ってしまうので、ここだけ特別に0を設定する。

 砂地部分をどうするかは後ほど考えることにして、まずは地面部分のコリジョン処理を追加する。前作では地面に当ると爆発したが、今回は速度を0にするだけにする。
 合わせて、画面上に簡易的に自機を表示させる。誤差の関係で、多少見た目と当り判定が違う部分もあるが、概ねうまく動いている。

 簡易的に周回判定の赤青線を描画し、速度に応じた音をSOUNDで鳴らす処理を追加する。

 次に、ラップタイムを出すときに15fpsだと計算が面倒かも?という事で、16fpsに変更し、自機の加速度と減速度の調整を行う。現状では最高速度まで一気に加速してしまうが、そこは後日調整しよう。
 はじめの予定では、ハンドルを操作しなかったときの戻しも考えて作っていたが、どうもうまく機能しない。オフ会まで時間もないし、まずは曲がり具合を固定にしておくか。

 ここ1週間でバタバタと作って、とりあえず見れるレベルまでこじつけることができた。


Making「F-DOT2」 その2