SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-02-16(Fri) トラディショナルなバックグラウンドの回転技術に思い至る

  例によって、常に何かに取り組んでいないと気がすまない人なので、ドルアーガで遊びながらも、プログラミングを進めている。まぁ、それ以外の細かいネタもいくつか並行しているんだけど。

  というのも、結構なペースでレトロゲーの類似品を作っている人をツイッターで見て、ちょっと触発されてしまったのだ。自分は、ゲームっぽいものを作るのは好きなのだが、ゲームシステムを作った辺りで満足して終わってしまうのだよな。レベルデザインに興味がないと言うか。

  しかし、ちょっと思いついたのだ。せっかく「WebAssemblyでトラディショナルな回転技術を再現」したのだから、それを生かしたゲームができないだろうか。しかも、ほとんどレベルデザインをする必要なしに、だ……あるんだ……あるんだよ。

  画像の説明

  こういう感じのヤツだ。コースを作ることなく、世界中のサーキットでレースをすることができる。通信対戦できるようにしたいなぁ。

  と思いつつ、あまりにユルユルとやっているので、任意の場所を映して、それを回転させた辺りで、着手から1ヶ月も経ってしまい、しかも、重大な問題に気づいてしまった。というのは、オブジェクト(キャラクタ/スプライト)の回転機能とバックグラウンドの回転機能は違うということだ。

  キャラクタの回転機能は、特定の「正方形のパターン」を元に、回転後の「正方形のパターン」を得るものだ。当初、バックグラウンドを表示するなら、それを敷き詰めればいいと思い、アルゴリズムを考えたのだが、「パターンの特定位置を中心に、回転後のパターンの表示位置」を求めようと思うと、どうにもパターン中心までのベクトルを求める必要が生じて、アークタンジェントを計算することが避けられそうにない。

  画像の説明

  これまで、すべて整数演算で済ませていたのに、そこに逆三角関数が出てくるのは美しくなさすぎる。数表で済まそうとしても、済ませられない規模になるし、誤差も出るだろうから、敷き詰めたパターンにスキ間が出ることも予測される。しかし、当時のアーケード(A-JAX, アサルト, スーパーフォーミュラなど)に一切のスキ間は見当たらない。つまり、当時からバックグラウンドの回転機能は、回転パターンを敷き詰めて実装しているワケではないのだ。

  で、気づいた。気づいたら簡単なことだ。たぶん、当時もそうだったのだろうと思える。バックグラウンドの回転機能とは、大きな正方形の領域が用意されていて、そこの回転前のパターンを描画し、それに対する「開始位置、サンプリングベクトル(角度)」を指定することで、画面全面に回転後のパターンを表示するという機能なのだ。それならば整数演算で済む。回転という概念が加わっても、オブジェクトとバックグラウンドは異なる実装になるんだなぁ。

  そういうことになると、以前に作った「WebAssemblyによるトラディショナルな回転技術」はそのまま使えないことになる。まー、最初から作り直しではないものの、作り替えという感じにはなるなぁ。それはそれで、ガッカリ半分、ウキウキ半分だけれども。