[プログラミング] Cocos2d-xとは:2Dゲームの無料クロスプラットフォーム統合ライブラリ
基本
- 統一されたAPIで、ウェブ(HTML5)、デスクトップ・モバイルのネイティブアプリ向けの開発を行える、クロスプラットフォームかつオープンソースの2Dゲーム開発用ライブラリ
- WebGL、OpenGL、OpenGL ESをそれぞれ利用している
- ウェブはJavaScriptオンリーだが、ネイティブアプリはC++/JavaScript/Luaでの開発が可能
- ウェブ(Cocos2d-html)以外はサウンドもクロスプラットフォームで、オープンソースのOgg Vorbisを使える
- 単なるOpenGL系のラッパーではなく、物理シミュレーション・GUI用クラス・背景マップ(Tiled Map Editor形式)など高級APIが充実している
- 非常に速いペースで開発がつづけられている
- 無償使えるIDE、GUIエディタまである
- AppleのObjective-C向けの「Cocos2d」、C#向けの「Cocos2d-XNA」など、いろいろなプログラミング言語・環境に対応している
- 中国で開発されている(らしい)
全体の構成
#バージョン3.x
- Cocos2d-x(広義)
- Cocos2d-x(狭義:C++版)
- Cocos2d-x Lua(組み込み)
- Cocos2d-JS(組み込み:JavaScript版)
- Cocos2d-html(ウェブ版:Cocos2d-JSと統一されたAPI)
APIの特徴
元が「Cocos2d」というObjective-C向けのライブラリだけに、iOSのAPIの影響を強く受けている。
基本的にFlashのActionScriptに似ているが、残念ながらそれよりは遥かにわかりづらく、使いづらい。
ただし、ゲームを開発する分には必要十分ともいえる。
ネイティブアプリ:狭義のCocos2d-x
各環境のネイティブコード(C++)用SDKを利用することで、C++単体でクロスプラットフォーム開発が可能になっている。
そのJavaScript版(バージョン2.x系では、JSB:JavaScript Bindingsと呼んでいた)とLua版は、C++向けの組み込みライブラリを使用しているだけ。JavaScript版は、MozzilaのSpiderMonkey。
C++版
狭義のCocos2d-x。
企業が採用しているのはほとんどがこちら。C++なので開発はしづらいが、内部の実装を隠蔽でき、セキュリティやチート行為への対策ができるためと思われる。
Lua版
中国を中心に、海外ではネイティブ版のCocos2d-JS(v2.x系のCocos2d-x JSB)よりもLua版のほうが人気が高い。おそらく、省メモリであるのと、組み込みでの運用実績がゲーム業界で特に豊富なためと思われる。
組み込み用のスクリプト言語なので、自作のC/C++部分と連携させる(バインドする)ことができる。
Cocos2d-JS(ネイティブ)
Cocos2d-JSのネイティブ組み込み版。
v3.xからウェブ版のCocos2d-htmlとAPIが統一され、より使いやすくなった。
Lua版と同じく、自作のC/C++部分と連携させる(バインドする)ことができる。
JavaScriptのエンジンはSpiderMonkeyでLuaエンジンより遥かに重ので、メモリをそれだけでけっこう消費するのを覚悟したほうがいい。
それが嫌なら、Lua版がおすすめ。
HTML版:Cocos2d-html
Cocos2d-JSのウェブ版(HTML版)。
WebGLを利用することでGPUによるハードウェア・レンダリングを可能にしたクロスブラウザのライブラリ。
ブラウザゲームやWebGLに対する印象が変わるくらい高速。
一部ブラウザ依存なので、サウンドはブラウザしだいになってしまう=クロスプラットフォームではない。その場合、別の汎用ライブラリである「CreateJS」にあるサウンド・ライブラリの「SoundJS」を併用する手もある。
機能性ではダントツ、しかし使いやすさではEaselJSなどにやや劣る。
バージョン
v3.x系
数々の不具合が修正され、処理速度もだいぶ向上している印象。
コマンドラインから実行できる各種ユーティリティも充実し、簡単に新規プロジェクトの作成などができるようになっている(要Python)。
ウェブでの話題は増えてきたが、実際の採用実績についてはあまり聞かない。よって、実力・将来性ともに未知数といっていい。
v2.x系
最も企業の採用実績が多く、最も情報の多いバージョン。
しかし、開発コミュニティに長くサポートをつづけるつもりはあまりないようなので、どこかのタイミングでv3.x系に切り換えるしかない。
充実したGUI
拡張機能(extention)になるが、GUIライブラリも付属している。
いずれも必要十分で、もちろんハードウェア・レンダリングに対応しているので高速。
なお、v3.x系では名前空間が、ccsからccuiに変更されている
下記の専用エディタ「Cocos Studio」を使えば、WYSIWYGで簡単に画面を作成できる。
その他ポイント
- 3Dには今のところ対応していないため、いわゆる「2.5D」的なことはできない(将来的にSprite3dで対応予定らしい)
- 3D向けのまったく別のライブラリとしてCocos3dがある
開発環境
Cocos Studio
各種アニメーションの設定やGUI要素の構築をWYSIWYGで行える無料の公式エディタ。
有償のものと比べると見劣りする部分もあるが、全体として必要十分。
以前は「CocoStudio」という名前でWindows向けにしか提供されていなかったが、今ではMacでも使えるようになった。
このエディタそのものは、オープンソースではない。
Cocos IDE
組み込みのLua・JavaScript開発のための公式IDE。
Eclipseベース。
Unityのツールのように、実行中にリアルタイムにソースコードの変更を反映させることができる。
全体の問題点
不透明な開発の方向性
仕様変更がけっこうあって、ソースコードの修正を余儀なくされる場合がある。メジャー・バージョンアップではある程度仕方がないが、そこをどう割り切るか。
全体的に、新規開発によってどんどん新機能が追加されている一方、さらにカオス化進んでいるように感じられなくもない。
今のやや行き当たりばったりにも感じられる開発スタイルだと、将来的にどこかの段階で行き詰まりそうな気配がある。
仕様や命名規約・コーディング規約の不統一
全体の設計に統一感がなく、とりあえず必要なものをどんどん突っ込んでいったという印象。
C++版ではマクロや定数が乱立し、JavaScript版でもクラスにまとめればいいのに、なぜかグローバル変数・関数的なものが多い。
v3.xである程度改善されたが、APIの古い要素をだいぶ削除したために、かえって以下の問題が発生。
後方互換性のなさ
残念ながら、開発陣に後方互換性を維持しようという意識は稀薄らしく、メジャー・バージョンアップ時にかなりの要素が非推奨(@deprecated)ではなく、削除されてしまった。
旧APIをラップする関数なども一部しかなく、基本的に後方互換性はないと思ったほうがいい。
高速開発の裏面、というより負の側面か。
ゲームパッド未対応
FlashのActionScript 3.0はゲームパッドに対応しているが、Cocos2d-xでは低級APIでも対応していない。
そのため、ゲームパッド部分はクロスプラットフォームで開発することはできず、自前でなんとかするしかない。
バーチャルパッドも用意されていないので、こちらもSpriteやLayerを使って自作する必要がある。
不完全なクロスプラットフォーム
せっかくクロスプラットフォームなのに、対応言語ごとにAPIに微妙な差異があって混乱させられる。
言語ごとの仕様に関する部分は仕方がないが、統一できるはずの部分さえ異なっていたりするので不可解。
難解な実装・動作
ところどころトリッキーな動作をするところがあり、そこに引っかかることがよくある。どうしても、くわしい使い方を理解するまで時間と労力がかかってしまう。
特にイベントドリブン(イベントハンドリング)の仕組みがわかりづらい。jQueryやActionScript 3.0のようにはいかない。
仕様だか不具合だかわからないようなところがけっこうあるため、それを検証しながらコーディングする覚悟が必要。
散見される不具合
不具合が多く、自分のソースコードよりもCocos2d-xのコードを追っている時間のほうが長い場合も。
Cocos IDEなど関連するツール群も、バージョンアップが早いかわりに不具合の含まれている部分が多々ある。仕様変更も多く、Cocos Studioで出力したファイルを肝心のCocos2d-xライブラリで読み込めないことも。
著作権など知的財産権のリスク
Githubを見ると、メインの開発者以外からのリクエスト(投稿)をどんどん採用しているように思われる。
大半のオープンソースでも似たような状況だが、開発方針やロードマップがはっきりと示されておらず、全体として開発者(貢献者)の数が多いだけに、どこまで知財権に配慮しているのかまったくの未知数。
おそらく、各ソースコードの所有権の確認や貢献者の身元チェックはまったくやっていない。
企業が一括してつくっているUnityに比べて遥かに高リスク(業務用では特に)。あまり知られていないが、かつてccUTF8の部分がLGPLだった(現在はLLVMライセンス)ため、もしそのバージョンを静的リンクしてビルドしていたら、ソースコードの開示要求を拒否できない。
情報の少なさ
まず、公式の情報が物足りない。リファレンスですら記述が少なく、中には実装されているメソッドなどでさえ未記載の場合すらある。
公式のマニュアルやWikiはあるものの、情報が古い場合が多く、参考程度にしかならない。
全体として実質的に、「ソースコードを自分で読め」という形になってしまっている(特にCocos2d-html:下記)。
ウェブ全体でも、全般的に情報が不足しがち。特に日本語資料が少なく、北米など英語圏ではあまり人気がないためか、英語での情報すら少なく、場合によっては中国語のサイトを翻訳サイトで訳しながら情報をかき集めるしかない。
出版されている書籍も少なく、v3.x系に対応しているものはほとんどない。
他のことについても、上記の傾向はv3.x系で特に強い。
結果的に、使う以前に情報収集に時間がかかってしまうのが問題。
Cocos2d-JSの問題点
Cocos2d-htmlと同じく、情報が少なく、C++版に比べるとバージョンが遅れがち。
Cocos2d-htmlの問題点
JsDocのタグがつけられておらず、未だドキュメント化されていない部分が多いため、公式リファレンスにすら記載のない関数などが多々ある。
特にGUI関連の「ccui」クラス。
自分でソースコードを呼んでいくか、C++版のリファレンスを参照しながらやっていくしかない。
また、事業者の採用実績が乏しく、情報も不足しがち。
バージョンもC++版に比べてだいぶ遅れがちなので、Cocos Studioでつくったデザインの.csbファイルやJSONファイルなどがうまく読み込めない場合も。
全体として、やや先行きが不透明か。
個人的な所感
開発コミュニティはそれなりに大きいようだが、全般的に個人の手作り感が否めない。その割には、「2Dゲームとしてやりたいことはほぼできる」という機能の豊富さが特長のライブラリといえる。
無料・多機能性の部分に重点を置くか、安定性を求めるかでまったく評価が変わってくるだろう。
ウェブでの評価も、多機能かつ無料のオープンソースであることを評価する声がある一方、不具合が出やすいことを問題視する意見も多い。
いろいろなことができるが問題点も多く、正直、コーディングしていて楽しいだとか楽だとか感じることはめったにない。
全体を通していえることは、開発環境も含めて必要十分な機能はすばらしいのだが、一方で一定以上のデメリットとリスクも存在する。そこをどう判断するかで、このライブラリの評価はまったく変わってくるだろう。
将来的なことを考えて業務用では、個人的にUnityの2D機能をおすすめしたい。Unity Web Playerのおかげで、クロスブラウザのブラウザゲームにも対応できるし、企業が運営母体になっている安心感がある。
ウェブ版は、EaselJSも今ではWebGLによる高速レンダリングに対応しているので、使いやすさを求めるならこちらのほうがいいだろう。
スクリプト言語で手軽にスマホゲームを開発したい場合は、有償でもいいならCoronaだろうか。
ともかく、メリットとデメリットを天秤に掛けて、各自で判断するしかない。「無償だから」という理由で安易にCocos2d-xを採用すると、痛い目を見る場合もあるので注意したほうがいい。