いぬでもわかる

iOSやCocos2dxが好きでときどきAndroid。できるだけ毎日何かしら書く事を目標に頑張る。

cocos2d-x 3.0

しばらくcocos2d-xから離れていたら3.0がbetaリリースされていました。
書籍を見ながら久しぶりに触っていると結構異なっていてなかなか想い通りに進まない!
どんな変更があるのかと見てみると色々大きな変更も多いような。


c++11機能

  • callbackのためにstd::functionやlamdaの実装
  • strongly typed enums

kから始まる定数やenumをstrongly typed enumsで置き換えました。

  • override

overrideキーワードをつけられたメソッドがオーバーライドされていない場合エラーになります。

Objective-cパターンの削除

  • CCプリフィックス削除

CCSpriteやCCLabelTTFなどCCプレフィックスがついているクラスやメソッドからCCが削除されました。

  • メソッド名の変更

例えば、singleインスタンスの取得メソッドがshared~()からgetInstance()に変更されていたりします。

  • getterメソッドにgetがついた
//2.2まで
node->boundingBox();
//3.0以降
node->getBoundingBox() ;
  • copy()の代わりにclone()を実装した

clone()で複製されたインスタンスは、autoreleaseされているのでrelease、autoreleaseする必要はありません。
copy()は、compileはできちゃうけどクラッシュするので使わないで下さい。

  • PODタイプ

SizeやPointなどのPODタイプの引数を持つメソッド

// v2.1
void setTexParameters(ccTexParams* texParams);
// v3.0
void setTexParameters(const ccTexParams& texParams);

TouchDispatcher系のイベントデスパッチャーの削除
代わりにEventListenerが追加されました。

auto sprite = Sprite::create("file.png");
...
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouch(true);
listener->onTouchBegan     = [](Touch* touch, Event* event) { do_some_thing();  return true;  };
listener->onTouchMoved     = [](Touch* touch, Event* event) { do_some_thing();  };
listener->onTouchEnded     = [](Touch* touch, Event* event) { do_some_thing();  };
listener->onTouchCancelled = [](Touch* touch, Event* event) { do_some_thing();  };
// The priority of the touch listener is based on the draw order of sprite
EventDispatcher::getInstance()->addEventListenerWithSceneGraphPriority(listener, sprite);
// Or the priority of the touch listener is a fixed value
EventDispatcher::getInstance()->addEventListenerWithFixedPriority(listener, 100); // 100 is a fixed value

物理特性の統合
PhysicsWorld、PhysicsBody、PhysicsShape、PhysicsJoint、PhysicsContactからなります。
これらを利用したい場合には、ccConfigヘッダでCC_USE_PHYSICSを定義する必要があるようですが、デフォルトで定義されていました。

  • PhysicsWorld

PhysicsWorldオブジェクトは、衝突判定や他の物理プロパティをシミュレーションします。そして、直接オブジェクトを生成する必要はなく、sceneオブジェクトからPhysicsWorldオブジェクトを得る事ができます。

Scene* scene = Scene::createWithPhysics();
PhysicsWorld* world = scene->getPhysicsWorld();
PhysicsBody
  • PhysicsBody

PhysicsBodyオブジェクトは、ノードに物理シミュレーションを追加する時に使われます。

PhysicsBody* body = PhysicsBody::createCircle(5.0f);
Node* node = Node::create();
node->setPhysicsBody(body);
scene->addChild(node);

物理オブジェクトとC++11については正直良く分かっていないので、サンプルコードを載せながらまた説明できればと思っています。

https://github.com/cocos2d/cocos2d-x/blob/develop/docs/RELEASE_NOTES.md