//------------------------------------------------------------------------------------- NavigationHandlePtr Navigation::findNavigation(std::string resPath) { KBEngine::thread::ThreadGuard tg(&mutex_); KBEUnordered_map<std::string, NavigationHandlePtr>::iterator iter = navhandles_.find(resPath); if(navhandles_.find(resPath) != navhandles_.end()) { if(iter->second == NULL) return NULL; if(iter->second->type() == NavigationHandle::NAV_MESH) { return iter->second; } else if (iter->second->type() == NavigationHandle::NAV_TILE) { // 由于tile需要做碰撞, 每一个space都需要一份新的数据, 我们这里采用拷贝的方式来增加构造速度 NavTileHandle* pNavTileHandle = new NavTileHandle(*(KBEngine::NavTileHandle*)iter->second.get()); DEBUG_MSG(fmt::format("Navigation::findNavigation: copy NavTileHandle({:p})!\n", (void*)pNavTileHandle)); return NavigationHandlePtr(pNavTileHandle); } return iter->second; } return NULL; }
//------------------------------------------------------------------------------------- NavigationHandlePtr Navigation::loadNavigation(std::string resPath, const std::map< int, std::string >& params) { KBEngine::thread::ThreadGuard tg(&mutex_); if(resPath == "") return NULL; KBEUnordered_map<std::string, NavigationHandlePtr>::iterator iter = navhandles_.find(resPath); if(iter != navhandles_.end()) { return iter->second; } NavigationHandle* pNavigationHandle_ = NULL; std::string path = resPath; path = Resmgr::getSingleton().matchPath(path); if(path.size() == 0) return NULL; wchar_t* wpath = strutil::char2wchar(path.c_str()); std::wstring wspath = wpath; free(wpath); std::vector<std::wstring> results; Resmgr::getSingleton().listPathRes(wspath, L"tmx", results); if(results.size() > 0) { pNavigationHandle_ = NavTileHandle::create(resPath, params); } else { results.clear(); Resmgr::getSingleton().listPathRes(wspath, L"navmesh", results); if(results.size() == 0) { return NULL; } pNavigationHandle_ = NavMeshHandle::create(resPath, params); } navhandles_[resPath] = NavigationHandlePtr(pNavigationHandle_); return pNavigationHandle_; }
//------------------------------------------------------------------------------------- NavigationHandlePtr Navigation::loadNavigation(std::string name) { KBEngine::thread::ThreadGuard tg(&mutex_); if(name == "") return NULL; KBEUnordered_map<std::string, NavigationHandlePtr>::iterator iter = navhandles_.find(name); if(iter != navhandles_.end()) { return iter->second; } NavigationHandle* pNavigationHandle_ = NULL; std::string path = "spaces/" + name; if(Resmgr::getSingleton().openRes(path + "/" + name + ".tmx")) { pNavigationHandle_ = NavTileHandle::create(name); } else { path = Resmgr::getSingleton().matchPath(path); wchar_t* wpath = strutil::char2wchar(path.c_str()); std::wstring wspath = wpath; free(wpath); std::vector<std::wstring> results; Resmgr::getSingleton().listPathRes(wspath, L"navmesh", results); if(results.size() == 0) { return NULL; } pNavigationHandle_ = NavMeshHandle::create(name); } navhandles_[name] = NavigationHandlePtr(pNavigationHandle_); return pNavigationHandle_; }