5.1さらうどん

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

cocos2d-x 3.0でクロスプラットフォームなインディーゲームを開発した話

『Wave Weaver』リリースしました!

シンプル操作で脅威の中毒性。波をよけ続けるゲーム『Wave Weaver』をリリースしました!

詳しくは以下の記事とトレーラーをチェック!

波をかわして曲を紡ぐ、カジュアル中毒ゲー『Wave Weaver』をリリースしました - 5.1さらうどん

Google PlayApp Storeで大好評配布中です!非常に多くの方に遊んで頂けているようで驚いています。

for iPhone / iPad

https://itunes.apple.com/jp/app/waveweaver/id841280819?at=10l8JW&ct=hatenablog

iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 WaveWeaver

for Android

Android app on Google Play

Wave Weaver - Android Apps on Google Play

この記事は

この記事はWave Weaverの開発話を交えて、cocos2d-xを使ったクロスプラットフォームなゲーム開発の知見をお伝えするつもりです。

Wave Weaverは、cocos2d-x 3.0のβ版を使用しており、国内では最速レベルのプロダクトだと思われます。そのため、今後使う人に使用感など含め、お伝えしていきたいと思います。

Global Game Jam Sapporo

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

このゲームのプロトタイプは、48時間でゲームを開発するハッカソン、GlobalGameJamの中で作られています。48時間で基本的なプロトタイプはできあがっていた!

詳しくは、gihyo.jpに僕が寄稿したイベントレポートをご参照ください。

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

cocos2d-x 3.0を使ってみた

最終的に、本作ではcocos2d-x 3.0beta2を使っています。

現在ではRC版が出ているのですが、GGJ当時(1月末)の最新版はβ1でした。

lambda超便利

3.0最大の恩恵は、C++11で実装されたlambdaに完全対応しているところ!

特に、今作ではエンディングなど、逐次的な処理があったので、大体はAction + lambdaで、cocos2dのBlocksライクにかなりお手軽に記述できました。今まではわざわざコールバックを定義して、なんてことをやっていたので、非常に利便性が上がっています。

反面、lambdaを使いすぎると、コードの可読性が落ちて大変でした。特にGGJでは尚更。

さらにC++のlambda-captureと、cocos2d-xのautoreleaseが相性最悪な感じで、captureしたと思ったら、autoreleaseされててぬるぽ、みたいなことがよく起きたのもハマりどころでした

クロスプラットフォーム化が楽

3.0からプロジェクトを生成した時点で、全てのプラットフォーム用のテンプレートが生成されるので、クロスプラットフォーム化がかなり楽でした。ありがたい変更。

alpha, beta, rcで仕様が変わりまくった

まだリリース前なので、仕様がコロコロ変わって大変でした。

以前、alpha版を基準にスライドを作ったのですが、それからGGJで利用したbeta1は、ArrayやDictionaryが廃止されていたりと、結構大きな変更が。

cocos2d-x 3.0 + C++11で始めるゲーム開発超入門

最近リリースされた3.0のrc版ではプロジェクトの生成方法が変わっていたりして、あんまり原形を留めていない感じです。

開発スピードが速すぎて仕様が安定しなさすぎるので、正式リリース前のフレームワークを使うのは危険な感じ。

クロスプラットフォーム + Universal対応

今回はゲーム自体がシンプルだったのもあって、プラットフォーム別に4種類画面を作りました。

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

左からiPhone(4.0インチ)、 iPhone(3.5インチ)、iPadAndroid

iPhone / iPad

iPhone開発はノウハウがあったので、いつも通りこちらを基準に作りました。

iPhoneRetinaとNon Retinaの画像を用意する必要があるのですが、Retina版を基準に作り、Pythonで簡単なスクリプトを書いて、Non Retina用に自動変換をしていました。PIL便利。

4インチ対応は背景画像だけ別に用意して、あとは同じリソースを画面サイズから相対位置で配置するように切り替え。

