3/8日記 ===== プログラム ===== * 弾を吐かせる。 * https://x.com/__machia__/status/2030570386958791154?s=20 * 画像回転はソフトウェア的には計算量が多いので、事前に画像を作ってそのとき必要な要素を計算用テーブルに情報載せて動かしてみた。意外と楽に作れた。 * ただ、画像に沿わない角度で弾を飛ばしたいときに違和感があるかもなと思った。 * その時は球状の弾を用いる等違和感はなくしていくことはできそう。 ---- * あとは、狙い弾の処理について考えてた。 * 前提として、STGの敵弾もしくはプレイヤー弾を飛ばすのに利用したい。 * まず狙い弾は特に何も考えないならArctanを利用して角度を求める必要がある。 * Arctanについて、式としては「tan(y) = x」となるyを求める。 * Arctanで角度が出力される。ただ、計算量の関係で毎回Arctanを求める以外の方法はないだろうかと考える。 * 特に今回は画像に制約があるため、出力結果からどの角度を参照するかを出力する必要がある。 ---- * 方法案としては、領域を4個に分けて、tanの値を計算テーブルで持たせて、それを比較して近似値を取る形でいい気がした。 * ただ、これだとtanの計算からX・Y座標が分かるだけなので、ここからnormalizeで斜辺の長さも求める必要がある。 * normalizeは平方根で求める必要があるが、それ以外に手で計算する方法としては、開平法というものがあるらしい。 * https://ja.wikipedia.org/wiki/%E9%96%8B%E5%B9%B3%E6%B3%95 * これをつかえばFPUがない環境でも高速に解を求められるっぽい。 ---- * また、別の案だとこういうのを作る選択肢もある。 * https://beach.biwako.ne.jp/~beaver/msx/msxtecho/table2.htm ---- * ということで、今のところは以下のどれかかなあ。 - Arctanで角度を求めて各テーブルと比較し、一番差分が小さいグラフィックを採用する。(これはやりやすい) - tan関数を求めて弾テーブルからtanの値を比較、飛ぶ方向はnormalizeを求めてXY方向に分解。 - arctanテーブルを作成、4象限のどれかを事前に検知してテーブルを展開、XY方向のベクトルを定義する。 ---- * グラフィックはソフトウェアレンダリングで昔風だけど、計算まで昔風にやりたいわけではない。 * 今のCPUだったら今なりのやり方が存在するわけで、その選択肢は常に用意していくのがいいかなと。 * 実際上記の計算は角度を計算テーブルに突っ込んで、出力はXY成分ごとにsin/cosの計算してる。 ---- * グラフィックフレームワークについては元々ゲーム開発で使う想定はなかったけど、割と高速に動くのを確認したので、それだったら使ってみようじゃねえかという考え。 * スプライトも多層的にロードできるし切り抜きで自由な大きさで出力できるし、だいぶ自由度は高い。(スプライトとは呼んでないけど) * ついでにうまくデータを転送すれば背景もラスタースクロールできるし。というかExtraスクリーンは最初作る予定になかったんだよ。 * ずっと前にラブプラスの記事みてこの方法を採用すれば一瞬だけ背景を先に描画して背景描画にエフェクトっぽくしていく、みたいなのはできないかな?と考えてたので。 * https://game.watch.impress.co.jp/docs/series/3dcg/365048.html ---- * ゲームについて。次作ろうと思ったのは以下。 - 陸戦型STG。ショックトルーパーズみたいなやつ。 - 以前から考えてた横スクロール交代アクションシューティング。 - レースゲーム+STG。以前も少し書いてた「シンカイヒメ(仮)」。 * 下2項目は元々CryPic.で作ったフレームワーク上で実装しようと思っていたので、形にするのに時間かかると思うんだよな・・・