Mainu Studio
Banana Game開発ノート | フルーツらしい物理を作る
バナナの曲がりは見た目だけでなく遊びにも影響します。その違いを残しながら、フルーツの山全体を安定させることが開発の課題でした。
円だけでは表せなかった形
円形の衝突判定は軽く、転がり方も予測しやすいものです。しかしバナナ全体を円で囲むと内側の空間までふさがり、ほかの実が浮いて見えます。小さな円では先端を通り抜けます。
バナナには内側の空間が残る、曲がりに沿った形を使います。ブドウも同様に見た目の接触を説明できる輪郭が必要です。ただし全ピクセルをなぞると小さな角が引っかかりや振動を増やすため、形の特徴を保ちつつ細部を整理しています。

山が大きくなって分かった問題
数個なら安定していても、重い山の圧力が同じ接点に集まると振動が始まりました。合体結果が隣の実と重なったり、小さな実が凹んだ形に閉じ込められたりもしました。低速な端末では表示フレーム間の動きが大きくなります。
摩擦だけを増やすと実が張り付き、反発を増やすと山全体が跳ねます。輪郭の整理、元の実を一度に無効化してから結果を配置する処理、適度な摩擦と減衰、落下・回転・重なり解消の速度制限を組み合わせています。
自動合体と二重処理の防止
初期試作では触れたグループをプレイヤーが選んでいました。現在は有効な接触ですぐ合体します。同じ接触の重複通知や1回の動きから複数の合体が生じても、使い終わった実を再利用してはいけません。
合体に使った実はアニメーション終了を待たず無効にします。スコア、トークン、音、絵の交換、物理の後処理を同じ合体イベントにそろえ、見えない衝突体だけが残る現象を防ぎます。特殊合体はつながったグループで判定し、不成立ならすぐ通常合体に進みます。遊び方もこのタイミングに合わせています。
720×1280を共通の基準に
Web、Android、Windowsは画面の余白、安全領域、フィルター、入力が異なります。個別に配置を決めると、ある環境だけボタンがずれたり伸びたりしました。
現在は720×1280の基準配置を縦横比を保って拡大縮小し、余白を盤面の外に置きます。タッチ範囲を大きくしても中心は同じ座標に固定。文字や次の実も共通の倍率に従います。最近傍補間は整数倍率では鮮明ですが、ほとんどの携帯画面は整数倍ではないため、相対配置を優先し素材ごとにフィルターを選びます。

性能と実際の失敗場面
安定した実はほかの物体に起こされるまで休止させ、装飾や文字を毎フレーム作り直さず、ランキング行や言語プレビューも再利用します。計算時間を実際のフルーツの山に回すためです。
連続高速落下、大きな隣同士での合体、バナナへの積み重ね、移動中の一時停止、ウィンドウ変更、メニュー復帰後の入力を試します。空の編集画面で動くことだけでは安定性を判断しません。
残したいのは納得できる意外性
少し転がり、回転し、力を伝える動きがこのゲームの面白さです。不利な結果でも、どの面で向きが変わったのか分かることを目指します。バナナは円より予測しにくいままにしつつ、貫通、止まらない振動、見えない衝突体、環境ごとの配置ずれは不具合として扱います。