iPad対応もほぼ同様。iPad版は実は実装上はiPhone版より画面が狭いです。反面、非常にボタンが押しやすくなっていて割と別ゲーに。

Retina iPad用にはSplash画像を別途用意しただけで特に何もしていません。意外と見た目は気にならない感じ。

Android

Android対応は初だったので、動けばいいや的な感じで、あまり機種ごとの最適化は行わずに、一律iPhone3.5インチのNon Retina版と同じ表示になるように作りました。Androidはこの辺が大変ですね。

ビルドにはGradleを使用。NDKの対応にはこちらの記事が大変参考になりました。

gradleでCocos2d-x3.0alpha1のアプリをbuildしてAndroidのapkを作成する - きょこみのーと

古い機種だと重たいという話も聞こえており、今後の課題ですね。

ちなみに、開発中は幻のOUYA版が存在してましたが、コントローラーへの対応が面倒だったので、リリースは見送りました。

Jenkins + TestFlight/DeployGateで高速テストプレイ

ゲームの質は、開発者が如何に遊びまくったかが全てなので、テストプレイ超重要です。

今作では、Jenkinsを用いて、コミットと同時に、各プラットフォーム向けに自動ビルドをしておりました。

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

コミッタはiPhone 4.0インチ環境で開発するだけで、あとはチームメンバーが勝手に確認したりテストしたりしてくれるので、非常にスピード感がありました。

今回のようなクロスプラットフォームの開発では、いちいち全機種ビルドして確認してられないので、CIは必須な感じがしますね。

gitは共通言語

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

ゲーム開発はプログラマの仕事が増えると大変なので、gitを共通言語にして、皆がリポジトリにコミットできる環境を作るべきだと感じました。

例えばデザイナーに「画像が差し替わったのでDropboxに上げましたー」とか言われると、わざわざ持ってきて、ファイル名を変えて、差し替えたのか差し替えてないのかわからずに面倒なことになります。

今回はgitを使えるメンバーが多かったので、その辺が非常に楽でした。プログラマ以外のデザイナーやコンポーザーもgitを使うべき。

辛かったところ

逆に今回の開発環境で上手く行かなかったところについて。

SpriteStudio for cocos2d-xが辛い

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

今回は演出を少しでもリッチにするために、アニメーション作成にSpriteStudioというソフトウェアを使用していました。

SpriteStudioはGGJのスポンサーも努めており、インディー開発者向けに、プロユースの物と同等の機能を持ったモノが無償で提供されています。ありがたい!

「超汎用」データ制作 あらゆるゲーム開発シーンに対応。2Dスプライトアニメーションデータ作成ツール「OPTPiX SpriteStudio」 | ウェブテクノロジ

しかも公式でもcocos2d-xをサポートしていたため、今回導入してみたのですが、標準で用意されてるものを再実装していたり、インターフェイスが独特だったりと、ライブラリのできがあまりよろしくなくて大変でした。

補助ツール・ライブラリ群・サンプルのダウンロード | OPTPiX Help Center

リリース前だったので、当然3.0には対応しておらず、動くように書き直したのですが、アルファブレンディングなどがちゃんと動かずに、そのまま使えない自体が多発。

結局、SpriteStudioで作ってもらったアニメーションを目コピーして、コードで実装したりしていました。

さらに、現在Mavericksで動かないのも辛いところ。わざわざVM立ち上げて作業してました。

ライブラリも1000行ぐらいあって、読み解いたり修正が大変な感じだったので泣く泣くそのまま使用。今後とも使っていくのであれば、しっかりと書き直したい感じですね。

とはいえ、今回のように趣味で開発する場合は、SpriteStudioは無償で使えるという点でかなり魅力的。

お金があるのであれば、標準でサポートしているSpineなどを買うのが良いと思いますが・・・・・・。

CocosDenshion::SimpleAudioEngineが辛い

cocos2d-xの音周りは、SimpleAudioEngineってのがついているんですが、必要最低限の機能しかついていない上に、なぜか実装がいろいろと酷い

