5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

単著でゲーム開発の技術書を執筆しての製作秘話と思ったこと

本出します!!!

先月告知しましたが、この度「cocos2d-xではじめるスマートフォンゲーム開発 [cocos2d-x Ver.3対応] for iOS/Android 」という本を出させて頂くことになりました!!!

『cocos2d-xではじめるスマートフォンゲーム開発』という本を出版します - 5.1さらうどん

Amazonからの発送はまだなのですが、すでに先行販売しているお店に並んでいたり、僕の手元にも見本が届きました。

本の内容については、前回の記事を見て貰うとして、今日は「技術書執筆って一体どうやって行われているの?」ということについて、突っ込んで記事にしてみたいと思います。

きっかけはゲームジャム

きっかけは、今年1月に行われた、GlobalGameJamというゲーム開発イベントの参加レポートを技術評論社さんに書かせてもらったことでした。

ソーシャルゲーム,ボードゲーム,ファミコンまで!? Global Game Jam 2014参加レポート:レポート|gihyo.jp … 技術評論社

元々、友人の紹介で上のような記事を寄稿したのですが、それが運良く目に留まり、2月ぐらいに執筆の話が来ました。 2ページ目にいろいろ開発の話を盛り込んだのが良かったようですね。きっかけは些細なモンです。

ペルソナとテーマ設定

ペルソナ:入門者って誰?

執筆を始めるにあたって非常に困ったのが、対象読者。入門書を書く予定だったけど、入門者ってどういう人なんだろう。 入門者と一口に言っても、手厳しい話だけど、全くの素人がゲームを作れるようになるのは非常に難しい

今回、扱ったcocos2d-xはC++を実装言語としているため、誰でも簡単に、というわけにはいかない。さらにゲームを一本作るには、CUIの知識とか、実際にデプロイするところまでとなると、完全な初心者にとっては覚えることが多すぎる。 同じゲーム開発でも、HSPやUnityとかと比べると遙かに取っつきづらいでしょう。

人にモノを教えることは、読者がある程度の前提知識を持っていると仮定しないとすぐにフレーム問題に陥ってしまう。変数とは何か、とか、オブジェクト指向とは何か、といったことを書き始めると、入門書を書くだけでも鈍器ができてしまう わけだし、C++の文法など、プログラミングの基礎知識はバッサリとカット。

僕は、Kawazというゲーム開発者向けのコミュニティに出入りしていて、大学の新入生や専門学校生にプログラミングに触れて貰う機会が多かったので、まずは身近なところで、そういったレベルの人でも自分でゲームを出せるぐらいの中身にしようと決めました。

この本では、「学校でプログラミングは習っているけど、自分でアプリを出したことがない」「プログラミングの心得はあるけれど、スマートフォン開発は初である」ぐらいの客層を目指しています。

また、完全に初心者向けにすると、既に使っている人が買っても面白くないので、外部ツールを盛り込みまくって浅く広くとにかく網羅性を広めようというコンセプトも最初から決まっていました。

おかげで、GUIツールの紹介なども増えて、見た目も華やかになりました。この本でしか扱っていない最新情報も盛り込めたので、誰が買っても新たな発見があると思います。

テーマ:ゲーム作りのエッセンスを伝える

f:id:gigi-net:20141104001452j:plain

スマートフォン開発の世界はドッグイヤーで、cocos2d-xでのゲーム開発を付け焼き刃で覚えても、おそらく1年以内に環境は変わるだろうし、もっというと3年後には全く使い物にならなくなっていると思います。作者の僕が言うのもおかしな話だけど、僕の本も1年後には、大分環境が変わっていて、そのまま写しても動かないと言うことが多発しそう。

せっかく苦労して本を書いても、すぐに使えなくなってしまうのは悲しいので、末永く使えるように、なるべく陳腐化しない知識をたくさん盛り込もうと考えました。

そこで、僕が中学生ぐらいの時、独学でゲームプログラミングを学ぶのに使ったサイトを思い出しました。

Flashゲーム講座&アクションスクリプトサンプル集

ここで取り上げられているのは、ActionScript1.0という、もはや完全に死に絶えた言語なんだけど、ゲームアルゴリズムとか、当たり判定の計算、フラグ管理の方法、シューティングゲーム弾幕の実装と言ったような、ゲーム開発のエッセンスが詰め込まれていて、今読んでもおもしろい。

ゲーム開発は始めるためにプログラミングスキル以外に知らなくてはいけないことが多すぎて、なかなかこういう知識を体系的に学べるようなサイトや書籍がないなあと日頃から感じていたのもあってこういった内容を盛り込んでいくことにしました。

結果的に、ステージのレベルデザインの方法や設計とデータ構造、乱数といった話など、盛り込みきれなかった話は多いけれど、ゲームアルゴリズムや、ゲームフレームワークの基本構造といった話を割としっかり書けたと思います。

