Cocos2d-xでiPhone&Androidアプリ開発記1

logo

そろそろ次のアプリ開発と日々考えていたんですが、私は個人開発なので今後は小粒なゲームアプリがメインになりそうで、それにやっぱりAndroidにも対応していきたい。なのでUnity、cocos2d-x、enchant.jsなどのゲーム開発エンジンを日々リサーチしてました。

アプリをリリースしてみると思いもよらなかったトラブル報告があるので、結局はネイティブにしとけば・・・って後悔しそうで最後まで悩みましたが、最終的にcocos2dxに決めました。細かい部分は使ってみないと分からないので、とりあえず一本ハイブリッド開発してみることにします。

スポンサーリンク

 

まずはcocos2dxについて

スタート地点としては、これからどーやって開発するの?Xcode使うの?って感じで完全な初心者です。

結論として、最初にプロジェクトを専用ツールで作成して、その後はXcodeやEclipseを使って開発していく感じでした。言語としてはObjective-CではなくC++かluaかJavaScriptでの開発になります。私は標準っぽいのでC++を使います。

とりあえずiPhoneアプリを開発して最後にAndroid対応する予定です。下の@ITさんの記事でcocos2dxがどのようにハイブリッドを実現するか分かりやすく説明してあります。最初に見ておきたい。

C++でクロスプラットフォームを実現するCocos2dx入門(前編):Cocos2dxでiOS/Androidの2Dゲーム開発を始めるには (1/3) - @IT

この記事の後半では、iOS/Androidそれぞれの独自機能を使う時にどうするか。まだ先の話ですが仕組みとして頭に入れておきます。

C++でクロスプラットフォームを実現するCocos2dx入門(後編):iOS/Androidとの相互API呼び出しを行う際のコツ (1/3) - @IT

 

いまから始めるなら2.x系か3.x系か

cocos2dxはバージョンアップが盛んのようで、最新は3.x系(beta)です。WEBにはまだ3.x系の情報は少ないですが、今後のことを考えて最新で進みたいと思います。

今回、教材にした2.x系のソースも早速修正が必要になりました。まだcocos2dxの右も左も分からないのに3.x系対応が必要になりますが、相応に勉強になりました。

3.x系対応でとても参考になったスライド

2.x系と3.x系はクラス名など結構違う。

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

  • Vender Prefixがなくなった!
  • クラス名が平和になった
  • propertyの命名が変わった
  • 定数の命名も変わった
  • 演算子オーバーロードがつかえるようになった

 

とりあえず最初の教材

cocos2d-xの書籍も執筆されている 清水友晶さんのスライドを参考に進めました。

cocos2d-xハンズオン勉強会 in 名古屋

cocos2dxインストール後にxcodeでプロジェクトを開いてコンパイル。最初は時間かかる。コンパイルするとdeprecation(非推奨の意味)が20個くらい出るけどとりあえずそのまま。実行するとシミュレータにロゴが表示される!。ファーストステップはそのロゴを移動させるんだけだが、それがたった2行で出来るようだ。

CCMoveTo* move = CCMoveTo::create(2.0f, ccp(size.width, size.height/2) );
pSprite->runAction(move);

でも、さっそくエラー。クラス名が非推薦なのとccpが未定義。

MoveTo* move = MoveTo::create(2.0f, Point(visibleSize.width, visibleSize.height/2) );
sprite->runAction(move);

動いた。この手軽さは凄い。ちなみに演算子オーバーロードもいける。

auto* move = MoveTo::create(2.0f, Point(visibleSize.width, visibleSize.height/2) );

 

カードゲームを作ってみる

次に教材でサンプルゲームを作ります。ソースはそのままコピペせず、少しづつ3.x系のソースにコピペしていく感じで。

iOSシミュレータのスクリーンショット_2014

ゲームを作ってみよう!— まずはカードの配置

card game 25 source code 1

名前空間でC++のスタンダードを定義しとく。これないとXcodeがC++認識できない。すごく短いソースなのにカードがランダムに並ぶ様はワクワクする。

using namespace std;

 

ゲームを作ってみよう!— カードのタップ

card game 25 source code 2

タッチイベントの登録方法が変わったようだ。

this->setTouchEnabled(true); // 2.x
this->setTouchMode(kCCTouchesOneByOne); // 2.x

きょこみのーとさんを参考に修正。”cocos2dx/sample”内のソースを漁ると美味しいことも知る。

Cocos2d-x3.0alpha0のCocosBuilder使用ソースを3.0alpha1に対応する - きょこみのーと

タッチ座標を取得する命令も変わったようだ。

Point touchPoint = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
Point touchPoint = Director::getInstance()->convertToGL(pTouch->getLocationInView());

ここでDirectorが非常に大事なシングルトンのクラスだと知る。

cocos2d 〜CCDirectorについて〜 | Learn iPhone, iOS, Objective-c, cocos2d and ....?

 

ゲームを作ってみよう!— ハイスコア表示

card game 25 source code 4

UserDefaultもDirectorと同じように名前変更。UserDefaultはiPhoneアプリ開発でお馴染み。アプリを終了してもデータを残せる仕組み。

float highScore = CCUserDefault::sharedUserDefault()->getFloatForKey("highscore", 99.999f);
float highScore = UserDefault::getInstance()->getFloatForKey("highscore", 99.999f);

cocos2d-xにおけるデータ管理

 

ゲームを作ってみよう!— ゲームリトライ

card game 25 source code 5

最後にリトライのメニューを表示する。メニュー表示専用に何やら強力なクラスが用意されているっぽい。ここは3.x対応に時間がかかる。menuRetryButtonの引数の定義をObject* senderにしないとMenuItemFontでcreateを認識できなかった。

終了時にタッチイベントのデリゲートを削除してるようだが、3.xではどーすればいいか確信が持てず。とりあえずそれらしいメソッドを見つけたが、今後の課題。

auto* retryLabel = MenuItemFont::create("Retry", CC_CALLBACK_1(HelloWorld::menuRetryButton,this) );
menu->setPosition(Point::ZERO);
void HelloWorld::menuRetryButton(Object* sender) {
//CCDirector::getInstance()->getTouchDispatcher()->removeAllDelegates();
Director::getInstance()->getEventDispatcher()->removeAllEventListeners(); //タッチイベンド削除でいいかな?

Scene* gameScene = (Scene*)HelloWorld::create();
Director::getInstance()->replaceScene(gameScene);
}

 

cocos2dxすごい。次もいろんなサンプルを追ってみたいと思います。

 

 

スポンサーリンク