バイブコーディングのおかげで20年ぶりに作ったゲーム : Mirror Break Out
(mirror-breakout-web.vercel.app)2004年の夏、軍隊で除隊間近の日々を送っていた私は、空いた時間に何をしようかと考え、ゲームの企画を始めました。当時、弟がゲームグラフィックデザインを専攻していたので、除隊したら何か一つ一緒に作ってみるのもいいなと思ったんです。(ああ…私はごく普通の文系人間です。技術はまったくありません)
アマチュアの挑戦だったので、小さくてシンプルなものを作ろうとしました。最も手を出しやすいゲームの一つであるブロック崩し(アルカノイド)をベースに、新しい対戦方式を加えたのですが、すでに多くの人が新バージョンを出していたゲームとはいえ、私のような作り方をしたものは見当たりませんでした。
除隊後、弟と弟の友人たちを集めて意気込んでチームを組んだのですが、ほどなくしてそれぞれの事情ができ、チームはすぐに立ち消えになりました。次に機会があれば作ろうと思っていたのですが、その機会は二度と来ませんでした。歳月が流れ、社会人になってからも時々思い出し、少しPythonを勉強してみようと思っていた時期にも目標にしていましたが、私にはあまりにも難しい課題でした。
そうしてさらに時が流れた昨年の夏、ミーティングが終わって一緒に夕食を取っていたところ、同席していた企業の代表の方々が、AIで作れるものが本当に増えたので皆また起業したくなる、と話していたのです。その日に刺激を受けた私は、夜に帰宅して、噂に聞いていたClaude Codeをインストールしてみました。そして2時間後…バーン!!
Claude Codeに最初のプロジェクトとして何をやらせてみようか考えた末、20年前のアイデアをたどりながら指示を出したところ、2時間ほどで目の前でパドルとボールが動き、ブロックを壊していました。あの時の震えるような感覚といったら。こういう証言(?)はもうあふれているので、皆さんも見慣れていると思いますが、半年経った今ではClaude Codeなしでは生きられない生活になりました。
ゲームはその間少しずつ磨いてきて、ようやくデモとして出せるくらいの水準にはなったので、勇気を出して公開してみます。それも、見るだけだったGeekNewsに!! もともとは2人用の対戦ゲームとして構想したのですが、マルチユーザー機能は私にはあまりにも高い壁だったので、コンピューターと対戦する形にしました。
簡単に紹介すると、
- PC向けです。モバイルにはまだ対応できていません。
- 2人が同じ空間で互いに背を向けてプレイするブロック崩しゲームです。先にブロックをすべて壊した側が勝ちます。
- 自分がボールを取り逃がすと、相手側のエリアへボールが移ります。相手が取り逃がすと、自分の側へ戻ってきます。
- 現実世界の物理の概念を入れてあり、重さ、衝撃、加速度、慣性があります。思ったより難しいです。
- デモ版なので、1試合ごとに再スタートして続けて遊べます。
- 子どもの頃のゲームセンターのように、記録を出すと名前を刻めます。
開発過程での教訓も書いてみると
- リファクタリング! リファクタリング! リファクタリング!
- 噂に聞いていたリファクタリングが何なのか分かるようになり、地獄の中にはリファクタリング地獄というものが存在しうるのではないかと思うようになりました。
- 最初は夢がふくらみ、Battle.netのようなものを夢見て機能を細かく分けてどんどん膨らませたのですが、バグの洪水の中で結局すべてリセットし、また分割して、また統合して……。Opus 4.5が出る前のことでした。
- この小さなものを一つ作るだけでもこれほどなのだから、プログラマーの方々への尊敬の気持ちを持つようになりました。
幸い今は少し身の程をわきまえるようになり、作業を細かく分けてワークフロー文書を作り、開発ログとGitコミットをきちんと管理する作業者になりました。最大の収穫は、やってみたいことが本当にたくさん増えたことです。仕事で必要なツールも、自分で直接作ってみようと一生懸命考えています。
このゲームをどうすべきか悩んでいます。今の私の状況では本格的に開発するのは難しいですし、かといってそのまま埋もれさせてしまうには惜しいとも思っています。子どもたちが楽しく遊べるゲームになってくれたら、という願いがあります。
いつもGeekNewsの投稿から多くを学んでおり、ありがたく拝見しています。ありがとうございます。
14件のコメント
コンセプトは面白いですが、操作感があまりにも良くないですね。こういうゲームで操作に慣性を適用するのは、あまり良いアイデアではない気がします。難易度とは少し別の話のように思います。
ご意見ありがとうございます。ご指摘いただいた点を検討し、慣性を半分に減らして、もう少し操作しやすくしました。私としてはまず考えていた物理コンセプトを優先していましたが、ゲームの操作性や、ぶつかったときにどうすべきかについて、さらに考えるようになりました。引き続き修正していきます。(本業が忙しくなり、反映が遅くなりました。)」
FURYさんがどなたなのか……ものすごいスコアを記録していかれましたね。;;
現実世界の物理概念を取り入れており、重さ、衝撃、加速度、慣性があります。思ったより難しいです。
ゲーム物理への理解が浅いように感じられるコメントなので、少し整えていただけると良いと思います。
直接手直ししてください(笑)。文系出身者の前でカッコつけないでください。
文系出身の気持ちまで気遣ってくださってありがとうございます。はは ^^
私が文言を整えるのが難しい理由は、あなたが作成したコードを見ていないため、どのような方法で物理エンジンを実装したのか分からないからです。
ご不快なご指摘をしてしまった点について、お詫び申し上げます。
多くの方がプロダクトの宣伝をされていますが、AIで宣伝されたり、不適切な説明を添えられたりするケースが多いため、コメントを残しました。腹を立てさせようとして書いたコメントではありませんでした。
ご関心ありがとうございます。まったく不快には感じませんでした。助言はいつでもありがたいです。むしろ、どこをどのように直すべきなのか理解できなかったので、もう少し詳しく説明していただけると助かります。
現実の物理を適用したという点についてもう少し説明すると、この手のゲームはたいてい非常に単純な衝突判定と反射だけを実装しているようです。ですが私は、実際のピンボールゲームのように、ボールやブロックが衝突したときに実際の重さや速度による衝突エネルギーが感じられるとよいと思い、ゲーム用ライブラリよりももう少し精密だと思われる Planck.js を探して使ってみました。ブロックがボールに当たると、その衝撃で押し出され、回転する様子を表現しています。また、設定でボールの重さ、ブロックの重さ、衝突エネルギーの減衰、抵抗といった要素を変更できるようにしてあり、設定によって異なる体験ができるようにしました。
(私がクレイジーモードと呼んでいる設定があるのですが、ボールの重さを最大まで上げてブロックの重さを最小まで下げると、とてもダイナミックなゲームになります。)
コードも GitHub にあります。
https://github.com/gogodevelop2/mirror-breakout
コメントしますと、
まず、衝突設計や反発係数の設定などに、より多くの努力を注がれたように思います。
そして特に、衝突がそれぞれの質量と反発係数によって計算されて発生するようになっていますが、意図されたことと異なる点を挙げると、
paddleやbrickの質量や速度のようなものはballのモメンタムにしか影響しないため、実際には本質的には衝突方式を物理学モデルから着想して、
ボールと(レンガ、パドル、壁)との衝突をそれぞれ別々に実装された、という方が近いです。
したがって、現実の物理学だとおっしゃるよりは、物理エンジンの要素を取り入れて衝突とモメンタム変化をダイナミックに設計した、と説明される方がよさそうです。
特に、衝突過程が非現実的であるためにモメンタムが変化する部分をスピード補正として適用されていますが、これは操作感の面では隠し要素のように感じられることもあれば、かなり不親切な要素のように感じられることもあると思います.
もう少しかみ砕いて説明すると、
物理学的な数式や計算方法が使われていますが、結果としては現実的ではないモデルであり、現実的でない部分で発生する問題をゲーム的に防ぐために(無限速度、停止、方向調整など)、補正した部分が多く含まれています。
詳しいご説明ありがとうございます。とてもよく理解できました。ゲーム制作が初めてだったこともあり、ゲーム物理学という世界や用語の使い方の適切さについてよく分かっておらず、そのせいで説明が誤解を招くような書き方になってしまっていました。ご説明を伺って、現場で働いている方々が成果物をどのような水準で見ているのか、少し分かった気がします。本文を修正する方法が見つけられなくて……調べて修正します。ありがとうございます。
ありがとうございます。笑 私も趣味活動を応援します!