void ProtectedNode::removeAllProtectedChildrenWithCleanup(bool cleanup) { // not using detachChild improves speed here for (auto& child : _protectedChildren) { // IMPORTANT: // -1st do onExit // -2nd cleanup if(_running) { child->onExitTransitionDidStart(); child->onExit(); } if (cleanup) { child->cleanup(); } #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { sEngine->releaseScriptObject(this, child); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS // set parent nil at the end child->setParent(nullptr); } _protectedChildren.clear(); }
void EventDispatcher::releaseListener(EventListener* listener) { #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (listener && sEngine) { sEngine->releaseScriptObject(this, listener); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS CC_SAFE_RELEASE(listener); }
void RenderTexture::setSprite(Sprite* sprite) { #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { if (sprite) sEngine->retainScriptObject(this, sprite); if (_sprite) sEngine->releaseScriptObject(this, _sprite); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS CC_SAFE_RETAIN(sprite); CC_SAFE_RELEASE(_sprite); _sprite = sprite; }
void LayerMultiplex::switchToAndReleaseMe(int n) { CCASSERT( n < _layers.size(), "Invalid index in MultiplexLayer switchTo message" ); this->removeChild(_layers.at(_enabledLayer), true); #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { sEngine->releaseScriptObject(this, _layers.at(_enabledLayer)); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS _layers.replace(_enabledLayer, nullptr); _enabledLayer = n; this->addChild(_layers.at(n)); }
void ClippingNode::setStencil(Node *stencil) { if (_stencil == stencil) return; #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { if (_stencil) sEngine->releaseScriptObject(this, _stencil); if (stencil) sEngine->retainScriptObject(this, stencil); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS CC_SAFE_RETAIN(stencil); CC_SAFE_RELEASE(_stencil); _stencil = stencil; }
/* "remove" logic MUST only be on this method * If a class want's to extend the 'removeChild' behavior it only needs * to override this method */ void ProtectedNode::removeProtectedChild(cocos2d::Node *child, bool cleanup) { // explicit nil handling if (_protectedChildren.empty()) { return; } ssize_t index = _protectedChildren.getIndex(child); if( index != CC_INVALID_INDEX ) { // IMPORTANT: // -1st do onExit // -2nd cleanup if (_running) { child->onExitTransitionDidStart(); child->onExit(); } // If you don't do cleanup, the child's actions will not get removed and the // its scheduledSelectors_ dict will not get released! if (cleanup) { child->cleanup(); } // set parent nil at the end child->setParent(nullptr); #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { sEngine->releaseScriptObject(this, child); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS _protectedChildren.erase(index); } }
void ClippingNode::setStencil(Node *stencil) { //early out if the stencil is already set if (_stencil == stencil) return; #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine(); if (sEngine) { if (_stencil) sEngine->releaseScriptObject(this, _stencil); if (stencil) sEngine->retainScriptObject(this, stencil); } #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS //cleanup current stencil if(_stencil != nullptr && _stencil->isRunning()) { _stencil->onExitTransitionDidStart(); _stencil->onExit(); } CC_SAFE_RELEASE_NULL(_stencil); //initialise new stencil _stencil = stencil; CC_SAFE_RETAIN(_stencil); if(_stencil != nullptr && this->isRunning()) { _stencil->onEnter(); if(this->_isTransitionFinished) { _stencil->onEnterTransitionDidFinish(); } } if (_stencil != nullptr) _originStencilProgram = _stencil->getGLProgram(); }