などなど。

そのため、ゲーム途中でアプリをバックグラウンドに送ったときの音周りの挙動などに苦労しました。

前作の『VOXCHRONICLE』はサウンドを動的に操作する必要があったので、自前でOpenALガリガリ書いていたため、音周りの混乱はありませんでした。iOS版のみのリリースであったことも幸いして、クロスプラットフォームを意識せずに設計できたのも楽な点。

もう少し時間があればガッチリと手を入れていきたいところ。結構基本的な機能も揃っていないので、割とみんな困ってると思うんですけど、みなさまどうしてるんでしょうね。何かご存じでしたら教えてください。

ビルド時間が長すぎて辛い

cocos2d-x 3.0は2.xに比べて、かなりビルド時間が長くなっているように感じました。

特にiOS版はObjective-C++を使っている関係で、ビルドがタダでさえ遅いのに加え、本プロジェクトではboostを使っていたため、さらにビルド時間が長くなりました。

特にMacBook Airでは、クリーンビルドだと5分以上待たされることもザラ。48時間しかないGGJでは致命的な感じでした。

レベルデザイン

『Super Hexagon』を意識しまくった

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

このゲームは、『Super Hexagon』というインディーゲームに強くインスパイアされています。

『Super Hexagon』の中毒性を踏襲すべく、以下のような仕組みでレベルデザインを行いました。

  • 波の排出や、数秒間待機するなどの命令をOrderと呼ぶ
  • 各Orderには排出開始位置や、波の色、Easingなどが設定されている
  • 一連のOrderのまとまりをPatternと呼び、レベル毎にPatternを何種類か定義し、ランダムに出現順を変えている

このように、毎回適当に波を出すのではなく、ある程度のパターンをデザインし、ランダムで出すような仕様になっています。

これによって、一見突破不可能な波であっても、何度も遊ぶことで記録が伸びていき、中毒性の高いゲームに仕上がっています。

レベルデザインについては様々な声を頂いています。ありがとうございます。

レベルデザインや、波のエミッター周りの実装は、『Super Hexagon』を最高レベルまでやり尽くした[twitter:@tcptr]さんが作り込んでくれたので本当に良いモノができました。

ちなみに、だいたい1時間ぐらいでエンディングを見れるように調整してみたのですが、概ねそんな感じになっているようで何よりです。

タダでもここまでできる!

最近はゲーム開発用の環境もだいたいはOSSで揃うようになってきたので、お金をかけずにここまでの開発が個人でできます。良い時代ですね!

他の人の開発裏話

デザインや音楽などにも、細かなところに工夫が生きています。ご興味のある方は是非。

ゲーム開発したい方は

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

札幌ゲーム製作者コミュニティKawazでは、プロアマ交えて楽しくストイックにインディーゲーム開発をしています。是非ご参加ください!

おまけ

ありがたい

*1:最初はTestFlightを使っていたが、サービス終了に伴い移行した

アーケード愛溢れるドキュメンタリー映画『100 Yen The Japanese Arcade Experience』を見ました

海外のアーケードゲーム狂が、3年かけて日本のゲームセンターを取材して撮影したドキュメンタリー映画、『100 Yen』を見ました。

100 Yen: The Japanese Arcade Experience | Insert coin. Blow your mind.

どんな映画?

上手くまとまらなかったので以下の記事を参照のこと

日米のゲーセン文化を外国人が描くドキュメンタリー映画『100YEN』がDVDでついにリリース : Kotaku JAPAN

見てみた

アーケードゲームの歴史とゲームセンター今昔

アーケードの歴史の章では「スペースインベーダー」、「ストリートファイターⅡ」、「Dance Dance Revolution」の3作品はゲームセンターのビジネス構造すらを変えたパラダイムシフトを引き起こした作品と述べられていたのが印象的でした。

これら3つの時代を対称的に描いていて、時代の遷移によるゲームセンターの移り変わりの描写が上手かった。

