ゲーム一覧へスキップ
Hadukis

ブログ

17倍ずれていた照準ライン

· 約4分で読めます

スリングショットのゲームでは、点線がプレイヤーとの約束のすべてです。引いて、点線で行き先を確かめて、離す。点線が嘘をつけば、身につけられる腕前などありません。残るのは運と、このゲームはズルをしているという感覚だけです。

ScaleSling の最初のテストプレイでは、感想が2つ返ってきました。「砦が勝手に崩れる」と「線のとおりに飛ばない」。どちらも本当で、どちらも調整の問題ではありませんでした。この記事は2つ目の話です。砦のほうは別の記事にまとめています。

線は何をしていたか

どの角度でドラゴンを引いても、点線のガイドは画面の上へ抜けていき、二度と下りてきませんでした。急な角度でも浅い角度でも、全力で引いても軽く引いただけでも同じです。一方のドラゴンは、ごく普通の弧を描いて飛び、線が一度も指していない場所に着地していました。

ガイドは、仮の弾を時間に沿って1ステップずつ進めて描いています。スリングショットから始めて、速度を足し、速度に重力を足し、これを繰り返して、数ステップごとに点を1つ置きます。このループでは、重力の設定値に1ステップの長さを掛けたものを足していました。

ゲームの下で動いている物理エンジンは、そうしていません。重力を「力」として加えていて、力は1ステップの長さの2乗を介して速度の変化になります。1秒60ステップなら1ステップは約16.7ミリ秒なので、ガイドはドラゴンが実際に受けている重力のおよそ17分の1しか使っていなかったことになります。重力が17分の1の弾は、線が示したとおりに動きます。上がって、上がり続けるのです。

その上に、もう1つ小さな嘘が重なっていました。ドラゴンには空気抵抗があって、2秒で速度の半分ほどを失います。ガイドはそれを無視していました。重力だけを直していたら、形は正しく落ちてくるのに、落ちる場所がずれた線になっていたはずです。

修正後のステップは2行です。速度に抵抗を掛け、そのあと2乗したステップ長で重力を足します。抵抗の値は、いまはドラゴンの中ではなく共通の設定ファイルに置いています。別々の2つのコードがこの値を必要としていて、二度と食い違ってはいけないからです。

目で見るのではなく、証明する

こういう修正を確かめるとき、スリングショットを何回か引いて、点線が合っていそうか見てみたくなります。でも、そもそもそのやり方だったからバグが残っていたのです。少しだけずれた線はもっともらしく見えますし、同じ一発を2回撃てる人はいません。

そこで、いまは小さなスクリプトがあります。本物の物理エンジンを、ブラウザも画面もなしに、ゲーム自身の定数で動かすものです。いろいろな角度と強さで物体を発射してステップを進め、実際に飛んだ先と、ガイドの計算が示す先を比べます。

修正前は、90ステップの時点で両者が1,300ピクセル離れていました。修正後は差がゼロで、着地点もピクセル単位で一致します。スクリプトは1秒かからずに終わり、ガイドや物理の設定、ドラゴンの物理ボディに誰かが手を入れるたびに、もう一度走ります。

自動プレイヤーも嘘をついていた

この問題を追っているあいだ、自動プレイヤーも使っていました。全ステージに向けて撃ち、どのステージがクリアできるかを報告するスクリプトです。その報告では、ステージ2はクリア不可能、ステージ4にはまったくダメージが入らない、となっていました。

どちらの判定も間違いでした。その理由は、物体を「スリープ」させる物理エンジンを使っているなら知っておいて損はありません。処理を減らすため、エンジンはしばらく止まっている物体のシミュレーションをやめます。スリングショットで待っているドラゴンはずっと止まっていたので、眠っています。眠っている物体に速度を設定しても、エンジンが読まない数字を書き込むだけです。弾は速度17.9でスリングショットを離れたことになり、そのまま元の位置にずっと留まっていました。

人間はこれを一度も目にしていません。ドラゴンをドラッグするとフレームごとに動くので、眠らずにいるからです。失敗するのはドラッグせずに撃った場合だけで、それはちょうど自動テスターがやることでした。あの報告の「クリア不可能」はどれも、一度も動いていないドラゴンでした。しかも私たちは、その報告をもとにステージの素材を変え始めていました。

修正は、発射前に物体を起こす呼び出しを1つ足すだけです。ここから学んだことは、もっと広い話です。「不可能」と言う機械を信じる前に、テストしたことが実際に起きたかを確かめること。 いまは自動プレイヤーが、各ショットの飛距離を記録しています。飛距離ゼロでダメージゼロという結果は、計測が壊れているのであって、難しいわけではありません。

プレイヤーにとって何が変わったか

点線は、いまでは軌道そのものです。線の終わりがドラゴンの着地点で、どの角度でもどの強さでも同じです。それを確かめているのは、画面に目をこらす人ではなく機械です。以前 ScaleSling を遊んで、スリングショットが理不尽だと感じたなら、実際そうでした。いまはもう違います。

ここで遊べます。