cocos2d-x 3.0 + c++11で始めるゲーム開発超入門
DESCRIPTION
cocos2d-xの簡単な紹介と、cocos2d-x 3.0のalpha版でどのように変わったかを紹介します。TRANSCRIPT
cocos2d-x 3.0で始める ゲーム開発超入門Sapporo C++ #5 @giginet
自己紹介• Twitter/Github @giginet
• 北海道大学情報科学研究科 M1
• はてなインターン・クックパッドインターン
• 札幌ゲーム製作者コミュニティKawaz
• Objective-C/Python/JavaScript etc…
• ゲームプログラミングとかしてます
Kawaz• 札幌ゲーム製作者コミュニティKawazをやってます
• プログラマ、音屋、グラフィッカー、シナリオライター、プロアマ含め100名ぐらいでゲーム作ってます
• http://www.kawaz.org/
今日話すこと• C++で記述できるiPhone/Android向けゲームフレームワーク
「cocos2d-x」の紹介
• cocos2d-x ここがすごい
• cocos2d-x ここがひどい
• cocos2d-x 3.0 + C++11とこれからのcocos2d-x
http://www.cocos2d-x.org/
今日話すこと• タイトルが「cocos2d-x 3.0で始める ゲーム超入門」だけど
入門向けの内容は少なめです
• 全てを語るには時間が足りない
今日話すこと• C++でiPhone/Androidゲームを作ろう!
• cocos2d-xの紹介を軽めに
• 実装とC++の言語機能寄りの話を厚めにしました
• cocos2d-xの資料自体は無数にあるので、簡単に紹介した後、最新版の3.0はここが凄いという話をしていきます
• Objective-Cの話もあるよ!
• cocos2d-xの布教とKawaz、GGJの勧誘
cocos2d-xとは• cocos2d-x スマートフォン開発向けのゲームフレームワーク
• iPhone/Androidを初めとする多くのプラットフォーム対応
• オープンソース、無料
• OpenGL ES2.0互換の高速な動作
• 豊富な機能と拡張、サードパーティーツール
http://www.cocos2d-x.org/
cocos2d-xとは• cocos2d-x スマートフォン開発向けのゲームフレームワーク
• 元々cocos2d-iphoneというObjective-C製のゲームフレームワークがあった
• とても良かったが、iPhoneでしか動かない、Objective-Cでしか書けないと宗教上の理由で不満
cocos2d-xとは• cocos2d-iphoneをクロスプラットフォームでC++にかけるよ
うにしよう!
• →cocos2dのC++ Porting、cocos2d-xの誕生
VOXCHRONICLE• 音と行動が同期する奥スクロールRPG
• 12人の音屋、700以上のアセットによる音楽の自動生成
• 東京ゲームショウ2013 Sense of Wonder Night 審査通過
VOXCHRONICLE
http://www.youtube.com/watch?v=xdRyo4RzWsU
発表者の活動• @giginetのcocos2d関係の活動
• 過去の発表(資料古い)
• cocos2d入門 http://www.slideshare.net/giginet/cocos2d-8420196
• cocos2で始める iPhoneゲーム開発入門 http://www.slideshare.net/giginet/cocos2-iphone
• Kobold2Dで始めるゲーム開発 http://www.slideshare.net/giginet/devsap
発表者の活動• @giginetのcocos2d関係の活動
• ブログ記事
• JenkinsでLuaのSyntaxチェックを自動化してみた http://giginet.hateblo.jp/entry/2013/05/03/175830
• iPhoneゲーム開発に役立つツール13選まとめ http://giginet.hateblo.jp/entry/2013/02/23/130310
• OUYA+cocos2d-xで始めるゲーム開発入門 http://giginet.hateblo.jp/entry/2013/07/06/231629
発表者の活動• @giginetのcocos2d関係の活動
• 本家にPull Request
• cocos2d-xのバグを直したらmergeされた話 http://giginet.hateblo.jp/entry/2013/03/04/194604
cocos2d-xのここがすごい
クロスプラットフォーム• 高い移植性
• 1ソースでどこでも動く
• iPhone/Android/Windows/Mac/Linux/Windows Phone/Windows Metro/ Blackberry/ Tizen etc…
豊富な機能• やたらと機能が豊富で、サンプルコードも多い
• ざっとREADME参照のこと
豊富な機能
豊富な機能
豊富な採用実績• ソーシャルゲームの開発事例がちらほら挙がりだした
• 日本だと『ブレイブフロンティア』が有名
優れたツール• 互換のあるGUIツールが非常に充実している
• マップエディタ、インターフェイスビルダー、IDE、スプライト作成ツールetc…
Cocos Builder
Level Helper
zwoptex
Tiled Map Editor
様々なPorting• cocos2d-xと同じAPIを持つライブラリが豊富
• cocos2d-iphone(Objective-C これが元)
• cocos2d-html5(JavaScript)
• cocos2d-XNA(C# MonoGame/XNA)
• cocos2dの思想を受け継ぐフレームワークも多い
• PS Mobile GameEngine2D (C# SCE)
• SpriteKit (Objective-C Apple)
秀逸なScript-Binding• Lua/JavaScriptエンジン搭載
• その気になればC++のコードを一切書かなくても良い
• JavaScriptはcocos2d-html5と完全な互換性
• レベルデザインとロジックの分離が容易
• 簡単コード生成
VOXCHRONICLEのレベルデザイン(Lua)
活発なコミュニティ• 本家のフォーラムも盛況
• アップデートも早い
豊富な参考書籍• 日本語の書籍もぼちぼち出始めた(2~3冊)
• 今後増えそう
まとめ• cocos2d-xすごい
• スマートフォンのゲームを作るにはUnityと並んでデファクトになりつつある
cocos2d-xのここがひどい
ここがひどい• 前述の通り、非常に秀逸なゲームフレームワーク
• 大作を1本作ってみると、イケてないところが山のようにある
ここがひどい1• Objective-C由来の独特な命名規則
• cocos2d-xは前述の通りcocos2dのPortingなので、命名規則がObjective-C由来で慣れていないと気持ち悪い
Vender Prefixのついたクラス名
getを付けないgetter
kから始まる定数
ここがひどい2• メモリ管理が辛い
• Objective-Cでは、全てのオブジェクトが持つ参照カウンタでメモリ管理をしなくてはならない
• 最近のObjective-CはARC(Automatic Reference Counting)という仕組みで操作が不要になっているが、cocos2d-xでは自分での操作が必要である
// メンバにオブジェクトを格納 _memberNode = new CCNode(); // 参照カウンタ1 !_memberNode->release(); // 参照カウンタ0 _memberNode = NULL; !// メンバにオブジェクトを格納(autorelease) _memberNode = CCNode::create(); // 参照カウンタ1(autorelease) _memberNode->retain(); // 参照カウンタ2 !// 略 _memberNode->release(); // 参照カウンタ0 _memberNode = NULL;
地獄っぽい
// localスコープでオブジェクトを格納 CCNode *node = new CCNode(); // 参照カウンタ1 node->autorelease(); // autorelease !// コンテナにオブジェクトを格納 CCNode *node = CCNode::create(); // 参照カウンタ1(autorelease) CCArray *array = CCArray::create(); array->addObject(node); // 参照カウンタ2
地獄っぽい
ここがひどい3• 関数ポインタの扱いが最悪
• Objective-Cのセレクター構文を持ってきているため、関数ポインタを謎のマクロでwrapしなくてはいけない
! CCMenuItem *item = [CCMenuItemImage itemFromNormalImage:@"button.png" selectedImage:@"button_selected.png" target:self selector:@selector(onButtonPressed:)];
!CCMenuItemImage* button = CCMenuItemImage::create("button.png", "button_selected.png", this, menu_selector(MainScene::onButtonPressed) );
cocos2d(Objective-C)
cocos2d-x(C++)
ここがひどい4• 演算子オーバーロードがない
• Objective-Cには演算子オーバーロードがないため、簡単な操作が関数化されている
CCPoint point = ccp(100, 20); // 原点を定義 CCPoint vector = ccp(30, 40); // ベクトルを定義 CCPoint point2 = ccpAdd(point, ccpMult(vector, 5)); // ベクトルの四則演算
ここがひどい5• Objective-Cの便利機能がことごとく使えない
• プロパティ、Blocks(Closure)、GCD、カテゴリといった、パワフルな言語機能が全て使えない
• かといって、C++の言語機能が使えるわけでもない
ここがひどい5• propertyがなくて地獄っぽい
• 例えばごく普通のsetter
• Objective-Cではこう書けばいいところが
@property (nonatomic, strong) NSObject *object;!
cocos2d(Objective-C)
ここがひどい5• propertyがなくて地獄っぽい
• cocos2d-xだとこう
using namespace cocos2d;!private CCObject *Class::_object;!!void Class::setObject(CCObject *object) {! if (_object) {! _object->release();! }! _object = object;! if (object) {! object->retain();! }!}!
cocos2d-x(C++)
ここがひどい5• Blocks(closure)もない
• C++(03)にはclosureに相当する機能がないため、Blocksを使ったインターフェイスは全て削除されている
id button = [CCMenuItemImage itemFromNormalImage:@"button.png" selectedImage:@"button_selected.png" block:^(id sender) { // ボタンを押したときの処理 }];
cocos2d(Objective-C)
VOXCHRONICLEでは• boostを利用することで負担を軽減させていた
• boost::shared_ptr便利
!
!
!
!
!
• boost::lambdaはさすがに使いませんでした
using namespace cocos2d;!private boost::shared_ptr<CCObject> Class::_object;!!void Class::setObject(CCObject *object) {! _object = boost::shared_ptr<CCObject>(object);!}!
cocos2d-x + boost(C++)
ここがひどい6• クロスプラットフォーム対応が辛い
• 各種サンプルプロジェクトは付属しているが、手作業でのソースの移動やプロジェクトの設定が必須
• 特にAndroidで動かすのが大変
まとめ• cocos2d-x 2.xはObjective-Cの良い機能と、C++の良い機能
を両方取っ払った劣悪な開発環境だった
• Objective-C、Cocoaの知識がないと取っつきづらい
• Objective-C/C++どちらに慣れている技術者にとっても冗長で書きづらい
• クロスプラットフォーム対応を謳っているが、実際にクロス化するのは手作業が多く大変
これからのcocos2d-x
cocos2d-x 3.0• 今年9月、cocos2d 3.0のα版がリリース
• コンセプトの刷新!
• Remove all the Objective-C patterns. • Objective-C版cocos2dとの互換性を取ることをやめる方向
にシフトした
• よりC++っぽい書き方ができるように!!!!
Vender Prefixがなくなった!
クラス名が平和になった
propertyの命名が変わった
定数の命名も変わった
CCPoint point = ccp(100, 20); CCPoint vector = ccp(30, 40); CCPoint point2 = ccpAdd(point, ccpMult(vector, 5));
auto point = Point(100, 20); auto vector = Point(30, 40); auto point2 = point + point2 * 5;
演算子オーバーロードがつかえるようになった
cocos2d-x 2.x
cocos2d-x 3.0
C++11に対応• C++11に対応
• 内部実装が刷新されてるほか、インターフェイスの多くがC++11対応に!
• std::function, std::thread, enum, override keyword, smart pointer etc…
cocos2d-x 2.x
!void MainScene::addButton() { CCMenuItemImage* button = CCMenuItemImage::create("button.png", "button_selected.png", this, menu_selector(MainScene::onButtonPressed) ); } !void MainScene::onButtonPressed(cocos2d::CCObject *sender) { // ボタンを押したときの処理 }
lambda
cocos2d-x 3.0
auto button = MenuItemImage::create("button.png", "button_selected.png", [&](Object *sender) { // ボタンを押したときの処理 } );
lambda
cocos2d(Objective-C)
id button = [CCMenuItemImage itemFromNormalImage:@"button.png" selectedImage:@"button_selected.png" block:^(id sender) { // ボタンを押したときの処理 }];
lambda
cocos2d-x 2.0
using namespace cocos2d;!private CCObject *Class::_object;!!void Class::setObject(CCObject *object) {! if (_object) {! _object->release();! }! _object = object;! if (object) {! object->retain();! }!}!
smart pointer
using namespace cocos2d;!private std::shared_ptr<Object> Class::_object;!!void Class::setObject(Object *object) {! _object = std::shared_ptr<Object>(object);!}!
smart pointer
cocos2d-x 3.0
CCLabelTTF *label = CCLabelTTF::create("Hello", "Helvetica", 16, CCSizeMake(200, 40), kCCTextAlignmentLeft );
auto label = LabelTTF::create("Hello", ! "Helvetica", ! 16, ! Size(200, 40), ! TextHAlignment::LEFT!);
cocos2d-x 2.x
cocos2d-x 3.0
scoped enum
クロス対応が楽に• 今まで、クロスプラットフォームを謳っていた割に対応が非常
に大変だった
• cocos2d-x 3.0から便利スクリプトが付属して楽になりました
クロス対応が楽に• create-multi-platform-projects.pyというその名の通りのスク
リプトが付属
クロス対応が楽に• 複数のプラットフォーム向けのプロジェクトが瞬時に生成
その他の新機能• 統一的なEventDispatcher
• pthreadからstd::threadへの置き換え
• Rendererの刷新
• Labelの向上
• http://www.cocos2d-x.org/wiki/Release_Notes_for_Cocos2d-x_v300
互換性の問題• 現段階(2013/12/7)ではまだα版
• 現時点ではバグ報告も結構上がってきてて危ないかも・・・・・・?
• 2.xのAPIのほとんどがdeprecatedになってしまっているため、今から作り出すゲームはどちらを採用すべきか悩みどころ
まとめ• 今までのcocos2d-xはObjective-Cの文化を知らないと扱うの
は難しかった
• これからはC++の言語機能をフル活用してゲームが開発できる
• すごく良いからみんな使おう
• C++11の便利tips教えてください
cocos2d-x in 札幌• 東京では結構コミュニティが活発化している
• 札幌では使っている人がほぼいなくて情報共有がほぼできない
• 話せるネタが無限にあるので、興味がある人が多かったらcocos2d-x勉強会したい
Global Game Jam• 48時間でゲーム開発するイベント
• 世界63ヶ国で16000人以上のゲーム製作者が3141のゲームを制作
• 2014/1/24(土)~1/26(日)札幌でも開催!
• http://kawaz.doorkeeper.jp/events/7291
cocos2d-x in GGJ!• Global Game Jamにcocos2d-xチームを作ろう!
• 例年Kobold2D(Objective-C)で参加していたが、cocos2d-xチームを作りたい気運の高まり
• 打倒Unity
• 世界中で作られたゲーム3000本のうち、1000本以上がUnity製だった(GGJ2013)
ご清聴 ありがとうございました