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-html5(JavaScript)

•
•

cocos2d-iphone(Objective-C これが元)

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)
活発なコミュニティ
•

日本のユーザー会cocos2d-x.jp

•

東京の方では頻繁に勉強会が開かれているらしい
活発なコミュニティ
•

本家のフォーラムも盛況

•

アップデートも早い
豊富な参考書籍
•

日本語の書籍もぼちぼち出始めた(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:)];

cocos2d(Objective-C)

!

CCMenuItemImage* button = CCMenuItemImage::create("button.png",
"button_selected.png",
this,
menu_selector(MainScene::onButtonPressed)
);

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便利
!
!
!
!

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はさすがに使いませんでした
ここがひどい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));

cocos2d-x 2.x
auto point = Point(100, 20);
auto vector = Point(30, 40);
auto point2 = point + point2 * 5;

cocos2d-x 3.0
C++11に対応
•

C++11に対応

•

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

std::function, std::thread, enum, override keyword,
smart pointer etc…
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
lambda
auto button = MenuItemImage::create("button.png",
"button_selected.png",
[&](Object *sender) {
// ボタンを押したときの処理
}
);

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

cocos2d(Objective-C)
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
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
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
クロス対応が楽に
•

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

•

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)
ご清聴
ありがとうございました

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