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

76
cocos2d-x 3.0で始める ゲーム開発超入門 Sapporo C++ #5 @giginet

Upload: kohki-miki

Post on 20-Dec-2014

28.616 views

Category:

Entertainment & Humor


5 download

DESCRIPTION

cocos2d-xの簡単な紹介と、cocos2d-x 3.0のalpha版でどのように変わったかを紹介します。

TRANSCRIPT

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

cocos2d-x 3.0で始める ゲーム開発超入門Sapporo C++ #5 @giginet

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

自己紹介• Twitter/Github @giginet

• 北海道大学情報科学研究科 M1

• はてなインターン・クックパッドインターン

• 札幌ゲーム製作者コミュニティKawaz

• Objective-C/Python/JavaScript etc…

• ゲームプログラミングとかしてます

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

Kawaz• 札幌ゲーム製作者コミュニティKawazをやってます

• プログラマ、音屋、グラフィッカー、シナリオライター、プロアマ含め100名ぐらいでゲーム作ってます

• http://www.kawaz.org/

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

今日話すこと• C++で記述できるiPhone/Android向けゲームフレームワーク

「cocos2d-x」の紹介

• cocos2d-x ここがすごい

• cocos2d-x ここがひどい

• cocos2d-x 3.0 + C++11とこれからのcocos2d-x

http://www.cocos2d-x.org/

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

今日話すこと• タイトルが「cocos2d-x 3.0で始める ゲーム超入門」だけど

入門向けの内容は少なめです

• 全てを語るには時間が足りない

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

今日話すこと• C++でiPhone/Androidゲームを作ろう!

• cocos2d-xの紹介を軽めに

• 実装とC++の言語機能寄りの話を厚めにしました

• cocos2d-xの資料自体は無数にあるので、簡単に紹介した後、最新版の3.0はここが凄いという話をしていきます

• Objective-Cの話もあるよ!

• cocos2d-xの布教とKawaz、GGJの勧誘

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

cocos2d-xとは• cocos2d-x スマートフォン開発向けのゲームフレームワーク

• iPhone/Androidを初めとする多くのプラットフォーム対応

• オープンソース、無料

• OpenGL ES2.0互換の高速な動作

• 豊富な機能と拡張、サードパーティーツール

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

http://www.cocos2d-x.org/

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

cocos2d-xとは• cocos2d-x スマートフォン開発向けのゲームフレームワーク

• 元々cocos2d-iphoneというObjective-C製のゲームフレームワークがあった

• とても良かったが、iPhoneでしか動かない、Objective-Cでしか書けないと宗教上の理由で不満

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

cocos2d-xとは• cocos2d-iphoneをクロスプラットフォームでC++にかけるよ

うにしよう!

• →cocos2dのC++ Porting、cocos2d-xの誕生

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

VOXCHRONICLE• 音と行動が同期する奥スクロールRPG

• 12人の音屋、700以上のアセットによる音楽の自動生成

• 東京ゲームショウ2013 Sense of Wonder Night 審査通過

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

VOXCHRONICLE

http://www.youtube.com/watch?v=xdRyo4RzWsU

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

発表者の活動• @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

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

発表者の活動• @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

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

発表者の活動• @giginetのcocos2d関係の活動

• 本家にPull Request

• cocos2d-xのバグを直したらmergeされた話 http://giginet.hateblo.jp/entry/2013/03/04/194604

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

cocos2d-xのここがすごい

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

クロスプラットフォーム• 高い移植性

• 1ソースでどこでも動く

• iPhone/Android/Windows/Mac/Linux/Windows Phone/Windows Metro/ Blackberry/ Tizen etc…

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

豊富な機能• やたらと機能が豊富で、サンプルコードも多い

• ざっとREADME参照のこと

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

豊富な機能

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

豊富な機能

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

豊富な採用実績• ソーシャルゲームの開発事例がちらほら挙がりだした

• 日本だと『ブレイブフロンティア』が有名

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

優れたツール• 互換のあるGUIツールが非常に充実している

