【マイレース開発記録(6)】
phase設計の試行錯誤                      

ユリウス日と天体計算が安定し、
スピードを計算するロジックも、少しずつ形になってきました。

ところが、実際にレースを動かしてみると、
ひとつ気になることがありました。

確かに順位は変わります。
でも……

ちょっと単調なんです。

せっかくなら、このアプリでは、

「流れ」だけではなく、
「リズム」も感じられるように

そう考えるようになりました。

そこで取り組み始めたのが、
phase(フェーズ)の設計です。

フェーズというのは、簡単に言えば、
周期の中で「今どのあたりにいるのか」を表す数字です。

例えば、

  • 月の周期:約29.5日
  • 火星の周期:約687日

のように、天体にはそれぞれ周期があります。

その周期の中で、
「今はどの位置にいるんだろう?」ということを、
0〜1の数字にして表してみます。

最初に作ったのは、とてもシンプルな式でした。

def calc_phase(days, period):
return (days % period) / period

これなら、周期の中での現在位置を
いつでも0〜1の範囲で表せます。

数学的には、とてもきれいです。

ただ……
ここからが意外と難しかったんです。

最初は、すべてのテーマを
月のフェーズで統一してみようと考えました。

ところが、実際に動かしてみると、
どれも似たような動きをしてしまいます。

そこで、

  • 恋愛・健康 → 月(29.5日)
  • 勝負・仕事 → 火星(687日)

というように、テーマによって周期を分けてみました。

すると、短期的な揺れと、長期的な流れ。
その両方を表現できるようになってきました。

ここで少しずつ、

外の流れ(スピード)× 内側のリズム(フェーズ)

という形が見えてきました。

フェーズは0〜1の数字です。

でも、数字が動くだけでは、
見ている側には面白さが伝わりません。

そこで、この数字を
レースの動きに変えてみることにしました。

例えば、

rhythm = (phase - 0.5) * 2

これで、値を -1.0 〜 +1.0 の範囲に変換できます。

さらに、

return -rhythm * 0.15

として、ジャンプのような動きに
少しだけ補正を加えました。

これが、いわば
「ゴール直前のジャンプ補正」です。

ここでも、実際に動かしてみながら調整しました。

最初は、補正を大きめにして
±0.3くらいにしてみました。

すると、

  • 順位がフェーズに引っ張られすぎる
  • もともとのスピードの意味が薄くなる

という問題が出てきました。

では小さくしてみよう。
今度は±0.05。

すると、

  • ほとんど違いが分からない
  • 「ジャンプした」という感じがしない

という結果に。

そこで、その中間くらいの
±0.15にしてみました。

すると、スピードの流れを邪魔しすぎず、
フェーズによる変化も感じられるようになりました。

このあたりで、ひとつ勉強になりました。

数式として正しいことと、
見ていて自然に感じることは、
必ずしも同じではない。

最終的には、ユーザーが見たときに
「なんとなく自然だな」と感じられることも大切なんですね。

次に考えたのが、
フェーズのどこでジャンプさせるか?
ということでした。

そこで、

phase > 0.65

という簡単な条件を入れてみました。

これも何度か試しています。

  • 0.5 くらいにすると、ちょっと頻繁に跳ねすぎる
  • 0.8 くらいにすると、今度はほとんど変化がない

その間をいろいろ試して、
最終的に0.65あたりがちょうどよさそうだと感じました。

  • 変化はちゃんとある
  • でも、動きすぎない

このバランスを探す作業は、
思っていた以上に面白いものでした。

phaseの設計では、

  • どの周期を使うか
  • どうやって0〜1にするか
  • どの範囲の数字に変換するか
  • どれくらい補正するか
  • どこを境目にするか

と、考えることがたくさんありました。

最初は「式をきれいに作ればいい」と思っていました。

でも、実際にアプリを動かしてみると、
数字として正しいかだけではなく、
動きとして自然かどうかを見る必要がある。

そんなことに気づきました。

私は、ひとつの数字や式が気になると、
そこをじっくり考えすぎてしまうことがあります。

今回も、
「この式は本当にいいのかな?」
と考え始めると、なかなか先に進めませんでした。

そこで今回は、AIとの対話を使いながら、

  • 今、何を調整しているのか
  • そもそもの目的は何なのか
  • その変更はユーザー体験につながっているのか

を、一つずつ言葉にして整理していきました。

すると、

「正しい式を作る」だけではなく、
「どう感じてもらいたいか」を考える

という視点を持てるようになりました。

これは、今回の開発で得られた大きな気づきのひとつです。

phase設計は、最初から答えが見えていたわけではありません。

周期を変えてみたり、
数値を調整してみたり、
実際の動きを見て戻してみたり。

そんなことを繰り返しながら、
少しずつ形になっていきました。

そして最終的に、

外の流れ(スピード)× 内側のリズム(フェーズ)

という、マイレースの基本的な考え方が
少しずつ見えてきました。

まだ完成ではありません。

でも、ここまで来てようやく、
「この方向で作っていけそうだ」
と思えるようになりました。

【マイレース開発記録(6)】
【マイレース開発記録(6)】図解

12月1日から始まった設計フェーズ。

  • 思想を整理して
  • ロジックを考えて
  • 天体計算に悩んで
  • 時間という概念と向き合って
  • 周期をモデル化して

少しずつ、アプリの土台ができてきました。

次はいよいよ、
バックエンド実装とAPI設計へ進みます。

【マイレース開発記録(7)】Flask API設計

今まで頭の中で考えていたロジックが、
実際のコードとして形になっていく過程を書いていきます。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です