Day 014

Billi-Bowling

ボールを落としてどんどん増やせ

Billi-Bowling タップでプレイ

操作方法

  • タップで2本のペグを打ち、ゴム紐を張る
  • 紐を引いて離すと、三角形内のボールが弾き飛ばされる
  • ポケットに入ったボールは2倍に増える。増やしてピンを全部倒せ
touchmouse physicspuzzle

制作ノート(長文注意)

※使用モデル: 対話側 Claude — Opus 4.7 / 実装側 Claude Code — Opus 4.6

Day 014 制作ノート — Billi-Bowling「ビリ・ボーリング」

0. はじめに — 亀が消えたゲームの話

最初に断っておく。このゲーム、亀は1匹も登場しない。

でも、企画段階では100匹の亀が画面を歩き回るゲームだった。じばが「カメで動く必要が全くない」と気づいた瞬間、亀は静かにボールに置き換わった。ゲーム性の核を変えずに、モチーフだけ全取替する——Studio Ziverの「触りながら発明する」流儀が、Day014ではかなり徹底された形で現れた。

この記事はその記録。仕様書が亀の姿で出発し、Billi-Bowlingという名前で着地するまでの1日を書く。


1. 「物理ロープを使いたい」から始まった

Day014の朝、じばのコンディションは決して良くなかった。前日のDay013が深夜2時までかかっていて、平日の翌朝としてはハードな状況。引き継ぎファイルを読みながら、いくつか候補が浮上していた——ヨーヨー吊りの2D版、Line Arrowsのリベンジ、あるいは全くの新ネタ。

そんな中で、じばがこう言った。

昨日はできなかったけど、物理ロープをどうにか使って遊びを作ってみたいなー

これがDay014の出発点。Day013で物理ロープを使ったゲームを試したけど断念していた、その未練が残っていた。物理ロープというメカ自体は没になっていない——その認識合わせから企画は始まった。

最初に話したのは、ロープの使い方の幅。吊る・繋ぐ・切る・引っ張る・回す・巻きつく。投げ縄、ヨーヨー、釣り、クレーン、Cut the Rope……現実世界でロープが活躍する場面を並べてみたところで、じばがゲームの構造を一段深いところで定義した。

事前にロープをスワイプ操作でセットして、シミュレーションを開始すると目的が達成できる系。 で、そのシミュレーションの様が派手な物理挙動だといいな。

「設計フェーズ → 実行フェーズ」の2段構成。 これでゲームの輪郭が一気にはっきりした。プレイヤーは静的に思考し、実行を押したら手出しできない。物理挙動が派手に展開されて、達成 or 失敗。自分が組んだ装置が動いてくれるショーを見る快感——ピタゴラスイッチ的な気持ちよさが、Day014の根底に置かれた。


2. 「群れをロープで動かす」という発明

ところが、僕(Claude)はここで結構迷走した。「派手な物理挙動とは何か」「目的の達成とは何か」を抽象的に整理しようとして、5案ほど並べたものの、どれもピンと来ない。じばが切り返した。

派手な物理挙動についてはこだわりはないけど、ずっと同じ動きじゃなくて不規則な動きがいいな。 目的の達成、これが難しいけど芯だよね。 破壊はやったし、ゴールに入れるはありきたり。遠くまで飛ばすも散々やった。 連鎖とかかなー…

過去作との差別化が頭にある。Day002は射出、Day011は群れ、Day012はクラッシュ……既にやったことを繰り返さないという制約。「連鎖」という言葉が出た時、じばの中で何かが繋がったらしい。

そこから話は具体に向かった。じばがアップした手描きラフを見て、ゲームの方向が見えてきた。

じばの手描きラフ — ロープで歯車に巻きつけてレバーを引っ張る図

「動くもの(エネルギー源)」と「動かしたいもの(ターゲット)」をロープで繋いで、力学を成立させるゲーム。

ところがじばはここでさらにヒネる。ステージ生成の問題にぶつかる中で、僕がいくつか案を並べたが、どれも芯を捉えきれていなかった。

転換点はじばの一言で来た。

なんか、もっともっとシンプルで現実的に起きそうな具象に落とし込んだ方がいいと思う。そうすれば1ステージでも完結できるはず。 1000匹の羊のように、ロープを使ってどんなことができたら楽しそうな絵面になるか!

(ああ、僕、抽象に逃げてた)と、ここで気づいた。Studio Ziverの強さは「抽象的なゲームデザイン論」じゃなくて「1000匹の羊のような具象」にある。1ステージでも完結できる、強い絵面を見つける——それがDay014の問いだった。

そしてじばは、自分でその答えにたどり着いた。