• マップエディタ、インターフェイスビルダー、IDE、スプライト作成ツールetc…

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

Cocos Builder

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

Level Helper

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

zwoptex

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

Tiled Map Editor

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

様々な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)

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

秀逸なScript-Binding• Lua/JavaScriptエンジン搭載

• その気になればC++のコードを一切書かなくても良い

• JavaScriptはcocos2d-html5と完全な互換性

• レベルデザインとロジックの分離が容易

• 簡単コード生成

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

VOXCHRONICLEのレベルデザイン(Lua)

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

活発なコミュニティ• 日本のユーザー会cocos2d-x.jp

• 東京の方では頻繁に勉強会が開かれているらしい

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

活発なコミュニティ• 本家のフォーラムも盛況

• アップデートも早い

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

豊富な参考書籍• 日本語の書籍もぼちぼち出始めた(2~3冊)

• 今後増えそう

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

まとめ• cocos2d-xすごい

• スマートフォンのゲームを作るにはUnityと並んでデファクトになりつつある

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

cocos2d-xのここがひどい

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

ここがひどい• 前述の通り、非常に秀逸なゲームフレームワーク

• 大作を1本作ってみると、イケてないところが山のようにある

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

ここがひどい1• Objective-C由来の独特な命名規則

• cocos2d-xは前述の通りcocos2dのPortingなので、命名規則がObjective-C由来で慣れていないと気持ち悪い

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

Vender Prefixのついたクラス名

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

getを付けないgetter

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

kから始まる定数

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

ここがひどい2• メモリ管理が辛い

• Objective-Cでは、全てのオブジェクトが持つ参照カウンタでメモリ管理をしなくてはならない

• 最近のObjective-CはARC(Automatic Reference Counting)という仕組みで操作が不要になっているが、cocos2d-xでは自分での操作が必要である

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

// メンバにオブジェクトを格納 _memberNode = new CCNode(); // 参照カウンタ1 !_memberNode->release(); // 参照カウンタ0 _memberNode = NULL; !// メンバにオブジェクトを格納(autorelease) _memberNode = CCNode::create(); // 参照カウンタ1(autorelease) _memberNode->retain(); // 参照カウンタ2 !// 略 _memberNode->release(); // 参照カウンタ0 _memberNode = NULL;

地獄っぽい

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

// localスコープでオブジェクトを格納 CCNode *node = new CCNode(); // 参照カウンタ1 node->autorelease(); // autorelease !// コンテナにオブジェクトを格納 CCNode *node = CCNode::create(); // 参照カウンタ1(autorelease) CCArray *array = CCArray::create(); array->addObject(node); // 参照カウンタ2

地獄っぽい

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

ここがひどい3• 関数ポインタの扱いが最悪

• Objective-Cのセレクター構文を持ってきているため、関数ポインタを謎のマクロでwrapしなくてはいけない

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

! 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++)

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

ここがひどい4• 演算子オーバーロードがない

• Objective-Cには演算子オーバーロードがないため、簡単な操作が関数化されている

CCPoint point = ccp(100, 20); // 原点を定義 CCPoint vector = ccp(30, 40); // ベクトルを定義 CCPoint point2 = ccpAdd(point, ccpMult(vector, 5)); // ベクトルの四則演算

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

ここがひどい5• Objective-Cの便利機能がことごとく使えない

• プロパティ、Blocks(Closure)、GCD、カテゴリといった、パワフルな言語機能が全て使えない

• かといって、C++の言語機能が使えるわけでもない

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

ここがひどい5• propertyがなくて地獄っぽい

• 例えばごく普通のsetter

• Objective-Cではこう書けばいいところが

@property (nonatomic, strong) NSObject *object;!

cocos2d(Objective-C)

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

ここがひどい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++)

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

ここがひどい5• Blocks(closure)もない

• C++(03)にはclosureに相当する機能がないため、Blocksを使ったインターフェイスは全て削除されている

