// 改变当前编辑的点的位置 void CPathFindAction::ChangeCurEditPointPos(const Point& pt) { CUnreachRegion* pRegion = NULL; CPointInfo* pPoint = NULL; // 得到当前正在编辑的区域的信息. pRegion = GetRegionById(m_ulCurEditRegionId); if(pRegion) { pPoint = pRegion->GetPointInfoById1(m_ulCurEditPointId); if(pPoint) { // 查找这个点的下标值. int iIndex = -1; POINT_MAP::iterator it; POINT_MAP::iterator itEnd; itEnd = pRegion->m_pointMap.end(); for(it = pRegion->m_pointMap.begin(); it != itEnd; it++) { iIndex++; if(m_ulCurEditPointId == it->first) { break; } } // 得到修改后的位置. Ogre::Vector3 position; bool hit = getSceneManipulator()->getTerrainIntersects(pt.x, pt.y, position); if(hit) { //暂时把判断能否添加一个点去掉. //if(pRegion->CanChangePointPos(iIndex, position)) { // 修改新的点的位置. pPoint->SetPos(position); // 当前编辑的点的位置. m_curPointPos = position; if(it != itEnd) { // 如果下标存在 if((-1 != iIndex)&&(iIndex < (int)pRegion->m_pLineShape->m_pointArray.size())) { pRegion->m_pLineShape->m_pointArray[iIndex] = position; pRegion->m_pLineShape->FillPointData1(); //pRegion->ReShapeArea1(); } } } } } } }
// 选中点的操作 void CPathFindEditDlg::DoSelPoint() { if(NULL == m_pListboxPointInRegion) { return; } // 得到选中的索引 int iIndex = m_pListboxPointInRegion->GetSelection(); unsigned long ulPointId = 0; if(-1 != iIndex) { // 得到点id ulPointId = (unsigned long)m_pListboxPointInRegion->GetClientData(iIndex); if(m_pAction) { DWORD dwOldID = m_ulCurPointId; DWORD dwMax, dwMin; FLOAT fDistance = 0.0f; Ogre::Vector3 p1, p2; //设置选中点 m_ulCurPointId = ulPointId; m_pAction->SelPoint(ulPointId); //求原先的选中点和新的选中点的折线距离 CUnreachRegion* pRegion = m_pAction->GetRegionById( m_ulCurRegionId ); if( dwOldID != m_ulCurPointId && pRegion ) { //试图得到原先点和选中点间的每一个点 dwMax = dwOldID > m_ulCurPointId ? dwOldID : m_ulCurPointId; dwMin = dwOldID > m_ulCurPointId ? m_ulCurPointId : dwOldID; for( DWORD dw = dwMin; dw <= dwMax; dw ++ ) { CPointInfo* pPoint = pRegion->GetPointInfoById1(dw); if( !pPoint ) continue; if( dw == dwMin ) { p1 = pPoint->GetPosition(); } else { p2 = pPoint->GetPosition(); fDistance += sqrtf( ( p1.x - p2.x ) * ( p1.x - p2.x ) + ( p1.y - p2.y ) * ( p1.y - p2.y ) + ( p1.z - p2.z ) * ( p1.z - p2.z ) ); p1 = p2; } } } } } }
void CNpcPatrolAction::ChangeCurEditPointPos(unsigned long ulRegionId, unsigned long ulPointId, Ogre::Vector3 position) { CUnreachRegion* pRegion = NULL; CPointInfo* pPoint = NULL; // 得到当前正在编辑的区域的信息. pRegion = GetRegionById(ulRegionId); if(pRegion) { pPoint = pRegion->GetPointInfoById(ulPointId); if(pPoint) { // 查找这个点的下标值. int iIndex = -1; POINT_MAP::iterator it; POINT_MAP::iterator itEnd; itEnd = pRegion->m_pointMap.end(); for(it = pRegion->m_pointMap.begin(); it != itEnd; it++) { iIndex++; if(ulPointId == it->first) { break; } } pPoint->SetPos(position); // 如果下标存在 if((-1 != iIndex)&&(iIndex < (int)pRegion->m_pLineShape->m_pointArray.size())) { pRegion->m_pLineShape->m_pointArray[iIndex] = position; pRegion->m_pLineShape->FillPointData(); //pRegion->ReShapeArea(); } }// if(pPoint) }// if(pRegion) }
// 选择一个点. void CNpcPatrolAction::SelPoint(unsigned long ulPointId) { m_ulCurEditPointId = ulPointId; CUnreachRegion* pRegion = NULL; CPointInfo* pPoint = NULL; // 得到当前正在编辑的区域的信息. pRegion = GetRegionById(m_ulCurEditRegionId); if(pRegion) { pRegion->SetPrePointMaterial(); pRegion->m_ulCurEditPointId = m_ulCurEditPointId; pPoint = pRegion->GetPointInfoById(ulPointId); if(pPoint) { pPoint->SetSelMaterial(); } } }
// 点选择listbox响应的事件函数 void CPathFindEditDlg::OnPointListBox(wxCommandEvent &event) { if (event.GetInt() == -1) { return; } if(event.GetId() == ID_LISTBOX_POINT) { int iIndex = m_pListboxPointInRegion->GetSelection(); if( iIndex != -1 ) { CPointInfo* pInfo = m_pAction->GetRegionById( m_pAction->GetCurEditRegionId() )->GetPointInfoByIndex1( iIndex ); if( pInfo ) { float fTerrainDataPosX = m_pAction->getTerrainData()->mPosition.x; float fTerrainDataPosZ = m_pAction->getTerrainData()->mPosition.z; float fScale = 1.0; if( m_pAction->getSceneManipulator() ) { fScale = m_pAction->getSceneManipulator()->getBaseScale(); if(abs((float)fScale) < 0.00001) fScale = 1.0; } Ogre::Vector3 position = pInfo->GetPosition(); char buf[128]; sprintf( buf, "%.4f", (position.x - fTerrainDataPosX) / fScale ); m_pPointX->Clear(); m_pPointX->WriteText( buf ); sprintf( buf, "%.4f", (position.z - fTerrainDataPosZ) / fScale ); m_pPointZ->Clear(); m_pPointZ->WriteText( buf ); } } DoSelPoint(); } }
// 把区域存储到文件 unsigned long CNpcPatrolAction::SaveRegionToFile(std::string strFileName) { FILE* pFile = NULL; //pFile = ::fopen(strFileName.data(), "wb"); //if(NULL == pFile) //{ // // 不能打开文件. // return 0xfffffffe; //} int iRegionCount = 0; int iPointCount = 0; int iId = 0; unsigned long ulId = 0; CUnreachRegion* pRegion = NULL; CPointInfo* pPoint = NULL; Ogre::Vector3 position; UNREACHREGIONMAP::iterator itRegion; UNREACHREGIONMAP::iterator itEndRegion; POINT_MAP::iterator itPoint; POINT_MAP::iterator itEndPoint; // 存储区域的个数 iRegionCount = m_UnreachRegionMap.size(); //::fwrite(&iRegionCount, sizeof(iRegionCount), 1, pFile); // 存储每个区域的信息 itEndRegion = m_UnreachRegionMap.end(); /////////////////////////////////////////////////////////////////////////////////////////////// // // 保存把场景坐标转换成游戏逻辑坐标. // //SaveX float x = 0; //SaveZ float z = 0; //SaveY float y = 0; // 缩放系数 float fScale = 1.0; float fTerrainDataPosX = 0; float fTerrainDataPosZ = 0; fTerrainDataPosX = getTerrainData()->mPosition.x; fTerrainDataPosZ = getTerrainData()->mPosition.z; if(getSceneManipulator()) { fScale = getSceneManipulator()->getBaseScale(); if(abs((float)fScale) < 0.00001) { fScale = 1.0; } } std::string strNpcPatrolFileIni = ""; std::string strNpcPatrolFile = ""; strNpcPatrolFile = strFileName; int iPos = strNpcPatrolFile.rfind("."); strNpcPatrolFileIni = strNpcPatrolFile.substr(0, iPos); strNpcPatrolFileIni += "_patrolpoint.ini"; // 删除旧的文件。 ::DeleteFile(strNpcPatrolFileIni.c_str()); char bufInfo[1024]; memset(bufInfo, 0, sizeof(bufInfo)); // 存储区域的个数 iRegionCount = m_UnreachRegionMap.size(); sprintf(bufInfo, "%d", iRegionCount); WritePrivateProfileString("INFO", "PATROLNUMBER", bufInfo, strNpcPatrolFileIni.c_str()); // 存储每个区域的信息 itEndRegion = m_UnreachRegionMap.end(); /////////////////////////////////////////////////////////////////////////////////////////////// // // 保存把场景坐标转换成游戏逻辑坐标. // fTerrainDataPosX = getTerrainData()->mPosition.x; fTerrainDataPosZ = getTerrainData()->mPosition.z; if(getSceneManipulator()) { fScale = getSceneManipulator()->getBaseScale(); if(abs((float)fScale) < 0.00001) { fScale = 1.0; } } char bufPosInfo[1024]; char bufPosValue[1024]; int iRegionIndex = 0; int iPointIndex = 0; for(itRegion = m_UnreachRegionMap.begin(); itRegion != itEndRegion; itRegion++) { pRegion = itRegion->second; if(pRegion) { memset(bufInfo, 0, sizeof(bufInfo)); sprintf(bufInfo, "PATROL%d", iRegionIndex); iRegionIndex++; // 存储点的个数. iPointCount = pRegion->m_pointMap.size(); sprintf(bufPosInfo, "%d", iPointCount); WritePrivateProfileString(bufInfo, "PATROLPOINTNUM", bufPosInfo, strNpcPatrolFileIni.c_str()); // 存储每个点的信息。 itEndPoint = pRegion->m_pointMap.end(); iPointIndex = 0; for(itPoint = pRegion->m_pointMap.begin(); itPoint != itEndPoint; itPoint++) { pPoint = itPoint->second; if(pPoint) { position = pPoint->m_Position; x = position.x; y = position.y; z = position.z; x = (x - fTerrainDataPosX) / fScale; y = (y) / fScale; z = (z - fTerrainDataPosZ) / fScale; memset(bufPosInfo, 0, sizeof(bufPosInfo)); sprintf(bufPosInfo, "POSX%d", iPointIndex); memset(bufPosValue, 0, sizeof(bufPosValue)); sprintf(bufPosValue, "%.4f", x); WritePrivateProfileString(bufInfo, bufPosInfo, bufPosValue, strNpcPatrolFileIni.c_str()); if( pPoint->GetValuedY() ) { memset(bufPosInfo, 0, sizeof(bufPosInfo)); sprintf(bufPosInfo, "POSY%d", iPointIndex); memset(bufPosValue, 0, sizeof(bufPosValue)); sprintf(bufPosValue, "%.4f", y); WritePrivateProfileString(bufInfo, bufPosInfo, bufPosValue, strNpcPatrolFileIni.c_str()); } else { //memset(bufPosInfo, 0, sizeof(bufPosInfo)); //sprintf(bufPosInfo, "POSY%d", iPointIndex); //memset(bufPosValue, 0, sizeof(bufPosValue)); //sprintf(bufPosValue, "%.4f", -100000.0f); //WritePrivateProfileString(bufInfo, bufPosInfo, bufPosValue, strNpcPatrolFileIni.c_str()); } memset(bufPosInfo, 0, sizeof(bufPosInfo)); sprintf(bufPosInfo, "POSZ%d", iPointIndex); memset(bufPosValue, 0, sizeof(bufPosValue)); sprintf(bufPosValue, "%.4f", z); WritePrivateProfileString(bufInfo, bufPosInfo, bufPosValue, strNpcPatrolFileIni.c_str()); iPointIndex++; } } //iRegionIndex++; } } // // 存储服务器需要的配置文件。 // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// return 0; }// unsigned long CNpcPatrolAction::SaveRegionToFile(std::string strFileName)