きらりん☆DASHをドリンク飲んで制作(はし)った話

http://kirarin.illucalab.com/

作りました。
弊サークル「いるからぼ」では定期的に FLASH でゲームジャムをする良くない慣習があり、これもその一つ。製作期間は二人で二日間。ただし平日(月火)なので実働はもうちょっと少ないです。
正直短期間でゲーム作ったからなんだという話ではありますが、老いてから見返した時に「ああ、あの頃は若かったなあ」と思い出にふけるため備忘録を残しておきます。

きらりん☆DASH を作る上で、弊サークルがどのように意思決定し、ゲームデザインをし、完成までこぎつけたかというお話。

企画の始まり

 時はエイプリルフール三日前(3/29)の夜。今年のエイプリルフールどうする?という話題になる。
実は何週間か前にも同じ話題になり、ネタがないね、ということでネタが浮かんだら具体的な話をすることにしたらこの体たらくである。毎年こうである。
スカイドリフトで忙しいのでスルーもアリかな、と思う反面、いるからぼは去年もエイプリルフールをスルーしており、エンターテイナーとして何かネタを出さねば……という誰も得しない使命感に駆り立てられて二つの企画が出る。

  • OKITSU DRIVE
  • こう……なんか、きらりんが走って杏を集める的な……

 OKITSU DRIVE (SHIROBAKO の興津さんがアルファロメオでパトカーを蹴散らすゲーム)は春さん(デザイナー)がまだ SHIROBAKO を全話見ていないのであえなく没。ぼくがきらりP、春さんが杏Pということできらりゲーに決定。
 と、ここですぐに制作《はし》り出すわけではない。企画の内容を検討し、勝算があるかどうかを測る必要がある。完成しなければ爆死なわけで、本来の作業時間を二日も削っている以上、絶対にそうならないよう慎重にならないといけない。

制限事項とその解決

 よって、今回の制作にあたっての制限事項を洗い出す。

  • 製作期間は二日。それも、二日目の夜12:00が締め切りであり、決して延びることはない。
  • 平日作業のため、プログラマーのぼくは会社がある。
  • 必要なグラフィックリソース量は出来る限り少なくなければならない。

 一つ目については、走るだけのミニゲームなら多分大丈夫という見積もり。また、ゲーム挙動を没企画である「しまかぜが征く!」から流用し、時間短縮。
 二つ目は仕事が忙しくないことを鑑みて、作業進捗によって「徹夜+一日休」「単体一日休」「半休」の三つのプランを確保(結論から言うと、三つ目になる)。
 三つ目はゲームルールを考えつつ話し合ったが、どうやら背景については以前制作した「明日天気になれ」という楽曲 PV 作品をそのまま使いまわせそうだということに。イラスト総量は「きらり歩行二枚」「杏」「風船」「バリケード」「エナドリ」ということで、作業可能範囲内へ。

 ちなみに、いるからぼが短期企画で爆死したことは一度も無い。

ゲームルール

 後は、ゲームルールの策定。ミニゲームなのである程度クソゲーになるのは仕方ないが、それでも最低限遊び込める要素を入れたいので。このラインは非常に曖昧だが、面白さがいるからぼラインを突破することでめでたく企画開始となる。

  • きらりを動かして杏を集める。集める毎にポイント。バリケードに当たったら終わり。
    • 基礎としてはOK。ゲーム性ほぼ皆無で、盛り上がらない。
  • ポイントを集める毎に新しいキャラクターが出る。コレクション的な楽しみ。
    • 工数的に無理。
  • 3分間の間にどれくらい集められたかを競う
    • ルールが単純なので理論値ゲーかランダムゲーになるのでボツ。
    • Incubator くらい複雑で、プレイヤースキルが重視されるとこの方式はアリ。
  • エナドリを入れよう!
  • エナドリを集めると気力が回復して進める距離が伸びる
    • 最初のものと体験は変わってない。ボツ。
  • エナドリを取ると得点が倍になる
    • スコアが一気に伸びて結果発表のインパクトが増すが、もう一歩。
  • エナドリを取るとスピードアップ
    • ゲームが文字通り加速し、リスクリターンが釣り上がっていくので採用。