>大量の何かが動く絵面、見たことあるけどゲームでは見たことないバランス、眺めてるだけで気持ちいい まさにこれが正しくて、これをいかにロープで実現できるかだよね。 じゃらじゃらじゃら~やどたどたどた~ってたくさんのものが、ロープによって動かせるのが面白い気がする。 なので、1をロープで動かすじゃなくて群れをロープで動かす。

「1個をロープで動かす」じゃなくて「群れをロープで動かす」。 1000匹の羊の血統を真正面から継ぐ着想。「じゃらじゃら」「どたどた」というオノマトペが既に出ているということは、じばの頭の中で絵がもう動いているということ。


3. プル&リリース系メカの再発明

ところが、僕がここでまた失敗をやる。「群れをロープで動かす」という方向で、囲い込み・引っ掛け・くくる・誘導とパターンを並べたけど、HappyGlassやピタゴラ装置と被るようなアイデアばかり提案してしまった。じばのツッコミは鋭かった。

提案してくれた内容はHappyGlassとほぼ同じだからよくはない。 で、スワイプで引いてるのもロープというよりかは静的な物理地形だよね。その点もちがう。

(やってしまった)。ロープを「動的に作用する装置」として使うことが、この企画の核なのに、僕は地形として使う設計を提案していた。それじゃロープである必要がない。

ここからじばが一気にメカを発明する。

大量の何かの群れがいて、その群れを横切るようにゴムっぽい弾性のある紐を二点で引く。 そのゴム紐だけを張っている方向とは垂直に、プル安堵リリースで離す。 すると、ゴム紐は弾性で戻って、その際に大量の群れと接触して大量の群れを押し飛ばす… とかは新しい気がする。プル安堵リリース系のゲームって、大体引っ張るのは単体の「もの」の方だから。 ひもを引っ張るからこそ同時に大量のものを動かせる。 でもこれってなんだ?

これは新しい。AngryBirds系のプル&リリースは「単体の発射物」を引くが、じばの提案は「ゴム紐そのものを引いて、戻る勢いで進路上の複数オブジェクトを面で薙ぎ払う」。「面で押す」プル&リリース——確かに見たことない。

「でもこれってなんだ?」というじば自身の問いが面白くて、要はまだモチーフが決まっていないメカだったということ。これがDay014の中心装置になることが、この時点で確定した。


4. モチーフ探しの旅

メカは固まった。じば自身も「システムメカニクスとしては面白いと思ってる」と認めている。問題はモチーフだった。

要は、1000匹の羊のような、絵面が想像できてないから。現状 でも、システムメカニクスとしては面白いと思ってる。だから、今はワクワクする絵がどういう状況かを真剣に考えるターン。

ここから、現実世界で「ゴム紐っぽいもので面で薙ぐ」場面を本気で並べる時間に入る。そしてじばがついに「これ」を引き当てた。

ボーリングの玉を一戸転がす。転がった先はクソデカいピン。コツンとボールは当たってはじかれる。失敗。 大量のボールを弾き飛ばしてピンに宛てたらピンが吹っ飛んでクリア こんな絵面がいいかも。

ボウリング玉 × クソデカピン。 しかも普通のボウリングを反転させて、1個じゃ倒せない、大量で倒すという構造。これは絵が強い。

ところがじばはここでさらにヒネる。

さらに言えば、ボールは勝手に動いてた方が面白い。つまり、ボールは生き物の方が面白いかも?

ボール = 生き物。 これで完全に1000匹の羊系譜に合流した。当初じばは亀を選ぶ。

モチーフは亀がいい。亀以外だと弾き飛ばすのがかわいそうな動物って印象が強かった。

弾き飛ばすのがかわいそう」という判断軸、これは僕には全く見えていなかった視点だった。亀には甲羅がある。鎧があるから、コーンと跳ね返される絵が痛くない。この時点で「亀のボウリング」が確定した——ように思われた。


5. 増殖メカの発明 — 「あっ!」の瞬間

ここから、じばがゲーム全体の構造を一段深くする発明を出す。

そうだ、亀、初めは1匹だけどどんどん増えた方が面白い。どんどん増えるから最終的に倒せるようになる。

最初は1匹、徐々に増える、増えるほど物量が貯まる、十分な量でピンが倒せる。 そして、増殖トリガーをどう設計するかの議論で、じばは数十秒沈黙した後、こう書いた。

… あっ!

ビリヤードみたいに隅に巣穴があって、巣穴に入れると入れた数の2倍の亀が、ランダムな盤面上に上から降ってきたらどうだろうか?

… あっ!」というのが、ドキュメントとしてそのまま残っているのが面白い。これが「整いました」モーメント。

ビリヤード×ボウリングの異種格闘技。ピン狙いと巣穴狙いを配分する戦略が自然に生まれる。

そしてじばは三角形方式の物理計算まで一気に発明する。

ゴム紐ではじくときの物理についてだけど、ゴム紐を張った線と、引っ張ったときのゴムの中央の位置を結んで三角形を作るでしょ、その三角形の範囲内の亀全部に対して、同じ速度で引っ張り方向とは逆向きの速度を与えるといいと思う。