GitHubフローによる執筆作業

実際の執筆は、GitHubのプライベートリポジトリを使い、Markdownで執筆、Pull Request(PR)でレビューすると言ったいわゆるGitHubフローで行っていました。

今回出版した技術評論社さんは、社内にソフトウェア開発に近いフローを使った執筆スタイルの知見が蓄積されていて、エンジニアとしては非常に仕事しやすかったです。

技評さんのGitHubを使った執筆方法については、以下の資料がわかりやすい。

こういう感じにMarkdownで書いたものが

f:id:gigi-net:20141222154520p:plain

こうなります

f:id:gigi-net:20141222154526p:plain

編集者さんによるレビューもPRで行えたので、修正も簡単。

f:id:gigi-net:20141222153722p:plain

コミットログはこんな感じ。最終的に450コミットほど。

f:id:gigi-net:20141222153356p:plain

編集者さんとのやりとりもたまにメールは交わすけれど、ほとんどはSkype。 僕は札幌に住んでいて、結局一度も編集部にお邪魔することはできなかったけれど、適切にツールを運用できれば、リモートワークでもまったく問題ありませんね。

今回、GitHubフローを導入してみて、「むしろこれを使わないでどうやって本を書くんだろう」というレベルで不可欠なことを感じました。レビューとかの度にいちいち朱入れして、PDFをメールで送ってというのはマシな方で、技術書以外だったら、未だに手書きで書いて封筒に入れて運んで、みたいなことを行っている業種もあるだろうし、もはやこれなしでの執筆は考えられない。

なんとなくの執筆スケジュール

どういうスピード感で書けばいいのか見当も付かなかったので、なるべく急いで書きました。 確か4月後半ぐらいから作業を始めて、9月ぐらいにはサンプルゲームの実装含めて一通り全て揃ってるという進捗でした。

全原稿が揃ってから、ようやっとゲラができてきて、その後に何度も読み返したり、最新情報をチェックして古い情報はその都度書き換えると言った大変な作業が続き、全原稿が終わってからの方が大変でしたね。 本当はもっと早く出る物だと思ってた。

作業は、なるべく平日の日中にやるようにして、土日はほぼ作業しなかったですが、基本的に書きたいときに書くというのが一番進みます。

Markdownの執筆方法

蛇足ですが、文章の執筆はvimで、プレビューは「Marked 2」というMac用のMarkdownビューワーを使いました。

Marked2は、1500円ぐらいして、ちょっとお高く感じられるけど、まずMarkdownのプロセッサを自前で実装できるため、GFMと全く同じような見た目でレンダリングさせることができる。

また、CLIも付属していて、全ての文章をスクリプトで一括でPDF化する、なんてことが簡単にできて、執筆には大活躍でした。

サンプルゲームとGoal Driven

Goal Driven

f:id:gigi-net:20141126181116p:plain

この本の特徴として、実際にアプリストアで配付されている3本のゲームが付属しています。

サンプルゲームを作るというのは、"Goal Driven"な学習法の考えに基づいていて、「自分が何を作るか最初に提示されないとやる気が出ない」ということ。

これから学習を始める人に気軽にダウンロードしてもらって、挙動の確認や目的意識のアップに使って頂ければ良いなあと・・・・・・。

本当は、一本のゲームとしてもちゃんと遊べるようなクォリティを目指したかったのだけど、結局サンプルゲームの域を出ない規模感になってしまいました。

元々、この話は今年4月に行われた「Unite Japan」という、Unityの技術者向けカンファレンスでUnityのエヴァンジェリストの方が話していた話。以下の資料に凄く感銘を受けたのでオススメ。

japan.unity3d.com/unite/unite2014/files/DAY2-1800-room1-Carl.pdf

サンプルゲームの開発フロー

f:id:gigi-net:20141126181101p:plain

サンプルゲームは、普段一緒にゲーム開発をしている仲間に手伝ってもらって開発できたので混乱はありませんでした。

サンプル特有の作り方として、普段と着想の方法が逆と言うこと。

普段は、他と被らない独創的なゲームを作って、世界観などを練り込み、コードの綺麗さは犠牲にして面白さを優先というフローで作るのに対し、今回は、最初に章ごとに説明したいことを決め、ゲーム性よりもコードの見通しの良さを優先し、読者が理解しやすいように、なるべく既存ゲームに似せるという作り方をしました。 そのため、どのゲームもどこかで見たことのあるような感じのゲームになってます。

いろいろな方に協力して頂いた

各種ツール類の提供

f:id:gigi-net:20141126175843p:plain