平成生まれの僕は、どの作品もリアルタイムの世代ではないのだけど、当時の熱狂というのはどれも凄まじかったんだなあと片鱗を味わえました。 00年代以降、ゲームセンターの規模は縮小し続けていて、まだ第4のパラダイムシフトは訪れていないみたい。最近は基本無料のアーケードゲームが出てきたりと、アーケード業界も変化し続けているけれど、紹介されていた時代のような、社会現象になる域まで来る変化というのはもう訪れなさそう。

ゲームセンターの社会的役割

ストリートファイターⅡ』以降のゲームセンターは、ゲームを通したコミュニティを形成し、サロンのような役割を果たしている、という考察がされていて、ゲームというのは、社会と関わりを持つための潤滑油という側面が強いなあと感じました。

ゲーム自体が楽しい以上に、ゲームを通じて誰かと交流したり、あれこれ話しあったり、そういった環境全体こそがゲームのもたらす重要な体験だというのは今も昔も変わらず。 昨今のソーシャルゲームブームも、一見アーケードとは対極の位置にいるように見えるけど、こういった系譜を受け継いでいるんだなあと考えると、なにかインスピレーションが沸く感じがしますね。

北米と日本のゲームセンター

劇中では始終、「北米ではゲームというのは子供の遊びで一般層に受け居られていない」「日本ではゲームセンターを軸に国民皆が楽しんでいて、文化の一つになっている」と言われていました。

日本人からすると、評価されて嬉しい一方で、果たして日本では一般にゲームが受け入れられているのだろうかと違和感を覚えざるを得なかった。

日本のゲームセンターは確かにライト層にも入りやすいような企業努力がなされているのだけど、それ以上にゲームなんて眼中にない層が多数存在しているので、まだ文化と言えるレベルには達していないのでは、という感想を持った。やはりゲームセンターはまだまだ敷居が高い感じが否めない。

総評

僕はゲームはタダの暇つぶしではないと考えてゲームを作り続けているけど、劇中でも作り手としても、遊び手としても、ゲームに人生を捧げている人がたくさん登場して、自分はまだまだだなあ、という気になりました。

最近、『幸せな未来は「ゲーム」が創る』という本を読んでいて、その中でも述べられているのだけど、ゲームはタダの余暇ではなく、人類そのものを幸福にする可能性を秘めてるという主張はステキな感じがしますね。

見たい!という方は

以下の公式ショップでカナダから輸入できます。DVDと送料で39.98カナダドル。約4000円。

100 Yen Film

リージョンフリーの日本語字幕付きなので、問題なく楽しめます。

わざわざ輸入するのは敷居が高い感じあるのでダウンロード販売あるといいですね、って書こうと思ったら、iTunesでも販売されているみたい。

iTunes - Movies - 100 Yen: The Japanese Arcade Experience

これ、米国版のiTunesでしか販売してないんですけど、字幕とかちゃんと付いてるんですかね。不安な方はDVDを輸入することをオススメします。

僕の考えた最強のゲームフレームワーク『MonoGame』を試す

前々からMonoGameというゲームフレームワークが気になっていたのでMacで動かすところまでやってみました。ググっても全然情報が出てこなかったので、日本語で読める記事としてはかなり詳しいのではないでしょうか。

mono/MonoGame

MonoGame - Write Once, Play Everywhere - Home

Monoとは

Monoは、Windowsが提供している.NETの資産をクロスプラットフォームで動かそうというオープンソースプロジェクトです。

C#はものすごく良い言語だと聞いているのですが、主にWindows環境でしか動作しなかったので、Macユーザーには嬉しいですね。

一昔前は微妙な感じだったんですが、最近ではUnityがMonoを採用しているなど、今後流行り出しそうな雰囲気があります。

MonoGameとは

MonoGameはMono上で実装されているゲームフレームワークです。マイクロソフトが開発したゲームエンジンXNAを高い移植度で再現しています。

