PRODUCT NOTE / GAME DESIGN
つないで、ひとつにする物理パズル。
この文書は「どう遊ぶか」ではなく、なぜ・誰のために・どんな体験のために作ったかを記録した設計ノートです。
| ステータス | Shipped(リリース済み) |
|---|---|
| リリース | 2026-02-18 |
| プラットフォーム | iOS(App Store)/ Android(APK 直配布)/ Web |
| 対象ユーザー | スキマ時間に触れるカジュアルゲーマー |
| ジャンル | ミニマル・フィジックスパズル |
| 最終更新 | 2026-08-15 |
| 関連リンク | App Store ・ Android APK ・ Web で遊ぶ ・ 紹介ページ |
Synapse Link は、浮遊するノードをドラッグして近づけ、自動でリンクさせながら全ノードをひとつの繋がりにまとめるミニマルな物理パズルです。脳のシナプスがつながる感覚を、流体的な物理挙動・グラスモーフィズム・虹色エフェクト・透明感のある効果音で表現します。説明のいらない気持ちよさを最優先に設計しています。
このプロダクトは課題解決ではなく「体験」を届けるもの。狙ったのは次の感覚。設計意図
複雑な操作や長い説明を好まない、カジュアルゲーマー。移動中や休憩のスキマに、頭を空にして触れるパズルを求める人。
このゲームでいちばん手をかけた絵が、レベル 3 以降に出てくるブラックホール。画像は 1 枚も使わず、毎フレーム 6 層を重ねて描いている。同じ絵は nzw.jp のトップページでも徘徊していて、そちらは Flutter 版の BlackHoleRenderer.draw() を Canvas 2D に移植したもの。移植の都合や動きの作り方は nzw.jp の開発ノートに書いた。
半径 r を基準に、外側から内側へ 6 層。数値はすべて r に対する倍率なので、サイズが変わっても比率は崩れない。
| 層 | 描くもの | 技法 |
|---|---|---|
| 1 Distortion Rings | 重力圏を示す同心円 4 本と、内側ほど明るい放射グラデーション | 不透明度 0.03 × (1 − i/4)。ほぼ見えない濃さで「空間が歪んでいる」気配だけ置く |
| 2 Ambient Particles | 周囲を渦巻きながら吸い込まれる粒子(12 + r×0.5 個) | 半径比 1.5〜4.0 から毎フレーム内側へ。0.5 を切ったら外周へ戻す。紫とオレンジを半々で混ぜる |
| 3 Accretion Disk | 降着円盤。3 層 × 60 分割の円弧 | 加算合成(BlendMode.plus / globalCompositeOperation = 'lighter')。重なった所だけ白熱する |
| 4 Event Horizon Glow | 事象の地平面のにじみ | 紫 → 橙 → 透明の放射グラデーション。半径そのものが脈動する |
| 5 Core | 本体。外側のぼけた縁と、真っ黒な芯の二重 | 外側は blur(7px) 付きで縁を溶かす。芯は 0.6r の完全な黒 |
| 6 Tactical Info | VOID: xx.x% のタグと照準のかぎ括弧 | 危険度で色が紫 → 赤 → 金へ補間。0.8 超で点滅する |
通常モードは紫を軸に、降着円盤だけ橙〜桃へ振る。「宇宙=青」に寄せず紫に寄せたのは、ノードの水色(Sky 500)と画面上でぶつからないようにするため。敵役の色として、味方色の補色側に置いている。
スターブレイカーモードだけは同じ描画コードのまま配色を差し替え、水色(rgb(6,182,212))基調にして層も 3 → 5 に増やす。形は同じで色だけ変えることで、モードが違うことを一目で伝えつつ実装は 1 本に保っている。
アニメーションの元になっている変数は 2 つだけ。1 フレームあたり rotation += 0.02、pulsePhase += 0.04 と進める。
pulse = sin(pulsePhase) × 0.15 + 1.0。0.85〜1.15 の呼吸を、地平面の半径と円盤の不透明度に掛ける。半径と明るさが同時に揺れるので、生き物のように見える。2.0 − layer × 0.3 の速さで回す。内側ほど速いので、層がすれ違って渦に見える。brightness = 0.3 + sin(angle × 3 + rotation × 2) × 0.2。1 周に 3 つの明るい塊ができ、それ自体もゆっくり流れる。hue = (t × 120 + 260 + layer × 30) % 360。1 周で 120 度ぶん色が動くので、円盤が単色にならない。danger = 半径 ÷ (画面幅 ÷ 4)。大きく育つほどタグが赤くなり、0.6 を超えると火花が飛ぶ。状態を数値で見せず、色温度で伝える。半径・重力・引力範囲・移動速度を連続値にせず、CONFIG.blackHoleSizes の 5 段階に固定した。大きいものほど遅いという関係を表に埋め込んであるので、成長させても挙動のバランスが崩れない。
| 段階 | 半径 | 重力 | 引力範囲 | 速度 |
|---|---|---|---|---|
| tiny | 10 | 0.10 | 60 | 0.6 |
| small | 20 | 0.15 | 95 | 0.4 |
| medium | 35 | 0.20 | 130 | 0.2 |
| large | 55 | 0.30 | 190 | 0.1 |
| huge | 80 | 0.40 | 300 | 0.05 |
自然発生するのは medium まで。large / huge はブラックホール同士の合体でしか生まれないので、大きいものを見た時点で「何かが起きた後」だと分かる。huge に達すると 5 秒後に崩壊し、medium に戻りながら tiny を撒く。
「触って気持ちよく、また触りたくなる」状態かを、次の指標で見る。数値は目標仮置き
体験を成立させるための判断を、決定・仮説・結果の 3 点で残す。理由はゲーム設計から再構成
/st/games/node/game.html)だった。これをやめ、iOS / Android と同じ Flutter のコードを flutter build web したものを /static/app/synapse-link/web/ に置いて Web 版とした。プロトタイプは紹介ページの隅に「初期版」として残すだけにした。--no-web-resources-cdn で CanvasKit を自サーバーから配るため初回は約 41MB / 数秒かかる。その待ち時間は白画面ではなくローディング表示で埋めた。Flutter 本体をビルドした Web 版を公開/トップと紹介ページに導線を追加/初期 HTML プロトタイプは「初期版」として残置
App Store/Android/Web で公開。Canvas 物理演算によるミニマル物理パズルとして初リリース
未決事項:マネタイズの方針、ステージ供給の持続方法。