というのを頭の中で一分くらい考えて春さんに伝えるというのがいるからぼ流。

プラスα要素

 上のゲームルールに加え、プラスαとして追加した要素が以下の通り。

  • 獲得した杏がきらりの上に積み重なっていく。インパクトがあり、可愛いため。
  • ゲームオーバーになるときらりが転び、杏が飛び散る。なんか面白かったので。
    • きらりの転びモーションを作りたくなかったのでプログラムの挙動でなんとかした。
  • 風船杏。一定距離進むと風船に乗った杏が出てくる。可愛いため。
    • エナドリが強すぎて、ゲーム要素的にはそんなに意味がない。

 他多数。このゲームはルールがシンプルな分、こういう所で稼いでいる。

制作開始、一日目

 といってもまずぼくは会社に行くのであった。
 進捗確認はメールで。午後一に春さんからきらりのラフが上がってくる。可愛かったので、そのまま続行。いるからぼでは作業時間の1/2をリテイクが占めていることに気付きリテイク削減運動を行った結果、意思伝達をかなり高いレベルまで行うようにしたので最近は一発OK多し。

 定時帰宅後、まっさらな状態からまず背景のスクロールを制作、きらりの挙動を制作、プログラムの土台を作った所で力尽きて終了。この時点でグラフィックは仮素材で全て用意してもらい、グラフィック作業は差し替えのみに。
 音楽を Star!!耳コピをしていた方に借りられることになったので、作業時間削減。進捗から考え、プランC(半休のみ)を選択。
 ……そして、寝る。睡眠は大事。

制作二日目

 午前中いっぱい仕事して帰宅(14:00くらい)。とりあえず時間を区切って、まずは17:00までにゲームの基本挙動、つまりきらりが杏を拾い、バリケードに当たったらゲームオーバーになるところまでを作る。シーケンスを早期に繋げることはとても重要で、これで全体の見通しをつけ、入りきらない仕様を削っていく。
 尚、勝手に春さんが表情差分を8通り作りやがったので全部入れてやる。
 17:00から18:00までに先行してサイト周りの準備。呟き機能追加。スコアの単位を相談。18:00に夕飯で少し休憩。栄養ドリンク(スタドリ)飲んで走る体勢。

 18:00〜20:00でエナドリシステム投入。なんと、加速が一定以上になるとロクに遊べないことが分かる。この時点で、きらりん☆DASHは 30fps だったのだ。急遽 60fps にして、各所を調整。20:45にタイトル名を「きらりん☆DASH」に勝手に決定し、15分でロゴを作成。一通りのシーケンスを見られるようにし、22:00までで風船杏・バリケードを投入。
 22時半、スコアの単位を「きゅんきゅんぱわー」に決定。この時点でいつ公開しても良いように仮上げし、サイトを整備(マニュアルも)。そして音入れ。音は過去作から使いまわし。
 23時半、春さんがハイスコア機能入れてくれとか言い出す。入れる。杏を取った時のスコア表示がまだだったことに気付き、入れる(これは進行度が見れるので重要)。

 0時、完成。公開。……2分オーバーしたが。