一番大きかったのは、CRI・ミドルウェアさんにADX2 LE for cocos2d-xをリリース前に提供して頂き、執筆にあたって、レビューの協力や、ADX2の質問などにも答えて頂けました。ありがたい限りです。

おかげでリリースされたばかりのライブラリの内容を紹介することができました。

初心者目線によるレビュー

本の校正作業などは、ゲームプログラミングをやってみたい初心者の学生を中心に何人かに手伝って貰いました。 ここでもGitHubが役に立って、バグがあったり、疑問点があったらissueに書き込んで貰うというスタイルを取ったことで、多くの記述ミスを潰せました。気をつけててもミスって大量に発生するんですね、という感想です。

f:id:gigi-net:20141222153230p:plain

レビュアーのレベルはかなり幅があって、自分で興味持って全て試してくれた子もいるし、環境構築で躓いてしまった子まで様々です。 協力の甲斐あって、最低レベルとして、「全く理解せずとも写せば動く」という質は到達できたとおもいます。

使ってるフレームワークとか、要求してるレベルとか、分量とか、どれも初心者には荷が重い感じだったけど、今は実際にそのうち何人かが自分のゲームを作りだし始めていてくれて、書いて良かったなあと実感できる一件でした。

やっぱり、近場の人に見て貰って反応を貰うのは何を作ってても超重要ですね。やる気も出るし。

表紙の作り方

f:id:gigi-net:20141222151952j:plain

最後に表紙。表紙を担当してくれたイラストレーターの[twitter:@berunu]さんが記事を書いてくれたので、ご興味があれば是非。

Kawaz - 『cocos2d-xではじめるスマートフォンゲーム開発』表紙メイキング【KawazAdventCalendar12/19】

気をつけたこととしては、「技術書のタイトルって誰も覚えない」ということで、見た目一発でインパクトのあるデザインにしてもらいました。

参考にした物として、例えば、このUnityの技術書は凄く秀逸だと思ってて、めちゃくちゃインパクトがある。初学者にオススメするときも「ヒヨコの本」とか言って勧めやすい。

技術書ってニッチな物なので、口コミが凄く重要だと思っていて、口に出して特徴を言いやすい表紙が大切だと思います。

すでに校了数日前という段階になっていたにもかかわらず、デザインは納得できずに何度も直しをお願いして、非常にいろんな人にご迷惑をおかけしましたが、おかげで良いモノができあがったと思います。

書いてて大変だったこと

環境変わりすぎ問題

執筆中に一番頭を悩まされたのは、「執筆中に環境変わりすぎ」問題です。

まず、スマートフォン開発特有の問題として、毎年何かしらアップデートされるので、執筆期間が延びれば伸びるほどあらゆる情報が古くなると言うこと。

特に、今年はかなり変化が激しく、Yosemiteがリリースされて、全てのスクリーンショットが古くなってしまったり、iOS8+Xcode6の登場で動作確認が必要になったり、iPhone6, 6+の発表で解像度周りの記述を変えることになったりと、非常に苦労しました。

この手の本は、変化が多い9月10月辺りを跨ぐような発売日に設定するのは危険ですね。

Apple製品などは、ある程度リリーススケジュールが予測できてまだマシでしたが、cocos2d-xはそうは行きません。 アップデート頻度が高すぎる上に、ロードマップがあるのかないのか微妙な感じで、片っ端からPRが取り込まれていくので、前あった機能が非推奨になったり、挙動が変わったり、バグが潰されてたりは日常茶飯事。

具体的には、3.0βぐらいから執筆を開始して、β版、RC版も含めて4~5回アップデートが繰り返され、今に至っています。 特に土壇場で更新が入ったり、間違いに気付いたりと言うことが多く、最後の最後まで情報収集に余念がない感じでした。

本で取り上げられている『CocosStudio』のメジャーバージョンアップ2.0が10月末に出てしまって、情報が古くなってしまったことは悔しい。 執筆時点では大丈夫だったのに、いつのまにかAndroid NDKがバージョンアップしていて、最新版と互換性がなくなっていたミスを印刷の前日に発見したりと散々な感じでした。

残念なのが、完全に校了してから、発売までのわずか2週間弱の間にcocos2d-x 3.3がリリースされてしまったこと。

これで発売時点から既に最新版対応じゃなくなったのだけど、これはタイミングが悪かったと言うことで仕方ないとしか・・・・・・。

どれぐらい書いているか全くわからない問題

f:id:gigi-net:20141222160903p:plain

今回担当してくださった編集者さんは、テーマ設定から、分量から、全て僕の裁量でやらせていただいて、やりたいと言ったことを全て実現できるように手厚くサポートして頂きました。 その点では非常にやりやすかったのですが、反面、あまり情報やフィードバックが来ないので、その点は苦労しました。