MonoGameの特徴として以下の点が挙げられ、これらを聞くだけだと「ぼくのかんがえたさいきょうのゲームフレームワーク」に聞こえます。

高い移植性

非常に高い移植性を誇っており、様々なプラットフォームで動きます。

公式のREADMEによると

で動きます。他にもXbox360でも問題なく動作するほか、WiiUへの対応が任天堂から発表されています。

Nintendo bringing MonoGame Framework to Wii U | Polygon

XNAとの互換性

MonoはXNA4.0との互換性を維持していて、XNA向けに書いたコードがそのまま走ります。後述しますが、過去にXNAで開発したゲームがほぼそのままクロスプラットフォーム化できました。XNA自体がかなり優れたプラットフォームなので、記述性の面でも非常に優秀です。

多くの採用実績

日本だと全く情報を聞かないのですが、海外だと徐々に名作が生まれています。

例えば、数々の賞を受賞したXBLAの『Fez』や、『Bastion』なんかはMonoGame製だそうです。

Fez』は日本語版が出たあとにクリアしたんですが、なかなかおもしろい作品でした。

最近PS3で発売した『テラリア』もMonoGame上に移植なんかがされていたりします。

環境構築

はじめに

この手順は2013/10/29時点の情報です。
現状、大変残念な事になっていますが、将来的にもっと手軽に変更される可能性があります。

一応、Githubに公式のインストールガイドがあるのですが、はっきりってほぼ役に立ちません。

Tutorials · mono/MonoGame Wiki

今回は下記の記事がなかなか良い線行っていたので、この記事に沿って説明します。

Setting up a MonoGame Mac Application with Xamarin Studio | Jamie Ly

また、環境はこんな感じです。

Xamarin Studioのインストール

Xamarin StudioはMono環境向けのIDE。以前はMono Developという名称だったが、Version4.xからXamarin Studioになったみたい

ちなみに「ザマリン」とかって読みます。

Download - MonoDevelop

Mono SDK for Macのインストール

Download - Mono

こちらから。Mono MRE, Mono MDKいずれでも大丈夫だと思う。今回はMono MRE installerを選択

MonoMacのインストール

Xamarinにはパッケージマネージャーが組み込まれているので、そこからMonoMacを導入します。

Xamarin Studioを起動して、メニューバーからXamarin Studio > Add-in Manager > Galleryを選択。

Mac Developmentカテゴリ以下にあるMonoMacをインストール。完了したらXamarin Studioを再起動する

(もしかしたら環境によってはやらなくてもいいのかも?)

MonoGameのテンプレートをインストール

MonoGame - Write Once, Play Everywhere - Download: MonoGame 3.0.1

こちらからMonoGame for Xamarin Studioをダウンロードする。XamarinStudio.MonoGame_3.0.1.mpackみたいなファイルが入手できればOK

上記同様にAdd-in Managerを開き、左下のInstall From Fileから今入手したファイルを使ってMonoGame向けのテンプレートをインストールする。インストール後、再びXamarin Studioを再起動

MonoGameプロジェクトを作成する

File > New > Solution > MonoGameからMonoGame Mac Applicationを選択。適当に名前を付けると良い。

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

参照を変更1

この工程は説明のために書いていますが、結論から書くと正常に動作しません。
とりあえず動かしたい人は「参照を変更2」を参照してください

これでビルドは通るが、おそらく正常に起動しない。

参照したページによると、MonoGame.Frameworkをテンプレートに含まれている物から変更してあげる必要がある。

左側のナビゲーションペインから、Referencesを選択し、右クリック。Edit Refereces…を選択する。

その後、.NET Assenblyタブを開き、

~/Library/Application Support/XamarinStudio-4.0/LocalInstall/Addins/MonoDevelop.MonoGame.3.0.1/assemblies/MacOS/下にあるMonoGame.Framework.dllを選択してあげる。

また、右側に表示されている、元々追加してあるMonoGame.Framework.dllは削除する。

下記スクリーンショットのようになればOK

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

テクスチャが読めなくて死ぬ

