こんばんは
###前提・実現したいこと
今「cocos2d-xではじめるスマートフォンゲーム開発」という本を見ながらcocos2d-xを勉強中なのですが、ここに書いてあるサンプルコードをそのまま入力したのにも関わらずセグメンテーション違反でコアダンプしてしまいます。gdbでcoreファイルを見てみたのですが、イマイチ原因が分かりません。どなたかご教授ください。。。
###発生している問題・エラーメッセージ
以下、gdbでcoreファイルを見た時の出力です。
(gdb) bt #0 0x0000000000000000 in ?? () #1 0x0000000000866e7b in cocos2d::Node::addChild (this=0x359fac0, child=0x36133b0) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCNode.cpp:989 #2 0x00000000008152fe in MainScene::<lambda()>::operator()(void) const (__closure=0x35d6710) at /home/daichi/dev/cocos.projects/KawazCatch/Classes/MainScene.cpp:407 #3 0x00000000008161f4 in std::_Function_handler<void(), MainScene::addReadyLabel()::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/4.9/functional:2039 #4 0x0000000000824240 in std::function<void ()>::operator()() const (this=0x360bd68) at /usr/include/c++/4.9/functional:2440 #5 0x0000000000822b9f in cocos2d::CallFunc::execute (this=0x360bd00) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionInstant.cpp:414 #6 0x0000000000822b04 in cocos2d::CallFunc::update (this=0x360bd00) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionInstant.cpp:403 #7 0x000000000082553c in cocos2d::Sequence::update (this=0x3614e40, t=1) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionInterval.cpp:411 #8 0x0000000000825388 in cocos2d::Sequence::update (this=0x3614ec0, t=1) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionInterval.cpp:385 #9 0x0000000000824923 in cocos2d::ActionInterval::step (this=0x3614ec0, dt=0.0157120004) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionInterval.cpp:142 #10 0x0000000000a0195c in cocos2d::ActionManager::update (this=0x2a68cd0, dt=0.0157120004) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCActionManager.cpp:449 #11 0x00000000009a5543 in void cocos2d::Scheduler::scheduleUpdate<cocos2d::ActionManager>(cocos2d::ActionManager*, int, bool)::{lambda(float)#1}::operator()(float) const (__closure=0x2a66350, dt=0.0157120004) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/base/CCScheduler.h:284 #12 0x00000000009a6e9a in std::_Function_handler<void (float), void cocos2d::Scheduler::scheduleUpdate<cocos2d::ActionManager>(cocos2d::ActionManager*, int, bool)::{lambda(float)#1}>::_M_invoke(std::_Any_data const&, float) (__functor=..., __args#0=0.0157120004) at /usr/include/c++/4.9/functional:2039 #13 0x00000000008302e6 in std::function<void (float)>::operator()(float) const (this=0x2a68d30, __args#0=0.0157120004) at /usr/include/c++/4.9/functional:2440 #14 0x00000000009d190c in cocos2d::Scheduler::update (this=0x2a68790, dt=0.0157120004) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/base/CCScheduler.cpp:850 #15 0x00000000009a135b in cocos2d::Director::drawScene (this=0x2a65500) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/base/CCDirector.cpp:277 #16 0x00000000009a4ef8 in cocos2d::Director::mainLoop (this=0x2a65500) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/base/CCDirector.cpp:1443 #17 0x000000000090efc3 in cocos2d::Application::run (this=0x7ffd78757d00) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/platform/linux/CCApplication-linux.cpp:86 #18 0x000000000081bbdb in main (argc=1, argv=0x7ffd78757e18) at /home/daichi/dev/cocos.projects/KawazCatch/proj.linux/main.cpp:14 (gdb) frame 1 #1 0x0000000000866e7b in cocos2d::Node::addChild (this=0x359fac0, child=0x36133b0) at /home/daichi/dev/cocos.projects/KawazCatch/cocos2d/cocos/2d/CCNode.cpp:989 989 this->addChild(child, child->getLocalZOrder(), child->_name); (gdb) frame 2 #2 0x00000000008152fe in MainScene::<lambda()>::operator()(void) const (__closure=0x35d6710) at /home/daichi/dev/cocos.projects/KawazCatch/Classes/MainScene.cpp:407 407 this->addChild(start); (gdb) p start $3 = (cocos2d::Sprite * const) 0x36133b0 (gdb) p this $4 = (MainScene * const) 0x359fac0 (gdb)
###該当のソースコード
以下、サンプルコード内の該当する関数です。サンプルコードは、落ちてくるフルーツをキャッチしてスコアを競うというゲームです。
c++
1void MainScene::addReadyLabel() 2{ 3 auto winSize = Director::getInstance()->getWinSize(); 4 auto center = Vec2(winSize.width / 2.0,winSize.height / 2.0); 5 //Readyの文字を定義する 6 auto ready = Sprite::create("ready.png"); 7 ready->setScale(0); //最初の大きさを0%にしておく 8 ready->setPosition(center); 9 this->addChild(ready); 10 11 //STARTの文字を定義する 12 auto start = Sprite::create("start.png"); 13 start->runAction(Sequence::create( 14 CCSpawn::create( 15 EaseIn::create(ScaleTo::create(0.5,0.5),0.5), 16 FadeOut::create(0.5), 17 NULL), 18 RemoveSelf::create(), 19 NULL)); 20 21 start->setPosition(center); 22 23 //READYにアニメーションを追加する 24 ready->runAction(Sequence::create( 25 ScaleTo::create(0.25,1), 26 DelayTime::create(1.0), 27 CallFunc::create([this,start] { 28 //STARTのラベルを追加する 29 this->addChild(start); 30 //ゲームの状態をPLAYINGに切り替える 31 _state = GameState::PLAYING; 32 33 CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("start.mp3"); 34 }), 35 RemoveSelf::create(), 36 NULL)); 37} 38
addReadyLabel()関数は、ゲームの開始時に「READY」と「START」の画像を順にアニメーションを行いながら表示する関数です。まず「READY」を表すSpriteをアニメーションを行いながら表示して、アニメーションが終わるとCallFuncのラムダのなかで「START」を表すSpriteをSceneに追加しています。
CallFuncのラムダ内のthis->addChild(start);の行をコメントアウトするとエラーは発生しないので、この行でエラーが発生しているのは分かるのですが、原因がわかりません。
###試したこと
初めラムダ内のthisかstartがヌルになっているんじゃないかと思ったのですが、gdbのpコマンドで確認してみるとどちらもヌルではありませんでした。もしかしたらstartにセットしたアニメーション内に原因が?と思い、一応start->runAction()の部分をコメントアウトして試して見たのですが、やはりaddChild(start)の部分でエラーになり、お手上げ状態です。どこが原因でしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/10 06:24
2017/01/10 06:31
2017/01/10 07:26