Edited at

Cocos2d-x 3.7 で Sceneをnewしたときの挙動が怪しい場合

More than 3 years have passed since last update.


発生時の環境

OS X 10.10.3

Xcode 6.4

iOS SDK 8.4

iOSシミュレータ iPhone6 8.4, iPhone6 8.2

cocos2d-x 3.7


現象

Scenenew辺りを契機にして、不特定多数の箇所でSIGABRTなどでクラッシュする。

毎回発生するわけではなく頻度はまちまち、一番面倒くさいパターン。


再現方法

下記のように書くと再現できる。

CREATE_FUNC及びcreateSceneと同じことを外でやってるだけ。

特にXcodeのブレイクポイントを使ってると起こりやすい。


AppDelegate.cpp

bool AppDelegate::applicationDidFinishLaunching()

{
...

Scene* scene = new Scene();
scene->init();
scene->autorelease();

HelloWorld* layer = new HelloWorld();
layer->init();
layer->autorelease();

scene->addChild(layer);

director->runWithScene(scene);

return true;
}


なお、頻度は低いがnew Scene()のみでも発生する。


AppDelegate.cpp

bool AppDelegate::applicationDidFinishLaunching()

{
...

Scene* scene = new Scene();
director->runWithScene(scene);

return true;
}



解消方法(暫定)



  1. ccConfig.hで定義されているCC_ENABLE_BULLET_INTEGRATIONフラグを切る

  2. もしくはアプリ側のBuild Settings のPreprocessor Macros でCC_ENABLE_BULLET_INTEGRATION=1にする。

本家githubでissueが上がってました。

3.7はしょうがないけど、3.7.1か3.8あたりで本修正入るのを待ちましょう。


原因

本家githubのissueのPRに詳細が書いてありました。


The reason is when compile CCScene.cpp, the CC_ENABLE_BULLIET_INTERATION=1 effect the CCScene.h, but when compile the custom scene derived from scene in new game project, the CC_ENABLE_BULLIET_INTERATION not defined. This cause the Scene class layout in cocos2dlib and in derived class is different.