YosukeMの触ってみて面白かったものたちスマートフォン用の表示で見るYosukeMの触ってみて面白かったものたちこの広告は、90日以上更新していないブログに表示しています。Jam、通称GGJに参加するためだ。Jamとは、寄せ集めのチームが2日かけてゲームを作るイベントである。1月末に世界中で同時に開催されている。30分ほど遅刻して教室にはいると、そこでは、100人以上の開発者たちが、ゲームデザインに関する講義に耳を傾けていた。福岡会場の主催である金子さんから、名札が配られた。名札の裏にはばらばらに切られたゲームタイトルの画像が差し込まれている。これがぴったりとそろう相手が、今回一緒にゲームを作る仲間になる、という趣向らしい。僕の名札に入っていたのは、ラブプラスの高峰愛花だった(これが金子さんの趣味か......!)他に、3人の人々がラブプラスの画像をもっていた。本来のチームの人数6人に対して、4人しか揃っていないということで、チーム名はラブマイナスに決定した。・ゲームの核を決める4人で会議が始まった。一般的にはブレインストーミングからアイディアを出したりするのだろうが、僕たちは特に形式を決めずに話し合いを始めた。今回のGGJのテーマはこれだ。「無限ループ」キーワードをいくつか紙に書き出してみる。お互いにどんなジャンルが作ってみたいのか、意見を交換し合う。アクション、パズル、ボードゲームといった案が上がる。ここで一つ問題が発覚した。うちのチームは、プログラマーが二人、グラフィッカーが一人、両者の掛け持ちが一人で、サウンドの担当者がいないのだ。「これは、サウンドがいないという前提で進めたほうがいいかもしれませんね」サウンドがなくても成り立つゲームとしては、ボードゲームがある。そこで、僕が直前に出していた「蛇を操作して輪を作り、その中を陣地とする対戦型ゲーム」というアイディアを元に、ボードゲームを考えてみることにした。「六角形がいいと思う」リーダーの出した案はこうだった。プレイヤーは順番に六角形のパネルを並べていく。パネルには蛇の絵が描かれている。それを繋げて、陣地を作る。ボードの端から蛇が伸びてゆく。2つのパネルと隣接する場所にしか、自分のパネルは置けない。相手を妨害しながら、最短ルートで中心を目指す。「妨害が発生しないことがありえますよね」ボードゲーム案はうまくまとまらない。結局、原点に立ち返って、陣取りをデジタルゲームとして作ることになった。ここまで、およそ2時間。他のチームより早くまとまったものの、残り26時間で形にしないといけないと考えると、悠長にしている時間はなかった。・ゲームデザインの細部を決めるプログラマー間で、ゲームのアイディアをどう実現するか、会議することにした。「それって難しくない?」リーダーが口を挟んだ。たしかに、任意のパスを塗りつぶすアルゴリズムは、ちょっと考えたくらいでは思いつかない。「へびの曲がり方を一定にして、曲がり始めたら必ず円を描くようにしたほうが、簡単に面積を計算できるんじゃない?」たしかに、計算はそちらのほうが簡単だ。このゲームの醍醐味は、より多くの陣地をとろうとすればするほど、敵に妨害されるリスクが高まるという点にある。曲がり方を一定にしてしまうと、それが成り立たなくなる。下手にリスキーなことをして、締め切りに間に合わなくなるのは避けたい。僕が口をつぐんだそのとき、もう一人のプログラマーが手を挙げた。「やりましょう!」その勢いに押されて、僕も乗った。「やりましょう!」そうして、リーダーは懐柔されたのだった。よい時間だったので、お昼を食べるためCoCo壱番屋へと入った。「マウスでの操作をイメージしてました」と、もう一人のプログラマーは言った。現実的に考えて、マウスポインタの位置を複数取得する方法はない。ネットワーク対戦を組み込む余裕もない。ジョイパッドを使うのが無難だった。「みんなに遊んでもらってから決めたら?」CoCo壱のカレーは辛かった。帰り道、同じ大学からきていた参加者に会った。彼は、サウンドとして、別のチームに所属していた。戻ってから、プラットフォームをどうするかという話になった。GGJで3Dゲームを作る場合、Unityの利用が大半を占めるが、2Dについてはこれという選択肢がない。最初は、JavaScriptの使用を検討したが、ジョイパッドの入力を取得するのが難しいという話になり、結局XNAで作ることになった。Subversionの設定や、XNAのインストールをしていたら3時間ほどかかってしまった。その間に、チームメンバーが3人増えた。誰もがグラフィッカーだった。後から知った話だが、金子さんは、このチームはゲームと言うよりアプリを開発するんじゃないか、という目論見だったらしい。グラフィック斑は、蛇が陣地を奪い合うというよくわからないシチュエーションに困惑していた。たしかに、設定から考えると、今回のようなゲームデザインにはなりにくいだろう。彼らが最初の企画に参加していれば、ゲーム内容はまた違ったものになっただろう。そんなことを考えながら、とりあえず、グラフィック斑には設定を後付けで考えてもらうことにした。加えて、デザインの方向性を指示するコンセプトアートもお願いした。プログラマー斑は分業に悩んでいた。僕たちのチームには学生しかおらず、集団開発の経験がほぼなかった。結局、パスとマップチップのシステムはもう一人のプログラマーが組み、そのほかは自分が作ることになったが、この時点でちゃんと設計を固めていれば、もう少しきれいなコードが書けたのかもしれない。僕はGUIのプログラマーとして、まず、へびが徐々に伸びていく仕組みを作らなければならなかった。そのためには、パーツごとに分割可能なデザインの蛇を用意してもらう必要があった。そのあたりの旨を固めて、デザイナーに伝えた。実は僕も彼も、C#による開発の経験はほとんどなかった。リファレンスを眺めながら、なんとかして蛇の操作を作った。その後、ウエライドの赤がいいねという話になり、操作系を作り変えた。この時点で、夕方の8時くらいだっただろうか。その直後から、続々と部品が仕上がり始めた。蛇のグラフィックができ、タイトル画面ができ、背景の草むらができた。パスのシステムが組み込まれた。このシステムが、蛇の交差を検出し、互いの体を切断し合う。この時点で、一つの問題が浮上してきていた。グラフィックの仕事が少なく、やることがないという声が上がりはじめたのである。このゲームではもともと必要になる素材はそれほど多くない。プログラマーはかつかつで、他人の仕事に気を配るほどの余裕はなかった。今回一番苦戦したのは、やはり塗りつぶしの実装だった。当初、僕たちはパスを徐々に内側にしぼませていくようなアルゴリズムの使用を検討していた。これはうまくいかなかった。原因は不明だが、まったく意に介さない挙動を示すばかりだった。発想を変えることにしたのは、深夜3時を過ぎたころだった。パスをドットの2次元配列に変換し、その、外側を塗りつぶす。外を塗りつぶすということは、すなわち、内側以外を塗りつぶすということだ。後から反転してやれば、内側が出る。外側を確実に塗りつぶすために、マップの上下左右に1pxずつ、プレイヤーの進入できない余白を設ける。そこから塗りつぶしを開始すれば、確実に外側を塗りつぶせる。発想はシンプルだが、深夜の朦朧とした頭ではなかなか出てこなかった。実装が終了して、うまく動くことを確認すると、僕たちは床で寝た。ゲームシステムはほとんどできていた。朝の時点で、未実装の要素は限られていた。得点の表示と、勝利画面である。その部分の素材をグラフィッカーに依頼し、僕たちはデバッグを始めることにした。これはデバッグにならなかった。