ビルドする。今度は正常に一瞬だけWindowがでるが、下記のようなエラーで死ぬ

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

Method not found: 'MonoMac.AppKit.NSImage.AsCGImage'.

このようになぜかテクスチャが読み込めない。

結論から言うと、修正されたPull RequestがまだStableに取り込まれていないらしく、この方法では動かない。CIサーバーからunstable版を取得するか、自分でMonoMacとMonoGameFrameworkをビルドし直してあげると解決する。

Xamarin MonoMac DLL and MonoGame issue - xamarin

これに気付くのに数時間ハマった。最悪だった。

今回は簡単のため前者の方法を採る。

参照を変更する2

develop-mac [Jenkins]

MonoGameのCIサーバーから最新版のビルドを取得する。develop-macジョブのLast Successful ArtifactsからMonoGame.Framework.dllMonoMac.dllをダウンロード

「参照を変更する1」の方法と同様に、今取得してきたdllを参照してあげる。古い参照は消してください。

正直あんまり良い解決策ではないので、今後修正されると思います。

Hello MonoGame!

動いた!!!!

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

MonoMacを自分でビルドしたい(Optional)

CIサーバーから持ってくれば良いんですが、自分で心を込めてビルドしたいという方は下記の通りしてください

git clone https://github.com/mono/monomac
cd monomac
git submodule update
make

これでsrc以下にMonoMac.dllがビルドされます。よかったですね。

ゲームを作ろう!

これでやっとゲームが実装できるようになったのでひたすらがんばるだけです。

サンプルが下記に用意されているので、見ながらがんばってください。

基本的にXNAそのままみたいなので、XNAが使える方は取っつきやすいのではないでしょうか?(僕はほぼ使ったことがないのでこれから覚えます)

MonoGameでいろいろ

XNA製のゲームをクロスプラットフォーム化する

僕の運営している札幌ゲーム製作者コミュニティKawaz製のゲームにはXNAの資産で作られた物が多数ありますが、僕はWindowsでは開発しないので遊べないことが多かったです。

どれほどの互換性があるものなのか、試しに移植してみました。

Kawaz - ぼくはキミの盾 (ぷちげープロジェクト)

上記の動画のように、割と高い移植性を誇っていることがわかりました。

諸事情で動画は削除させて頂きます。ごめんなさい

コードについても、ほぼ直す必要がなくてここまで30分ぐらい。 一部未実装のAPIがあるのと、パスの指定方法がWindowsと若干異なるなどの変更作業が必要ですが、ここまで再現度が高いのは驚きでした。

iOS, Androidで動かす

iOS/Android向けにビルドするにはXamarinが提供しているMonoTouchのライセンスを購入する必要があるようです。

Xamarin - Xamarin.iOS - Create amazing iOS apps with C# and .NET

$299買い切り。1年ごとの更新だったみたいです。ご指摘ありがとうございます。

一応試すだけならFree版があるんですが、32KBまでしかバイナリが出力できないという制限があって、ほぼ実用できない気がします。今度試します。

PS Vitaで動かす

やってみたいので今度試します。余談ですが、Vita向けの開発環境を最近構築したので、これ関係の記事も書きたいですね。

まとめ

日本人で使ってる人をほぼ見かけなかったので書いてみました。

動くまでは環境構築の項にあるとおりめちゃくちゃ面倒でした。これは流行らない。

特にMonoMacの敷居が高すぎて、辛い感じがしました。 どうやらCocoaをMonoでBindingしてC#で記述し、Objective-Cにコンバートしているという黒魔術らしい。 Macでビルドしてdllが生成される世界観がヤバかったです。

上記の点から、途中までは大したことないと思ったのですが、実際に動いてみると高い移植性と、記述の容易さに驚かされました。 想像以上に良さそうなので今後に期待ですね。

海外のインディーズゲーム界隈では最初に紹介したように、数々の名作がMonoGameで実装されているので、今後爆発的に普及するかも・・・・・・。