Making「F-DOT2」その3

Home PC-6001mkII Program etc

 このページでは、P6オフ会からの変更過程を書いています。

Making「F-DOT2」 Top


2011/07/28〜08/01:タイトル画面
 せっかく面を複数作っているから、そろそろ面選択、すなわちタイトル画面を作るか。

 その前に、回転画面の描画処理を少し修正する。現状の回転画面では、縮小率が2倍までなのだが、これを4倍までに変更する。
 値を倍にするだけだから簡単、と思いきや、プレイ画面の回転具合がガクガクと表示するようになった。おそらく途中の計算値を256で割ってから8を掛けるという手抜きをしたから誤差が大きくなったのだろう。という事で、愚直に32で割るよう変更する。

 さて、なぜ回転画面に手を加えたかと言うと、つまりこういう事をやりたかったのだ。

画面

 はじめの予定では、下の画面をタイトルの背景にしようと思っていたのだが、回転画面を途中から全画面表示にしたのと回転画面の方が見栄えが良い事もあって予定変更した。

画面

 色合いを変えるため、面作成処理をタイトル用に別途作成したのだが、よくよく見返すともう少し共通化できそうだな。余裕ができたらこっそり変更しよう。

2011/08/02〜08:あの画面
 一応オリジナルだし、見た目もまあまあ良いので、いっちょあの画面を入れてみるか。

 という事で、まずペイントブラシでドット打ちをする。はじめは若干小さめに作ったが、マークの部分が今ひとつだったので今度は横幅一杯にしてみる。

画面

 ...これで良いかな?続いてこれを表示するマシン語ルーチンを作成し、画像データの打ち込みを行う。

 その他、新しい面の作成を行う。最終的に何面になるかな?

2011/08/09〜10:リプレイその1
 さて、いい加減リプレイ関係を進めるか。という事で、改めてリプレイデータが収まるか計算する。

 まず、リプレイデータ1つ辺りに必要な容量を求める。少し予定より少なめに6分で見積もると、25.6×60×6=9KB。圧縮フォーマットで1/4くらいに縮まる事を期待しても2.25KB。
 現在作成している5面分+プレイ中のワークを用意すると、2.25KB×6=13.5KBになる。

 一方、現状使用しているメモリ領域はというと、大まかにこんな感じだ。
範囲サイズ用途
0000H-7FFFH32KBROM
8000H-83FFH1KBVRAM1
8400H-9FFFH7KBBASIC+マシン語(余裕分含む)
A000H-DFFFH8KBマップデータ(下1バイトが00H-7FHの部分)
A000H-DFFFH8KB空き(下1バイトが80H-FFHの部分)
E000H-E3FFH1KBVRAM2
E400H-EFFFH3KB(VRAM2の一部)空き
F000H-F0FFH0.25KB(VRAM2の一部)ゲームワーク
F100H-F6FFH1.5KB(VRAM2の一部)空き
F700H-F9FFH0.75KB(VRAM2の一部)ゲーム用各種データ
FA00H-FFFFH1.5KBBIOSワーク

 空き領域を全部合わせても少し足りない。さらに、当然ながらここから面を増やすと全然メモリが足りなくなる。うむむ、リプレイデータを1つにするか。

 A000-DFFF部分を使えば、4KB×2(リプレイ+プレイ中リプレイワーク)と潤沢(?)に取れるな。

2011/08/16〜23:リプレイその2
 リプレイ処理関連のお膳立てをする。

 まず、自機の移動処理の修正。これまで自機用のワークエリアを固定していたが、これをIXレジスタを使用した相対番地に修正する。はたしてアレを追加しても速度は大丈夫だろうか?こちらの続きは、また後日にする。

 次に、キー入力の代わりにリプレイデータから入力情報を取ってくる処理を追加する。あともう一つ、ゲーム終了時に現在の記録データとリプレイデータを比較し、面が異なる場合かもしくは記録データの方が速い場合にリプレイデータを更新するようにする。

 さてテスト。暫定的に2回目のプレイはリプレイ再生にして実行...なぜか暴走した。

 よくよく原因を探ると、MODE2,PAGES2の環境ではDFxxH辺りの部分もBIOSのワークで使っている模様。なら、ここは避けるべきだろう。
どれだけ避ければ安心かわからないが、とりあえず128バイト分だけプログラムで指定しないようにしておく。リプレイデータ領域が少しだけ少なくなるが、致し方ない。

 その他は、概ねうまく動いているようだ。

画面

 ただ、何度か見当外れの行動をとる事があった。
 それなら、と本腰を入れて原因を探ろうとしたが、そんなときに限って現象が出なくなる。また忘れた頃に出るんだろうな...。

