2017-06-02 44 views
0

我在Android版本的Cocos2D-X遊戲中遇到了一個奇怪的崩潰問題。Android Cocos2D-x應用程序在lambda回調中的Seg錯誤

在很多地方,我在完成一些其他的行動,執行回調,調用是這樣的:

playAnimationOnce(animationName, [this] { 
    m_animationStateMachine->changeState(TWITCHING_ANIM_STATE); 
    m_stateMachine->changeState(DEAD); 
}); 

在Android上,m_animationStateMachine能夠改變狀態就好了,但是,使得到m_stateMachine任何引用導致飛機墜毀,具體如下:

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3f800044 
Stack frame #00 pc 008ed5ec /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so (_ZN12StateMachine11changeStateEPK5StatePKv+52): Routine StateMachine::changeState(State const*, void const*) at /path/to/project/proj.android-studio/app/jni/../../../Platform/Util/StateMachine.cpp:158 
Stack frame #01 pc 007ef73c /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so: Routine operator() at /path/to/project/proj.android-studio/app/jni/../../../Source/Actors/Hero.cpp:1291 

遊戲工作正常iOS上。我甚至在iOS上的XCode上執行回調的執行,並確認該對象在iOS上有效。

我沒有辦法在Android上使用調試器,所以我無法比使用日誌語句更好地檢查每個變量。


事情我已經試過不已:

  • [&]代替[this]
  • 使得StateMachine的一個全新的實例只有兩種狀態捕獲,這也導致飛機墜毀。

還有一些我現在忘記的東西。隨時給我任何和所有的建議,我不知道是什麼可能造成這一點。

回答

0

我想通了。

雖然我仍然不知道Android如何創建這個問題,所以如果你這樣做,請讓我知道。

本質上,當執行m_animationStateMachine->changeState時,會播放一個新的動畫,它清除當前正在運行的動畫,並使用cocos2d-x方法清除動畫回調。

我認爲這導致m_animationStateMachine->changeState之後的所有行在一些未定義的上下文中執行。

我通過將m_animationStateMachine->changeState作爲回調的最後一行,並在播放新動畫之前更改類的狀態來解決此問題。


發佈此問題作爲答案,以便我可以在幾天內解決問題,也許這將有助於未來的其他人。