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::removeDependencyFlag(ccHObject* otherObject, DEPENDENCY_FLAGS flag) { int flags = getDependencyFlagsWith(otherObject); if ((flags & flag) == flag) { flags = (flags & (~flag)); //either update the flags (if some bits remain) if (flags != 0) m_dependencies[otherObject] = flags; else //otherwise remove the dependency m_dependencies.erase(otherObject); } }
//======================================removeDependencyFlag=========================// void ccHObject::removeDependencyFlag(ccHObject* otherObject, DEPENDENCY_FLAGS flag) { //获取与otherObject的依赖关系 int flags = getDependencyFlagsWith(otherObject); if ((flags & flag) == flag) { //flag 是 flags 的子集 flags = (flags & (~flag)); // flags - flag的部分 //either update the flags (if some bits remain) if (flags != 0) //如果不为0,则保留flags-flag部分的值 m_dependencies[otherObject] = flags; else //otherwise remove the dependency //如果为0 则flags == flag,此时完全移除依赖关系 m_dependencies.erase(otherObject); } }
void ccHObject::transferChild(ccHObject* child, ccHObject& newParent) { assert(child); //remove link from old parent int childDependencyFlags = child->getDependencyFlagsWith(this); int parentDependencyFlags = getDependencyFlagsWith(child); detachChild(child); //automatically removes any dependency with this object newParent.addChild(child,parentDependencyFlags); child->addDependency(&newParent,childDependencyFlags); //after a successful transfer, either the parent is 'newParent' or a null pointer assert(child->getParent() == &newParent || child->getParent() == 0); }
void ccHObject::removeAllChildren() { while (!m_children.empty()) { ccHObject* child = m_children.back(); m_children.pop_back(); int flags = getDependencyFlagsWith(child); if ((flags & DP_DELETE_OTHER) == DP_DELETE_OTHER) { if (child->isShareable()) dynamic_cast<CCShareable*>(child)->release(); else delete child; } } }
//=====================================transferChild===============================================================// void ccHObject::transferChild(ccHObject* child, ccHObject& newParent) { assert(child); //remove link from old parent //从原先的父亲物体中删除依赖关系 int childDependencyFlags = child->getDependencyFlagsWith(this); //获取子物体对父物体的依赖关系 int parentDependencyFlags = getDependencyFlagsWith(child); //获取父亲物体对子物体的依赖关系 //automatically removes any dependency with this object //只是删除与该物体的依赖关系//两两之间 detachChild(child); //新的父物体添加孩子物体 //依赖关系也同时转移 newParent.addChild(child,parentDependencyFlags); //子物体添加依赖关系 child->addDependency(&newParent,childDependencyFlags); //after a successful transfer, either the parent is 'newParent' or a null pointer assert(child->getParent() == &newParent || child->getParent() == 0); }
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(); }