Making「F-DOT2」その4

Home PC-6001mkII Program etc

 このページでは、最後の微調整の過程を書いています。

Making「F-DOT2」 Top


2011/09/12〜13:3D風表示その2
 さて、3D風表示の高速化に移る。

 ちなみにこの時点で、2/975sec割り込み27回分、約18fpsだ。これを25.6fpsまで持っていけば良い。と簡単に言ってみたが、今の約1.4倍の速度にするという事か!

 現状、処理時間の約9割は画面描画処理だから、ここを何とかして速くしないとダメなんだよな。とりあえず掛け算の回数を減らすか。

 現状、奥行きの長さや縮小率を掛けるために以下のようにHL←DE*A(DEはFF80H-007FHで結果は符号付16bit)の計算をしている。
  LD HL, 0000H
  LD B, 08H
L31_P3L:
    ADD HL, HL
    RLCA
    JR NC, P31_P3L:
    ADD HL, DE
P31_P3L:
  DJNZ L31_P3L:

 これが、一行分表示する毎に(1)奥行き方向(X, Y), (2)左端方向(X, Y), (3)右方向に1つ分進める方向(X, Y)で6回、12行表示なので合計72回実行している。

画面

 さて、(3)は、(2)の計算途中で出てくる値を符号を反転させれば愚直に掛け算をしなくても良いのではないか?という事で処理を変更する。これで、掛け算の回数が2/3の48回になった。さて速度は...
 ...割り込み23回分、約21fpsか。結構稼げたけど、まだこれで半分か...。

 ここから細々とステート削減を行うが、それでも割り込み1回分が減ったかどうか。あと割り込み3回分か...。しかたない、妥協するか。

 という事で、12行表示を予定していた画面表示を10行表示に狭める。影響が少なそうな画面下部を2行分削って、と。どうだ!
 うわギリギリだ。多少心許ないけど、もうゲーム中の処理もあまり変わらないだろうからこれで行くか。

 改めて試しプレイをしてみる。やはりこちらの方が臨場感があるしプレイしやすく感じる。カーブがきついところで見通しが悪い部分が欠点だけど。

2011/09/14〜19:調整その2
 ゲームの処理自身はあらかた作ったので、微調整に移る。

 まず、ハンドルの傾きによるブレーキがあまり効いていないような気がするので試しに現状の2倍にしてみる。また、壁にぶつかったときに方向転換をしやすくするように、ギアごとにハンドルの傾きの最大値を変えてみる。

 修正を終えてテストプレイをしてみると、まずいことに微妙に面白くなくなった。大きく曲がるところですぐに速度が落ちるので、高速走行の爽快感が少なくなってしまった。
 どうしようかな...2倍だと流石に極端だったか。1.5倍にして、他のパラメータで調整するか。

 結局、ハンドルの傾きの最大値はギアごとではなく速度に応じて段階的に変える事にする。

 その他、並行して 3D風表示の表示具合を調整する。直線を斜め方向からみてもおおよそ直線に見えるように、表示用データを手で修正する。
 細かいところではまだ若干ガタガタとしているが、これでだいぶマシになったかな?

画面


2011/09/19:跳ね返り
 機能として、最後にもう一つだけ実装する事にする。救済措置だ。

 壁にぶつかったら速度が0になる、そこまではまあいい。ただ、そこからの復活するときのストレスを少しだけ軽減させたい。考えた挙句、跳ね返り処理を入れればいいのではないかという結論となった。

 ただそうはいっても、処理速度の余裕もほとんどない。という事で、処理を以下のように簡略化する。
  1. 壁にぶつかったときに自機の進行方向 左右の地形データを取得
  2. 左方向に壁があったら少しだけ右に自機を方向転換
  3. 右方向に壁があったら少しだけ左に自機を方向転換
  4. 両側に壁がなかったら、後ろに少し移動
 これで、壁にぶつかった後のストレスが少しだけ軽減したように思う。

2011/09/20〜21:仕上げ
 9/21(30年前にパピコン販売の発表があったとされる日)の公開に向けて、最後の微調整を行う。
  • 曲がりやすくなりすぎたので、ハンドルの効きを若干悪くする。
  • GOALIN,LAP TIMEの表示位置の微調整を行う。
  • タイムの最大値を6'00"1にする。
  • ジョイスティックの2つめのボタンに対応させる。
  • 3コース追加し、計8コースにする。
 試しプレイで調整中に、3D風ゴースト表示時の若干処理が間に合っていない事に気づいた。うむむ、どうしよう。いまさらゴースト表示を廃止したくないしな...。

 残り時間もあまりないので、比較的時間を食っている掛け算HL←DE*Aの処理をサブルーチン化し、以下のように冗長化させる。
変更前変更後
  LD HL, 0000H
  LD B, 08H
L31_P3L:
    ADD HL, HL
    RLCA
    JR NC, P31_P3L:
    ADD HL, DE
P31_P3L:
  DJNZ L31_P3L:
TIMES:
  LD HL, 0000H
  RLCA
  JR NC, P01_TIMES:
    ADD HL, DE
P01_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P02_TIMES:
    ADD HL, DE
P02_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P03_TIMES:
    ADD HL, DE
P03_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P04_TIMES:
    ADD HL, DE
P04_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P05_TIMES:
    ADD HL, DE
P05_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P06_TIMES:
    ADD HL, DE
P06_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P07_TIMES:
    ADD HL, DE
P07_TIMES:
  ADD HL, HL
  RLCA
  JR NC, P08_TIMES:
    ADD HL, DE
P08_TIMES:
  RET

 削減は100ステップ弱だが、掛け算処理は1描画ごとに40回呼び出されているので4000ステップ弱(時間にして2ms弱?)の削減となる。これでギリギリ大丈夫か。

 プログラムが完成したところで、慌ててReadmeとWebページを作成する。9/21の0時まで間に合うかな...
 0時は少し回ってしまったものの、ようやく完成。時刻が時刻だったので、若干反応が薄い気もしたが、一部の人には好評だったようでなによりだ。


その3 Making「F-DOT2」