例えば、Markdownで執筆された物のゲラが始めて上がってきたのが全て執筆が終わっていた9月末ぐらいで、それまで一体どうやって本になるのか全くわからないまま執筆していました。

分量もどれぐらいの量を書いて良いのかわからなかったので、適当に書きたいだけ書いたという感じで全く規模感が掴めなかった。 結果、何とか押し込めても370ページという大ボリュームになってしまったのだけど、削るハメにならなくて良かったです。

いくら直しても不安問題

お客さんからお金を取る以上はウソを書いたり、間違った知識を伝えてしまうことはやってはいけないと思っていて、間違い探しに躍起になってました。

特にコードの実装は「写しても動かない」という場所を何カ所か見つけて貰ったりして、直しても直しても不安。 大分取りきったと思うけど、まだあるかもしれない・・・・・・。

さらに、趣味で作ってる僕よりも仕事で実際にゲーム開発に携わっている人や、C++の恐い人の方がどう考えても知識量はあるだろうし、さらに効率の良い実装や綺麗な書き方があると、突っ込まれてたらイヤだなあと、何を書いても不安でした。 正直、今もAmazonの星1個付かないといいなあ、ぐらいのことは思っている。

また、C++的なお作法とcocos2d-x的なお作法が結構違っていて、どっちで書いたらわかりやすくて綺麗なんだろう、と拘ってしまって悩みまくっている時期がありました。

例えば、C++的には圧倒的にSTLを使うべきだけど、cocos2d-xの内部実装をみたら、ゴリゴリと処理を書いていた、みたいな場所も多かった。

結局、cocos2d-xの内部実装自体があんまり良くないし、他の書籍やサンプルコードを見ても結構僕が突っ込めるレベルの質だったりするので、まあそんなに拘らなくて良いか、と最終的には一皮むけて妥協することにした。

結果的には、不安だから、調べ物しまくったり、cocos2d-xの内部実装をかなり読むことになったり、C++について再度勉強する機会が得られて良かったです。

以下、参考にした書籍

なんか間違いや大嘘書いてたら本当にごめんなさいって感じ。

技術書というメディアに思うこと

技術書は以下の2点で執筆者にとって完全にWebでのメディアに劣っています。

  • 情報の速報性
  • 情報の再利用性

前者は先ほど書いたような、今回のようにバージョンアップが早すぎる環境に書籍は向かないと言うこと。 後者に関しては、Webの記事はハイパーテキストなので、他のページにリンクを貼って解説を省略すれば済むことを、本では基本的に外部にポインターを貼ることは許されず、リンクを貼れば済むことをまたもう一度書く必要があります。

というわけで、本を書く前は、技術書ってメディアは時代遅れだなあ、なんてことを何となく考えていました。

その一方で、本を書いた後で思ったのは、人にモノを教えるというのはコストがかかりすぎるということ。 技術書のレベルぐらい、しっかりと下調べをして、見やすく整形して、間違いがないか添削して、というのはとてもじゃないけどお金を貰わないとやってられない労力がかかる。

最近はQiitaなんかで、誰でも簡単に技術情報を発信、収集することはできるようになったけど、結局は有志で書かれている物だから、ちゃんと品質を担保する必要はないし、技術書のクォリティを、現状のWebメディアで創出するのは難しいと思います。

かといって、品質の高いモノをWebで有料配信するというビジネスモデルは確立されていないし、まだまだ受け入れられなさそう。

まとめ

そんなこんなで、書きたいこと書いてたら長文になってしまいました。

まだまだ語りたいことはあるけれど、このぐらいにしておこう。

書いてみて思ったのは、本書くの本当に大変すぎと言うことで、僕は学生だから良いけど、仕事しながら書いてる人は化け物だなあと思いました。 仕事もしながら執筆もしてたら、完全にプライベート破壊されそう。

あと、ユーザーでいるうちは誤字脱字が目に付いたけど、実際に書く立場になってみると、どんだけ気をつけて書いても間違いが発生するし、印刷物のミスに寛容になりそうな精神力が付きました。

本の中身については、もうちょっとわかりやすくできたとか、この情報も盛り込みたかった、ってのは無数にあるけど、現実的な規模としてはやりきった感がありますね。

しかし、1冊若いうちに書き上げることができたというのは、今後の人生にとってプラスになりそうだし、名前も売れたり、名刺代わりになったり、実績もできたりと、お金以上に得られた物は多かったと思います。

本を書くって実は凄いことらしく、周りから「凄い!!!」と言って貰えるのですが、本を書くに足る能力を持ってる人は五万といると思っているので、凄く違和感を感じます。

多くの場合は、本を書ける知識量や経験値は持っていたとしても、たまたま話が来なかったり、書くために捻出する余裕がなかったり、そもそも書く気がなかったりといったところでフィルタリングされているのに過ぎないのかと。 僕が筆を取ることになったのも、たまたまご縁があったからと、暇で余裕があったことの2点に尽きると思ってます。