id button = [CCMenuItemImage itemFromNormalImage:@"button.png" selectedImage:@"button_selected.png" block:^(id sender) { // ボタンを押したときの処理 }];

cocos2d(Objective-C)

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

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++)

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

ここがひどい6• クロスプラットフォーム対応が辛い

• 各種サンプルプロジェクトは付属しているが、手作業でのソースの移動やプロジェクトの設定が必須

• 特にAndroidで動かすのが大変

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

まとめ• cocos2d-x 2.xはObjective-Cの良い機能と、C++の良い機能

を両方取っ払った劣悪な開発環境だった

• Objective-C、Cocoaの知識がないと取っつきづらい

• Objective-C/C++どちらに慣れている技術者にとっても冗長で書きづらい

• クロスプラットフォーム対応を謳っているが、実際にクロス化するのは手作業が多く大変

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

これからのcocos2d-x

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

cocos2d-x 3.0• 今年9月、cocos2d 3.0のα版がリリース

• コンセプトの刷新!

• Remove all the Objective-C patterns. • Objective-C版cocos2dとの互換性を取ることをやめる方向

にシフトした

• よりC++っぽい書き方ができるように!!!!

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

Vender Prefixがなくなった!

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

クラス名が平和になった

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

propertyの命名が変わった

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

定数の命名も変わった

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

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

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

C++11に対応• C++11に対応

• 内部実装が刷新されてるほか、インターフェイスの多くがC++11対応に!

• std::function, std::thread, enum, override keyword, smart pointer etc…

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

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

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

cocos2d-x 3.0

auto button = MenuItemImage::create("button.png", "button_selected.png", [&](Object *sender) { // ボタンを押したときの処理 } );

lambda

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

cocos2d(Objective-C)

id button = [CCMenuItemImage itemFromNormalImage:@"button.png" selectedImage:@"button_selected.png" block:^(id sender) { // ボタンを押したときの処理 }];

lambda

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

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

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

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

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

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

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

クロス対応が楽に• 今まで、クロスプラットフォームを謳っていた割に対応が非常

に大変だった

• cocos2d-x 3.0から便利スクリプトが付属して楽になりました

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

クロス対応が楽に• create-multi-platform-projects.pyというその名の通りのスク

リプトが付属

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

クロス対応が楽に• 複数のプラットフォーム向けのプロジェクトが瞬時に生成

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

その他の新機能• 統一的なEventDispatcher

• pthreadからstd::threadへの置き換え

• Rendererの刷新

• Labelの向上

• http://www.cocos2d-x.org/wiki/Release_Notes_for_Cocos2d-x_v300

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

互換性の問題• 現段階(2013/12/7)ではまだα版

• 現時点ではバグ報告も結構上がってきてて危ないかも・・・・・・?

• 2.xのAPIのほとんどがdeprecatedになってしまっているため、今から作り出すゲームはどちらを採用すべきか悩みどころ

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

まとめ• 今までのcocos2d-xはObjective-Cの文化を知らないと扱うの

は難しかった

• これからはC++の言語機能をフル活用してゲームが開発できる

• すごく良いからみんな使おう

• C++11の便利tips教えてください

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

cocos2d-x in 札幌• 東京では結構コミュニティが活発化している

• 札幌では使っている人がほぼいなくて情報共有がほぼできない

• 話せるネタが無限にあるので、興味がある人が多かったらcocos2d-x勉強会したい

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

Global Game Jam• 48時間でゲーム開発するイベント

• 世界63ヶ国で16000人以上のゲーム製作者が3141のゲームを制作

• 2014/1/24(土)~1/26(日)札幌でも開催!

• http://kawaz.doorkeeper.jp/events/7291

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

cocos2d-x in GGJ!• Global Game Jamにcocos2d-xチームを作ろう!

• 例年Kobold2D(Objective-C)で参加していたが、cocos2d-xチームを作りたい気運の高まり

• 打倒Unity

• 世界中で作られたゲーム3000本のうち、1000本以上がUnity製だった(GGJ2013)

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

ご清聴 ありがとうございました