【マイレース開発記録(6)】
phase設計の試行錯誤
「速さ」だけでは足りなかった
ユリウス日と天体計算が安定し、
スピードを計算するロジックも、少しずつ形になってきました。
ところが、実際にレースを動かしてみると、
ひとつ気になることがありました。
確かに順位は変わります。
でも……
ちょっと単調なんです。
せっかくなら、このアプリでは、
「流れ」だけではなく、
「リズム」も感じられるように
そう考えるようになりました。
そこで取り組み始めたのが、
phase(フェーズ)の設計です。
フェーズって何だろう?
フェーズというのは、簡単に言えば、
周期の中で「今どのあたりにいるのか」を表す数字です。
例えば、
- 月の周期:約29.5日
- 火星の周期:約687日
のように、天体にはそれぞれ周期があります。
その周期の中で、
「今はどの位置にいるんだろう?」ということを、
0〜1の数字にして表してみます。
最初に作ったのは、とてもシンプルな式でした。
Python
def calc_phase(days, period):
return (days % period) / period
これなら、周期の中での現在位置を
いつでも0〜1の範囲で表せます。
数学的には、とてもきれいです。
ただ……
ここからが意外と難しかったんです。
どの周期を使えばいい?
最初は、すべてのテーマを
月のフェーズで統一してみようと考えました。
ところが、実際に動かしてみると、
どれも似たような動きをしてしまいます。
そこで、
- 恋愛・健康 → 月(29.5日)
- 勝負・仕事 → 火星(687日)
というように、テーマによって周期を分けてみました。
すると、短期的な揺れと、長期的な流れ。
その両方を表現できるようになってきました。
ここで少しずつ、
外の流れ(スピード)× 内側のリズム(フェーズ)
という形が見えてきました。
フェーズを「動き」にしてみる
フェーズは0〜1の数字です。
でも、数字が動くだけでは、
見ている側には面白さが伝わりません。
そこで、この数字を
レースの動きに変えてみることにしました。
例えば、
Python
rhythm = (phase - 0.5) * 2
これで、値を -1.0 〜 +1.0 の範囲に変換できます。
さらに、
Python
return -rhythm * 0.15
として、ジャンプのような動きに
少しだけ補正を加えました。
これが、いわば
「ゴール直前のジャンプ補正」です。
どのくらい跳ねさせる?
ここでも、実際に動かしてみながら調整しました。
最初は、補正を大きめにして
±0.3くらいにしてみました。
すると、
- 順位がフェーズに引っ張られすぎる
- もともとのスピードの意味が薄くなる
という問題が出てきました。
では小さくしてみよう。
今度は±0.05。
すると、
- ほとんど違いが分からない
- 「ジャンプした」という感じがしない
という結果に。
そこで、その中間くらいの
±0.15にしてみました。
すると、スピードの流れを邪魔しすぎず、
フェーズによる変化も感じられるようになりました。
このあたりで、ひとつ勉強になりました。
数式として正しいことと、
見ていて自然に感じることは、
必ずしも同じではない。
最終的には、ユーザーが見たときに
「なんとなく自然だな」と感じられることも大切なんですね。
「いつ跳ねる?」も考える
次に考えたのが、
フェーズのどこでジャンプさせるか?
ということでした。
そこで、
Python
phase > 0.65
という簡単な条件を入れてみました。
これも何度か試しています。
- 0.5 くらいにすると、ちょっと頻繁に跳ねすぎる
- 0.8 くらいにすると、今度はほとんど変化がない
その間をいろいろ試して、
最終的に0.65あたりがちょうどよさそうだと感じました。
- 変化はちゃんとある
- でも、動きすぎない
このバランスを探す作業は、
思っていた以上に面白いものでした。
数式だけでは決められない
phaseの設計では、
- どの周期を使うか
- どうやって0〜1にするか
- どの範囲の数字に変換するか
- どれくらい補正するか
- どこを境目にするか
と、考えることがたくさんありました。
最初は「式をきれいに作ればいい」と思っていました。
でも、実際にアプリを動かしてみると、
数字として正しいかだけではなく、
動きとして自然かどうかを見る必要がある。
そんなことに気づきました。
AIとの対話で整理できたこと
私は、ひとつの数字や式が気になると、
そこをじっくり考えすぎてしまうことがあります。
今回も、
「この式は本当にいいのかな?」
と考え始めると、なかなか先に進めませんでした。
そこで今回は、AIとの対話を使いながら、
- 今、何を調整しているのか
- そもそもの目的は何なのか
- その変更はユーザー体験につながっているのか
を、一つずつ言葉にして整理していきました。
すると、
「正しい式を作る」だけではなく、
「どう感じてもらいたいか」を考える
という視点を持てるようになりました。
これは、今回の開発で得られた大きな気づきのひとつです。
迷いながら、少しずつ形になった
phase設計は、最初から答えが見えていたわけではありません。
周期を変えてみたり、
数値を調整してみたり、
実際の動きを見て戻してみたり。
そんなことを繰り返しながら、
少しずつ形になっていきました。
そして最終的に、
外の流れ(スピード)× 内側のリズム(フェーズ)
という、マイレースの基本的な考え方が
少しずつ見えてきました。
まだ完成ではありません。
でも、ここまで来てようやく、
「この方向で作っていけそうだ」
と思えるようになりました。

次回予告
12月1日から始まった設計フェーズ。
- 思想を整理して
- ロジックを考えて
- 天体計算に悩んで
- 時間という概念と向き合って
- 周期をモデル化して
少しずつ、アプリの土台ができてきました。
次はいよいよ、
バックエンド実装とAPI設計へ進みます。
今まで頭の中で考えていたロジックが、
実際のコードとして形になっていく過程を書いていきます。