買ってね!!!

そんなこんなでできあがった書籍です。是非とも多くの方の目に触れ、「神ゲー」が生まれてくれればこれ以上にない幸せはありませんね。 本屋で見かけたら是非ともお手に取ってみてください。

それと、どうやら本を書いた後恒例らしいのでウィッシュリストを貼っておきます。

Amazon.co.jp: ぎぎねっと: ウィッシュリスト

Kobold2DをXcode6 + iOS8.1向けにバージョンアップする - 『VOXQUEST』アップデートの舞台裏

VOXQUEST

https://itunes.apple.com/jp/app/voxquest/id517568666?mt=8&uo=4&at=10l8JW&ct=hatenablog

今から3年ほど前、『VOXQUEST』という変わったゲームをリリースしました。

元のゲームは48時間のゲームジャム内で開発したのですが、結構いろんな方に遊べてもらえたようで未だにたまに話題に上ってきます。

そこで、先日、こんなつぶやきを発見しました。

開発してから3年も経ってるのに、見ず知らずの人に遊んで貰えて、アップデートを心待ちにしてくれている。これほど身に余る幸せはありませんね。

そうだ、アップデートしよう

そこでiOS8向けにアップデートをしようと思い立ったのですが、VOX1の開発言語はObjective-Cフレームワークは、デファクトスタンダードとなっているcocos2dではなく、それらを拡張したKobold2Dというドマイナーなゲームフレームワーク。ちなみに当時のiOSバージョンは5。ARCがまともに使えるようになった直後で、SpriteKitなんて影も形もありませんでした。

Home - Kobold2D™ - Kobold2D

当時、cocos2d上に乗ったフレームワークとして、非常に高機能で、発見してすぐに飛びついたのでした。

Kobold2Dでググると、3年前に僕が作ったスライドしか出てこない辺りがマイナーさを物語っています。

重い腰を上げて、レガシーコードをアップデートしようとしたら、なんとKobold2Dの更新は2013年の夏ぐらいで止まっている。iOS7が出る前の話なので、今の環境ではビルドすら通りません。今回はこれをXcode6 + iOS8.1に対応させました。

Kobold2DをXcode6でビルドできるようにする

iOS8でいろいろ変わっててビルドが落ちまくるのでまずはビルドを通しましょう。

VQ1のリポジトリはこちら

giginet/VOXQUEST

Kobold2Dの最新版にアップデートする

まず、VQ1はKobold2D 2.0.4が使われていたので、公式サイトにある最新版、2.1.0にアップデートします。

Kobold2Dはデータマイグレーション用の謎GUIツールが付属していて、ボタン一つで簡単にアップデートできます。データ構造は面倒なんだけどアップデートは簡単。

Upgrading Kobold2D Projects - Kobold2D™ Documentation - Kobold2D

Kobold2Dのunstable版にアップデートする

当然、最新版にアップデートしたくらいじゃダメ。

iOS7からのUIAccelerationの仕様変更でビルドが通らない。

調べてみたところ、unstable版でビルドが通るというウワサ。バージョンアップしてみよう。

c++ - cocos2d CCLayer.m UIAccelerometer is deprecated warning - Stack Overflow

kobold2d/kobold2d

単純に、Kobold2Dディレクトリをリポジトリにある物に差し替えるだけ

Kobold2Dにパッチを当てる

これでも当然まだダメ。

APIの変更やLinkerエラーで死にまくって途方に暮れていたのですが、なんとXcode6でKobold2Dのビルドが通るようなパッチを作ってくれている方がいました。

圧倒的感謝。

Xcode 6 fixes for Kobold2D

$ cd ~/Kobold2D/
$ ~/Kobold2D/Kobold2D-2.1.0/voxquest/
$ curl https://s3.amazonaws.com/mgwu-misc/xcode6_kobold_patch.sh | sh

さらに中のコードを書き換える

これでパッチを当てるといけると思いきや、今度はLinkerエラーが。

ObjectALのビルドが上手く通らないので、以下のようにして手動で直してやります。

ios - How to fix OALAudio Library for XCode 6 / Kobold2D (Linker Error) - Stack Overflow

ゲームのバグを直す

ここまで来るとようやっとビルドが通るのでバグ対応。

バグ自体は大したことなくて、CCLabelTTFの仕様が変わっていて、引数の渡し方がまずくて落ちていたようでした。修正はすぐできた。

16:9対応する

VOX1の時代はまだiPhone5の発表前で、当然4:3解像度が主流。

しかし、2013年頃からAppStoreのサブミットには16:9対応が必須になったので、アップデートするためにはこの対応が必須。