2011/08/26〜31:ゴーストその1
 リプレイも一応動くレベルになったし、いよいよアレに取り掛かるか。

 アレというのは、過去のリプレイと対戦するゴーストプレイだ。リプレイデータからの入力情報取り出しが出来るようになったので、あとはゴースト用に移動処理と表示処理を用意すれば良い、理論上は。

 ゴーストの移動処理は、自機の移動処理とほぼ同じとなる。ゴースト用に別途処理をコピーして使えば手っ取り早いが、今回は自機の移動処理を少し修正して自機/ゴースト両用に変更する。これが、先週にやっていたお膳立てだ。

 表示処理は、過去にASALTでも試した、マップへの直接書き込みを行う予定だ。この方法だと、ゴーストを画面上のどの位置に描画するかを考えなくても良いので処理が楽だ。多少ゴーストが大きく表示されるだろうが、許容範囲だろう、多分。

 ゴースト用の初期設定まで書いたが、移動処理の一部がまだ共通化できないことがわかった。続きは来週か。

2011/09/05:ゴーストその2
 さて、材料も揃った事だし、一気にゴースト処理を実装するか。

 リプレイデータを記録した面と同じ面をプレイした場合に、リプレイデータを元にしたゴーストを表示する。移動処理は、自機の移動処理を利用する。ゴースト表示は、画面表示の直前にマップにキャラクタを書き込み、画面表示直後に元に戻す、と。

 ちょっとした誤りを多々修正しつつ、ようやく動く状態になった。

 さて動作を確認...一見うまく動いているようだが、ゴースト表示時は途中の周回で面クリアになってしまう。また、ゴーストに勝ってリプレイデータが置き換わった後にゴーストの挙動がおかしくなる。

 前者はすぐ原因がわかった。自機とゴーストで同じ移動ルーチンを使用しているので、自機とゴーストで周回数を二重にカウントしていた。ここは、ゴースト用のフラグをつけて処理を分ければいいか。

 後者だが、どうにも心当たりがない。消去法で行くと、プレイ中のデータ記録なのかな?という事で、データ記録部分を中心に少しずつ動かして動作を確認する。
 すると、不自然な箇所が見つかった。データ記録の進み方が異常に速い。...あ、そうか。自機移動とゴースト移動の両方を交互に記録してるんだ。
 ここまでわかればあとは簡単だ。ゴースト分のデータ記録をやめる。これだけ。

 まずはこんな所かな?

画面


2011/09/06〜07:リプレイその3
 さて、リプレイ画面をすすめていくか。

 まず、リプレイ画面とわかるように「REPLAY」の文字列を点滅表示させる。点滅用のカウンタを用意してカウンタの値によりアトリビュートの変更と文字列の表示を行う。

 次に、タイトル画面をしばらく表示した後にこのリプレイ画面を表示するようにする。リプレイデータがない場合は、リプレイ処理を飛ばしてTinyProjectロゴ表示に戻るようにする。

 次!リプレイ中のキー/ジョイスティック入力の実装を行う。
 スペースキーを押した場合は、リプレイを中断し、タイトル画面に戻るようにする。あと、せっかく拡大縮小表示の機能があるので、上下で手動拡大縮小が出来るようにしようかな、よし実装!

画面

 出来る事は少ないながら、表示を変えられるのは楽しい。

2011/09/11〜12:3D風表示その1
 プレイ時の画面表示だが、実はもう一つ自機の速度によって拡大縮小率が変わるモードも試験的に用意していた。せっかく作ったので組み込みたいところだが、やはり品揃え的にはもう1つ位は欲しいところだ。

 ...3D風表示を今度こそ実装するか。

 3D風表示の原理としては、表示行1行ごとに拡大縮小率を変えて、上の行ほど自機から距離を離した位置の地形データを表示すれば良い。とはいえ、以前は拡縮データと距離データの暫定値まで作ってそのま頓挫していた。だって処理が面倒なんだもん。

 3連休という事もあり、やる気も出てきたので、まずは1行分だけ3D風表示させる処理を一気に作成する。いざ実行してみると、修正した処理に行く前に止まってしまった。

 どうやら、マシン語のサイズが4KBを越えたので、マシン語プログラムの最後とマップデータの領域がかぶったようだ。幸い、マシン語の開始番地付近にはまだ余裕があるので、2KBほど開始番地を移動させる。

 改めて実行!なぜか赤一色になる。さすがにこれでは原因がわからないので、1画面分12行を表示する処理を追加し再度実行...。

画面

 とんでもなく表示が崩れた。ただ、特に暴走している様子ではなく、回転させても表示が崩れた状態でそれなりに動く。これは読み込むマップの番地計算処理でしくじっているんだろうな。

 よくよく処理を追っていくと、余計な初期化を行っている部分があったので修正。これで一応表示するようになった。ただ、表示が遅い問題と、少したわんで見える問題が残っている。

画面



その2 Making「F-DOT2」 その4