ゲーム性

 結論としては、こんな感じのゲーム性。

  • 杏を取るとスコアをゲット。バリケードに当たったらその時点で終わり。
    • 杏を取り続けると、1杏あたりのスコアが上昇する。
  • エナドリを取るとスコアが二倍になる(大きく上がる)が、スピードが上がる。
  • よって、ある程度は杏を取りつつ基礎ポイントを上げ、後半はエナドリで一気に加速してスコアを伸ばすのがコツ。

 概ねこの通りのバランス調整になったが、失敗した点も。

  • 杏を取り続けた時のスコア上昇がでかすぎて、int型がオーバーフロー(ボーナスが一周回ってマイナスに)するレベルだった。
    • 本来、最大でも+10万くらいの予定だった。が、得点は10%複利で増えていくので、思った以上に勢いがあった。みんなも闇金には気をつけよう。
    • そもそも、制限値を付けなかった時点でエナドリを取らずトロトロと進むのが必勝法になるので、低めの制限値を用意したほうが良かったかも。
  • とりあえずint型オーバーフロー前で止めることにしたが、結局そこまでは杏のみで稼ぐ方が効率が良い。
  • まあ、所詮ミニゲームなのでこれはこれで、という感じ。杏カンストからのエナドリダッシュで100兆、1000兆、或いは100京とかも行ける。単位は無量大数まで対応。

削ぎ落とした仕様

 割と順風満帆に見えて、実は結構想定していた仕様を削ぎ落として最低限の構成になっている。この仕様削減をしたのは二日目の午後17:00。全体のシーケンスを通しで先に作ることはとても重要。

  • 内P。ぶつかると飛んでいく。ボーナスポイント入手。
    • 演出的には嬉しかったが、春さんが力尽きたため断念。
    • 幸子にする案もあったけど可哀想なのでやめた。
    • ちひろ案が容赦なくゲームオーバーにしてくる案もあった。
  • フィーバーモード。一定以上エナドリを取るとフィーバーモードに突入、背景が虹の道になり杏が光り輝く
    • 工数が足りず断念。素材はあった。
  • エフェクト。杏や缶取得時。
    • パーティクルシステムの導入時間がなかったのと、無くても割と「取った感」があったので削減。
  • スコア表示の単位付け
    • 公開後、4/1の午後に追加。やっぱり単位あったほうが分かりやすくていい。
  • 音量調整追加
    • これも公開後4/2深夜に追加。まあ、あった方がいい。コードは過去作からある程度流用。

まとめ

 エイプリルフール企画は、早い段階で先まで見通してかっちり予定を立てることと、制作中に臨機応変に計画を軌道修正することという、一見矛盾した二つの要素が大切になってくる。これを言葉のみで説明するのは非常に!難しいのだが、この記事で少しでも制作の温度感のようなものが伝われば幸いである。
 
<はー本気出すのって疲れるよ


おまけ

 データ構造を中心としたゲームの仕組みについて。(プログラミングの知識がある方向き)

  • きらり、杏、バリケードエナドリは全て MovieClip (FLASHの個別オブジェクト) を継承した FieldObject 型を継承。
  • シングルトンである Field 型で、FieldObject のリストを持ち、全てのオブジェクトはここに登録。
    • 何故纏めるかというと、擬似3D表現のため描画順を y でソートするため。
  • 各 FieldObject で継承した init() 及び update() で初期化、更新処理。
    • 更新時に距離情報を参照し、対応する位置にオブジェクトを移動。
    • ただしきらりのみ入力を取得する必要があるので、個別の update を用意。
  • 尚、背景は FieldObject にせず、個別に動かしている。動かす際に使用する距離情報はほかの物と同一。
  • 杏を取得すると、Field のリストから除外、きらり内リストに登録してオブジェクトの親子関係を変更。
    • このとき、位置は定数テーブルから取得(レイを飛ばして空いてる場所に置いても良かったが、負荷と工数の削減のため)。
    • 画面外に突入する数が予め分かるので、それ以降は杏をそのまま破棄。
  • ゲームオーバーと同時に再びきらりと親子関係を解消し、バラバラに散らす。
    • FLASH では MovieClip 内のオブジェクト(子)をまとめてキャッシュする機能があるため、杏を背負っている時のみ親子にする。
  • 呟き時は4桁ごとにスコアをパース。21桁以降(Number型ではe+21〜と表示される)は String 型で桁数分の 0 を補填し処理。