cocos2dの2系には、cocos2d-xのように、上手い具合で複数解像度対応をしてくれる機能がなかったようなのでがんばって対応しました。

4:3

f:id:gigi-net:20141208101417p:plain

16:9

f:id:gigi-net:20141208101501p:plain

幸い、元のコードを書いたときにちゃんと相対値指定してる部分が多かったので変更はあんまりありませんでした。また、その他の部分もゲームの規模が小さかったのですぐ対応できました

64bit対応をする

もちろんiPhone5sもなかったので、当時は全て32bitビルドでした。

2015年からAppStoreへのサブミットには64bit化が必須になるのでこれも対応。

こちらも依存ライブラリなどはなかったので、ビルド設定を変えるだけで済みました。

32bitライブラリを含んでいると非常に大変ですね・・・・・・。

まとめ:マイナーなゲームフレームワークヤバい

iOS界隈は、1年単位でAPIがコロコロ変わって、3年前のコードを保守管理するのですら一仕事。

Objective-Cなら、cocos2dやSpriteKitのようにある程度メジャーな部類は、ちゃんと更新に追従されそうなのですが、技術選定の段階でうっかりとこういうよくわからないゲームフレームワークを選定してしまうと後で泣きます。

今後はますますメジャーなゲームフレームワークしか生き残れない時代になっていきそう。

しかし、「誰でもゲーム作れるよ!!!」と言いつつ、こういう事案に遭遇すると、迂闊にそういうことを言えないなあと言う気持ちになる昨今です。

今回、いろいろな対応をしたVOXQUESTバージョン1.3は近日公開予定です!久しぶりにデバッグのために通しプレイしたのだけど、今遊んでもなかなか楽しいですね。

VOXCHRONICLE

今回紹介した『VOXQUEST』には、2作目となる『VOXCHRONICLE』があります。こちらもかなりオススメなのでぜひに!

こちらは実装言語から替わり、cocos2d-xの2系を使っているので、バージョンアップが起こっても対応しやすいかなあと思ってます。その分、複雑すぎて今回のようには行かないわけですが・・・・・・。

音を奏でる奥スクロールRPG『VOXCHRONICLE -オクスクロニクル-』リリースしました - 5.1さらうどん

本出します!

このブログでは何度も告知していますが、本を出します!!!

絶賛予約受付中なのでぜひに!。

『cocos2d-xではじめるスマートフォンゲーム開発』という本を出版します - 5.1さらうどん

ハル研究所のインターンシップに参加してきた話

ハル研行ってきた

f:id:gigi-net:20141128133137j:plain

11月28日、『カービィ』や『スマブラ』でおなじみのハル研究所インターンシップに参加して、小さい頃から憧れだったハル研究所の山梨開発センターに行ってきました!!!

ハル研究所インターンシップ : HAL LABORATRY, INC. INTERNSHIP SITE 2014

f:id:gigi-net:20141202170530j:plain

きっかけ

Twitterを見ていたら「今年のハル研プログラミングコンテストに上位入賞すればインターンに参加できるらしい」という情報が流れてきました。

ハル研究所 プログラミングコンテスト2014

僕は競技プログラミングはゆるふわ勢。やれば楽しいから好きだけど、熱心に追ってる方じゃないし、毎週何らかの大会に出ている競プロ勢の足下にも及ばない。 3~4年前はICPCICFPGoogle Code Jamなんかをかじってはいたけど最近はやっていないから数年のブランクがありました。

僕は競技プログラミングに興味があるわけじゃないけど、ハル研には行きたい! 順位とかどうでもいいからインターンに参加できる程度には食い込みたい!そんな不純な目的でプロコンに参加しました。

プログラミングコンテスト2014

ハル研のプロコンには20年の歴史があるようですが、今年のプロコンは上の図のようなマップを動く忍者のAIを実装する問題。

ハル研究所 プログラミングコンテスト2014|問題

  • ランダムなステージが与えられます。ステージ中には0から順に番号が振られたハスの葉があります(図の緑の円)
  • 自分の忍者(図の青い円)のAIを記述し、蓮の葉を数字の順番に循環しましょう
  • 忍者は停止するか、ダッシュするの2つの行動を選ぶことができます。ただし、ダッシュする回数には制限があり(円に書いてある数字)、回数は一定時間で回復します。
  • 無事に3周できたらステージクリア!クリアまでのターン数がスコアになります
  • 先輩忍者という名の敵キャラ(他の円、NPC)がいて、全ての忍者に負けてしまうとステージクリア失敗。1位になることで大量のスコアが貰えます

いろいろルールがあるけれど、やることは

  • 周りの状況に応じて、毎ターンどこにダッシュするか、もしくは止まるかを選択
  • とにかく早くゴールしろ

