| 909 | } |
| 910 | |
| 911 | void Director::popToSceneStackLevel(int level) |
| 912 | { |
| 913 | AXASSERT(_runningScene != nullptr, "A running Scene is needed"); |
| 914 | ssize_t c = _scenesStack.size(); |
| 915 | |
| 916 | // level 0? -> end |
| 917 | if (level == 0) |
| 918 | { |
| 919 | end(); |
| 920 | return; |
| 921 | } |
| 922 | |
| 923 | // current level or lower -> nothing |
| 924 | if (level >= c) |
| 925 | return; |
| 926 | |
| 927 | auto firstOnStackScene = _scenesStack.back(); |
| 928 | if (firstOnStackScene == _runningScene) |
| 929 | { |
| 930 | #if AX_ENABLE_GC_FOR_NATIVE_OBJECTS |
| 931 | auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); |
| 932 | if (sEngine) |
| 933 | { |
| 934 | sEngine->releaseScriptObject(this, _scenesStack.back()); |
| 935 | } |
| 936 | #endif // AX_ENABLE_GC_FOR_NATIVE_OBJECTS |
| 937 | _scenesStack.popBack(); |
| 938 | --c; |
| 939 | } |
| 940 | |
| 941 | // pop stack until reaching desired level |
| 942 | while (c > level) |
| 943 | { |
| 944 | auto current = _scenesStack.back(); |
| 945 | |
| 946 | if (current->isRunning()) |
| 947 | { |
| 948 | current->onExit(); |
| 949 | } |
| 950 | |
| 951 | current->cleanup(); |
| 952 | #if AX_ENABLE_GC_FOR_NATIVE_OBJECTS |
| 953 | auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); |
| 954 | if (sEngine) |
| 955 | { |
| 956 | sEngine->releaseScriptObject(this, _scenesStack.back()); |
| 957 | } |
| 958 | #endif // AX_ENABLE_GC_FOR_NATIVE_OBJECTS |
| 959 | _scenesStack.popBack(); |
| 960 | --c; |
| 961 | } |
| 962 | |
| 963 | _nextScene = _scenesStack.back(); |
| 964 | |
| 965 | // cleanup running scene |
| 966 | _sendCleanupToScene = true; |
| 967 | } |
| 968 | |