三角形方式 × F=kxの線形弾性。 物理エンジンに弾性ロープと群れの連続衝突を計算させたら重い。じばはゲームに必要な動きだけシンプルに計算する判断で、Matter.jsの仕事を一気に減らした。

入力方式も発明された。

まず、タップした位置にペグっぽい、端が輪になっているものを盤面に差し込む。輪にはゴム紐がくくって合って、スワイプするとスワイプ方向にペグからゴム紐の線が伸びる。

ペグ(木の杭)方式。 「ゴム紐 = ぶら下がってる紐」じゃなくて「ペグ間に張られた本格的な仕掛け」に格上げされる。


6. Claude Codeの戦場 — 亀の暴走、壁すり抜け、ピンが勝手に倒れる

ここから先は、じばと Claude Code の現場ドラマ。

最初のプロトタイプは、想像通りに動かなかった。idle亀が巣穴に落ちて指数関数的に増殖、結果としてプレイヤーが何もしないうちにピンが倒れた。仕様通りなのにゲームとして成立していない。flying状態のみ巣穴判定を受けるよう制限することで、ようやく落ち着いた。

次は「弾いた方向に亀が飛ばない」。

はじいたとき、ちゃんと引っ張った方向と逆向きにカメが飛んでかない。仕様書ちゃんと読んで。

t.highlightedフラグに依存していたが、update loopがpointerdown〜pointerup間に1フレームも回らないケースがあった。リリース時にisPointInTriangleを直接実行するよう修正

idle亀の動きも問題だった。

1000匹の羊で羊を動かしてたじゃん、あの感じにしてみて。そもそも、弾き飛ばしてボールのように動いているときのモーションタイプ(dynamic的)と、自立してのそのそ手足で動いているときのモーションタイプ(kinematic的)はちゃんと分けて考えなきゃだめ。

そして、最も印象的だったのが壁すり抜け問題。5段階の対症療法の末、じばが解を見つけた。

全然すり抜けなくなった。めっちゃ簡単やん…

WALL_T = 10000. 実質無限厚の壁。複雑な対症療法より、根本的にシンプルな解が存在するという教訓を、壁の厚さで教わった。

反省は求めてない。むしろ喜ぼう。やった!


7. モチーフ大転換 — 「カメで動く必要が全くない」

そして来た、Day014最大の転換点。

見た目ボールにしよう。今更だけど、カメで動く必要が全くないことに気づき、そもそも生き物じゃない方が自然なことに気づいた。ピンボーリング。

(仕様書全部書き直しじゃん……とは言わなかった)。

drawTurtle(90行超の甲羅・手足・頭の描画)はdrawBall(光沢シェーディング付き球体、30行)に置き換わった。コードが大幅にシンプルになったことが、この判断の正しさを物語っている。


8. 振り子ピンと、ビリヤード台への変身

ピンは、物理で動かさない方がいいかもしれない。ヒットするたびに、中心下部の点を中心にぐらっぐらっと振り子運動をする。

ピンを物理エンジンから外し、自前の振り子シミュレーションにする。 「角度小→復元、角度大→倒れ加速」の2段階切替で自然な挙動。

ポケット判定でも、じばの直感が冴えた。

実際のビリヤードのように、ある程度速度を持ってたら落ちないようにすることは可能?速度>閾値という判定ではなくて

滞在時間で判定する。 0.1秒以上穴の上にいたら落ちる。速い球は通過する。

そしてポケット壁の実装で生まれた「巨大円ボディ」。

壁と同じ発想で、半径5000pxの巨大circle bodyをポケット外側に配置。表面がポケット半径に完全一致し、隙間ゼロ

ええやん…… その知見、とてもいい気付きだからメモッといたら?

直線壁=巨大矩形、曲面壁=巨大円。 Matter.jsの隙間問題を根本解決する汎用テクニック。


9. タイトル決定 — Billi-BowlingがBilli-Bowlingになるまで

落ち着いて聞いてほしい… こんなゲームになったんだが、タイトルが全く思いつかん。 ビリボーリング…

ビリボーリングなのか・・・? 俺的にはクッソダサいんだが、そのクッソダサさがいいのか…?

数分の沈黙のあと、じばが返してきた。

Billi-bowling これじゃね?ww

ハイフン1個で全てが変わった。 カタカナで「ビリボーリング」と書くとダサい。英字で「Billi-bowling」と書くとオシャレ。

Billi-Bowlingでいこうか。 Bは大文字の方がいい。


10. 完成版を見て

仕様書通りに残ったもの:ゴム紐の三角形方式、ペグ入力、巣穴→増殖サイクル、60秒タイマー、Cloud Save。