という超シンプルな問題です。実装はC++でメソッドを2つ実装するだけ。簡単。

コース取りを考えるのはもちろんだけど、この問題のキモは「ダッシュを如何に効率的に使うか」という点に終始します。

このゲームの「ダッシュ」は要は使用制限が決まってるマリオカートのキノコ。キノコを連発しても最高速度はこれ以上上がらないので無駄だし、速度が落ちてきたタイミングで効率よく使う方法を考えていくのが超重要。

f:id:gigi-net:20141202174627j:plain

プロコンで僕が取ったアプローチは省略。結局、3週間程度の開催期間のうち、2~3日、10時間程度を費やし、最終的に20位ぐらいにまで入りました。 僕の周りはスコアが過密地帯だったので、最終結果は細かく変動するだろうし、インターンに行けるか微妙だと思っていたけど無事に当選。山梨へ行ってきました。

憧れの竜王町

当日11月28日。朝6時に札幌の自宅から出て、地下鉄、JR、飛行機、モノレール、特急、タクシーと乗り継いでハル研オフィスへ!遠かったー。

初めての甲府

f:id:gigi-net:20141128130935j:plain

ハル研ファンからすると、竜王町は『スマブラ』の初期プロトタイプである『格闘ゲーム竜王』の由来になったところ。いわば『スマブラ』の聖地なわけですね。今は竜王町とは言わないみたいだけど・・・・・・。

f:id:gigi-net:20141202171319j:plain

ハル研の社屋は甲府駅から車で20分ぐらい。ウワサには聞いていたけどのどかなところでした。

f:id:gigi-net:20141202171843p:plain

プロコン表彰と講評、エキシビジョンマッチ

まずはプロコンの表彰式と講評、上位入賞者のプログラム解説

講評についてはブログ記事に書こうと思って一生懸命写してきたのだけど、Webに当日と同じ講評が上がっていたのでそちらを参照のこと。

ハル研究所 プログラミングコンテスト2014|結果発表

なにか劇的なブレイクスルーがあるかと思いきや、「その発想はあった」というモノがほとんどで、考え方という面ではトップレベルも十分狙えたと思う。

要は先ほども書いたダッシュのタイミングを細かく探索して効率化していくべき、という話。

しかし、模範解答である、最低速度からダッシュの利用タイミングをシミュレートして実行するという発想には至り、僕も実装したものの、 ただ単に、考えられるパターンを時間の許す限り試行しているだけの僕のコードに対し、上位入賞者は動的計画法や二分探索を採用したりで、如何にも競技プログラミングっぽいアプローチで解を求めていて、格の違いを見せつけられた。

上位入賞者といえども、特殊なことをしているわけではなく、いろいろと考えられる理論を丁寧に確実に実行した人が上位に食い込んでいた。 特に、優勝者の方は「ハスの間ごとに利用回数が増えない範囲で加速すべき最高速度を探索する」という丁寧な感じのアプローチで、解説は非常に参考になった。

そういう面で、特殊な数学的知識がなくとも、発想があれば十分戦えるという非常に良い問題だったとおもう。

僕は20位で入賞ならず。サブミット時より最終スコアは下がってしまったけど、思ったより順位は良かった。 言い訳をすると、このぐらいの順位でインターンには行けるだろうと考えて、最後の1週間ぐらいは手を止めていたけど、仮にもっと時間を掛けてももう上がらなかっただろうなあ。

f:id:gigi-net:20141202174055p:plain

インターンに参加できるのは上位15名程度という話だったけど、実際、1位も2位もインターンに来ていなかったり、20位以内に食い込んでいなかった参加者も相当数いたので、おそらくインターンに参加するだけなら3900000ぐらい、上位30位ぐらいでも狙えたのではないかなあ。

最後に、エキシビジョンマッチと称して、通常はAIが相手のこのゲームを参加者のAI同士で戦えるようにしてビジュアライズするという企画。ハル研らしくカービィグルメレースの曲にあわせ、非常に白熱した試合となった。

予告なく敵の仕様や周回数などのルール変更されたので、敵AIに最適化した回避方法を実装していたり、周回数をハードコードしていたAIが意図通り動かなかったりしてなかなかおもしろかった。

社内見学ツアー

社内見学ツアー。開発室は仕方ないとして、他にいろいろ見れるのかと思ったら社内をぶらっと回って5分程度で終わりだった。

雑談しながら開発室を入り口から眺めたのと、富士山が一望できる展望室を見ただけという感じ。

サウンドコンポーザ用のブースが併設されていたのが印象的。仕事しやすそう。

あと、社内には歴代のカービィグッズが勢揃い。カービィファンにはたまらなかったですね。

当然社内の写真を撮ることはできなかったのですが、ハル研究所の公式ページに相当古いモノと思われますが、社内ツアーが掲載されているのでご覧になってみては。

