//------------------------------------------------------------------------------------- void Space::removeEntity(Entity* pEntity) { pEntity->spaceID(0); // 先获取到所在位置 SPACE_ENTITIES::size_type idx = pEntity->spaceEntityIdx(); KBE_ASSERT(idx < entities_.size()); KBE_ASSERT(entities_[ idx ] == pEntity); // 如果有2个或以上的entity则将最后一个entity移至删除的这个entity所在位置 Entity* pBack = entities_.back().get(); pBack->spaceEntityIdx(idx); entities_[idx] = pBack; pEntity->spaceEntityIdx(SPACE_ENTITIES::size_type(-1)); entities_.pop_back(); onLeaveWorld(pEntity); // 这句必须在onLeaveWorld之后, 因为可能rangeTrigger需要参考pEntityCoordinateNode pEntity->uninstallCoordinateNodes(&coordinateSystem_); pEntity->onLeaveSpace(this); if(pEntity->id() == this->creatorID()) { DEBUG_MSG(fmt::format("Space::removeEntity: lose creator({}).\n", this->creatorID())); } // 如果没有entity了则需要销毁space, 因为space最少存在一个entity // 这个entity通常是spaceEntity if(entities_.empty()) { Spaces::destroySpace(this->id(), this->creatorID()); } }
//------------------------------------------------------------------------------------- void Space::removeEntity(Entity* pEntity) { pEntity->setSpaceID(0); // 先获取到所在位置 SPACE_ENTITIES::size_type idx = pEntity->spaceEntityIdx(); KBE_ASSERT(idx < entities_.size()); KBE_ASSERT(entities_[ idx ] == pEntity); // 如果有2个或以上的entity则将最后一个entity移至删除的这个entity所在位置 Entity* pBack = entities_.back().get(); pBack->spaceEntityIdx(idx); entities_[idx] = pBack; pEntity->spaceEntityIdx(SPACE_ENTITIES::size_type(-1)); entities_.pop_back(); onLeaveWorld(pEntity); // 这句必须在onLeaveWorld之后, 因为可能rangeTrigger需要参考pEntityRangeNode pEntity->uninstallRangeNodes(&rangeList_); // 如果没有entity了则需要销毁space, 因为space最少存在一个entity // 这个entity通常是spaceEntity if(entities_.empty()) { Spaces::destroySpace(this->getID(), this->creatorID()); } }