Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

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

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Prochain SlideShare
CocosBuilderとcocos2d-x JSB
CocosBuilderとcocos2d-x JSB
Chargement dans…3
×

Consultez-les par la suite

1 sur 76 Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à cocos2d-x 3.0 + C++11で始めるゲーム開発超入門 (20)

Publicité

Plus par Kohki Miki (20)

Plus récents (20)

Publicité

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

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

×