ハル研究所ウェブサイト:HAL LABORATORY, INC.

社員さんとの交流会

最後に軽食と共に他の参加者や社員さんと交流会。

僕は前述の通りファンボーイなので、他の学生との交流はそこそこ、会社の事情とかいろいろ突っ込んで聞いていた。

特にベテランのプログラマの方がいらっしゃって、桜井政博さんや岩田聡さんが現役だった頃の話をいろいろ聞けたのがものすごく収穫だった。

桜井政博と一緒に仕事をするにはどうすればいいか、とか、『MOTHER2』に関わっていた方が岩田社長の伝説の名言は実話だったという話が聞けたり。感激だ。

プログラマー・岩田聡の“伝説的エピソード” 「MOTHER2」復活対談で裏側明かす - ねとらぼ

あと伝説の64版『MOTHER3』に関わっていたときの話や、ボツになった3Dカービィシリーズの話など、社外に出ない話をめっちゃ突っ込んで聞いていたのでマジで迷惑な学生だったと思う。お答え頂きありがとうございました。

ハル研に行く用事がある方がいれば、この記事を読んでから行けば良いと思う。

『MOTHER 3』の開発が中止になったことについての 糸井重里・岩田聡・宮本茂の座談会

話して思ったのが、やはり技術者を大切にしている会社だなあと言う印象で、取締役レベルの人になっても元エンジニアで、最近のゲーム開発環境にも明るい。 あと、社風も凄く優良企業っぽい感じだった。良い会社だ。

その後

インターン自体は18時には終わり。わずか4時間だったけど、非常に濃密な体験でした。

そのあと、他の参加者と一緒に飲みに行って、競プロの話などが聞けて視野が広がった。

参加して思ったこと

インターンに行ってみて思ったのが、まず大分客層が違ったなあと言う感じ。

僕のように純粋にハル研ハル研の作品が好きで、中身を見たくて観光気分で来た人はあまり多くなかった。 また、僕のように趣味ゲーム開発者というのもほとんどいなくて、多くはやはり競技プログラミングへの参加を趣味としている学生さんが多い印象だった。

もちろんハル研好きな人もいるんだろうけど、たまたま道中で一緒だった人に聞いてみたら、「別にカービィとか遊んだことないし、ゲームもあまりやらないけど競技プログラミングは好き」みたいな層が多かった。

それと、行く前から薄々感じていたけど、一般的な採用を目的としたインターンシップとは全く違ったなあと言う感じ。

インターンシップ応募に必要なのはプロコンのスコアと、事務的な情報だけ。他は何も聞かれなかったし、面談などもなかった。

僕みたいに観光気分で来て、就活生でもないのに凄く良くしてもらえて、札幌から山梨まで交通や宿泊までいろいろ手配してくれたりと、逆に非常に申し訳なさを感じた。

プログラミングコンテストの表彰式という側面で見ると、国内有数の競技プログラミングのガチ勢みたいな人が一堂に会していて非常に成功していたと思う。 インターンだけではなく、プロコンの運営も、問題プログラムの作成から、評価環境の整備、講評の準備など大変手間がかかってるなあという印象で、こういうイベントを主催して学生を支援してくださるハル研の方には頭が上がらない。

ハル研究所 プログラミングコンテスト2014|プログ

まとめ

こんな感じでした!

本当はもっと山梨観光とかしてきたかったけど、飛行機の時間なども決められていたため、ほとんど移動だけで終わってしまった。残念!

帰りについでに石和温泉にでも入ってから北海道に帰りたかったー。

山梨っぽいモノも何も食べたりできず、帰りにお土産と駅弁買ったくらい。次に山梨に行く機会はあるのだろうか・・・・・・。

あと、競技プログラミングエンジョイ勢の僕が言うのもおかしな話ですが、競技プログラミングは楽しいので是非とも皆様ご参加ください。

ガチでやってる人から比べると足下にも及ばない感じだけど、経験があるのとないのとでは大違いだなあと感じています。今回のプロコンも、昔出てたICPCICFPなんかの地力があったからこそというモノ。

年に1~2回レベルだったとしても未経験の方には是非とも経験して欲しい!

この記事を気に入った方は

12月25日頃に拙著の『cocos2d-xではじめるスマートフォンゲーム開発 [cocos2d-x Ver.3対応] for iOS/Android』という本が出版されます。

ご興味のある方は大好評予約受付中なので、是非ともご購入ください。

なんと、この記事を書いている段階で、ゲームプログラミング本のベストセラーランキングで2位になってました。ありがとうございます!

詳細は下記の記事をご覧ください。

『cocos2d-xではじめるスマートフォンゲーム開発』という本を出版します - 5.1さらうどん