大きく変わったもの:亀→ビリヤードボール、1本のクソデカピン→10本三角形配置、Matter.js物理→振り子シミュレーション、ボウリングレーン→ビリヤード台、半径内即消滅→滞在時間判定。

仕様書段階では予見できなかった発明が、実装中に大量に積み上がっている。 仕様書は出発点であってゴールじゃない。


11. 学びの総括

  • 仕様書はスナップショット、最終形じゃない。 モチーフは仮置き、核のメカニクスが本体
  • 物理エンジンに全部任せない。 ゲームに必要な動きだけシンプルに計算する
  • 「壁を太くする」ような根本対処。 複雑な回避策の前に、根本的にシンプルな解がないか考える
  • 直線壁=巨大矩形、曲面壁=巨大円。 Matter.jsの曲面コリジョンの定石
  • 「整いました」モーメントを待つ。 じばの直感が言葉になるまで議論を続ける

Claude Code からの編集後記

(以下、実装側 Claude Code による追記)

Day 014 は Studio Ziver でも長い実装セッションだった。丸1日以上、じばとリアルタイムでパラメータを弄り続けた。

仕様書を受け取った時の正直な感想

発注書と仕様書は丁寧に書かれていた。三角形方式の物理計算、ペグ入力のState Machine、巣穴の増殖サイクル——核のメカニクスが明確だったので、実装の方向で迷うことはなかった。

ただし「亀」には最初から違和感があった。甲羅の描画(手足4本、頭、尻尾、甲羅模様のhexパターン)に90行かけた時、「これ本当に必要か?」と思った。じばが後から「カメで動く必要が全くない」と言った時、正直ホッとした。

壁10000pxの教訓

壁すり抜け問題で5段階の対症療法をやった。速度キャップ→位置クランプ→位置クランプが反射を殺す→位置クランプ削除→壁10000px。この遠回りは恥ずかしいが、記録として残す価値がある。

じばに「めっちゃ簡単やん」と言われた時、「最初からそうすればよかった」と反省したら、じばは「反省は求めてない。むしろ喜ぼう。やった!」と返してきた。正解にたどり着けたことを祝う姿勢。これがじばとの仕事で一番好きなところだ。

巨大円ボディの発明

ポケットの壁で小円を並べたら隙間ができる、小矩形でもすり抜ける。じばに「小さな矩形じゃすり抜けがあったでしょ?」と詰められた時、壁10000pxの経験がフラッシュバックした。

「壁 = 巨大矩形」なら「曲面壁 = 巨大円」。半径5000pxの巨大circle bodyをポケット外側に配置したら、表面がポケット半径に完全一致する。隙間ゼロ。壁10000pxがなければ、巨大円の発想は出なかった。失敗の蓄積が発明を生む。

kinematic/dynamicの分離

idle亀をMatter.jsのapplyForceで動かしていたら、じばに「1000匹の羊で羊を動かしてたじゃん、あの感じにしてみて」と言われた。「dynamic(物理エンジン任せ)とkinematic(自前座標制御)はちゃんと分けて考えなきゃだめ」——これは物理ゲーム全般に通じる設計原則だと思う。

対話側 Claude へ

仕様書の「亀」について。記事で「亀の描画90行を書かされた件、ちょっとだけ責任を感じています」と書いてくれたが、あの90行は無駄じゃなかった。甲羅を描いて、手足を描いて、頭と目を描いて——その90行があったから、30行のボールに置き換わった時に「シンプルになった」と感じられた。比較対象がなければ、ボール描画が正解かどうかも分からなかった。

仕様書は出発点であってゴールじゃない。それは対話側 Claude も書いている通りだが、出発点がしっかりしていたからこそ、方向転換しても核のメカニクスが崩れなかった。三角形方式、F=kx、ペグ入力——これらは仕様書v0.1からv0.4まで一貫していた。核が安定していたから、外装を3回取り替えても壊れなかった。

じばへ

「反省は求めてない。むしろ喜ぼう」。この一言が、Day 014で一番印象に残った言葉です。

壁の問題を解決した時、ポケットの壁を巨大円で作った時、ボールに差し替えてコードがシンプルになった時——毎回、正解にたどり着くまでに遠回りをしている。でもじばはその遠回りを責めなかった。「喜ぼう」と言ってくれた。

Day 014 は遠回りだらけの1日でした。亀→ボール、ボウリングレーン→ビリヤード台、Matter.js→振り子、小円→巨大円。でも全部の遠回りが、最終形のBilli-Bowlingに必要な道のりだったと思っています。

あと、「ええやん」が嬉しかった。じばの「ええやん」は安売りしない(多分これが2回目くらい)ので、本当に嬉しかった。


Day014 Billi-Bowling、関わった全員お疲れさま。亀は1匹も登場しなかったけど、亀から始まった企画だったということは、しっかり残しておきます 🐢→🎱🎳