void ccHObject::removeChild(int pos) { if (pos < 0 || static_cast<size_t>(pos) >= m_children.size()) { assert(false); return; } ccHObject* child = m_children[pos]; //we can't swap as we want to keep the order! //(DGM: do this BEFORE deleting the object (otherwise //the dependency mechanism can 'backfire' ;) m_children.erase(m_children.begin()+pos); //backup dependency flags int flags = getDependencyFlagsWith(child); //remove any dependency removeDependencyWith(child); //child->removeDependencyWith(this); //DGM: no, don't do this otherwise this entity won't be warned that the child has been removed! if ((flags & DP_DELETE_OTHER) == DP_DELETE_OTHER) { //delete object if (child->isShareable()) dynamic_cast<CCShareable*>(child)->release(); else/* if (!child->isA(CC_TYPES::POINT_OCTREE))*/ delete child; } else if (child->getParent() == this) { child->setParent(0); } }
void ccHObject::detatchAllChildren() { for (Container::iterator it=m_children.begin(); it!=m_children.end(); ++it) { ccHObject* child = *it; //remove any dependency (bilateral) removeDependencyWith(child); child->removeDependencyWith(this); if (child->getParent() == this) child->setParent(0); } m_children.clear(); }
void ccHObject::onDeletionOf(const ccHObject* obj) { //remove any dependency declared with this object //and remove it from the children list as well (in case of) //DGM: we can't call 'detachChild' as this method will try to //modify the child contents! removeDependencyWith(const_cast<ccHObject*>(obj)); //this method will only modify the dependency flags of obj int pos = getChildIndex(obj); if (pos >= 0) { //we can't swap children as we want to keep the order! m_children.erase(m_children.begin()+pos); } }
void ccHObject::transferChildren(ccHObject& newParent, bool forceFatherDependent/*=false*/) { for (Container::iterator it = m_children.begin(); it != m_children.end(); ++it) { ccHObject* child = *it; //remove link from old parent int childDependencyFlags = child->getDependencyFlagsWith(this); int fatherDependencyFlags = getDependencyFlagsWith(child); //we must explicitely remove any depedency with the child as we don't call 'detachChild' removeDependencyWith(child); child->removeDependencyWith(this); newParent.addChild(child,fatherDependencyFlags); child->addDependency(&newParent,childDependencyFlags); //after a successful transfer, either the parent is 'newParent' or a null pointer assert(child->getParent() == &newParent || child->getParent() == 0); } m_children.clear(); }
void ccHObject::detachChild(ccHObject* child) { if (!child) { assert(false); return; } //remove any dependency (bilateral) removeDependencyWith(child); child->removeDependencyWith(this); if (child->getParent() == this) child->setParent(0); int pos = getChildIndex(child); if (pos >= 0) { //we can't swap children as we want to keep the order! m_children.erase(m_children.begin()+pos); } }
//=================================================detachChild====================================================// void ccHObject::detachChild(ccHObject* child) { //子物体不存在 if (!child) { assert(false); return; } //remove any dependency (bilateral) // removeDependencyWith(child);// 移除与子物体的依赖关系 child->removeDependencyWith(this); //移除子物体与this的依赖关系 //父物体的父母设置成0 if (child->getParent() == this) child->setParent(0); //找到子物体,并删除 int pos = getChildIndex(child); if (pos >= 0){ //we can't swap children as we want to keep the order! m_children.erase(m_children.begin()+pos); } }