Пример #1
0
	// 改变当前编辑的点的位置
	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();
							}
						}

					}
				}
			}
		}
	}
Пример #2
0
// 选中点的操作
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;
					}
				}
			}
		}
	}
}
Пример #3
0
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)

}
Пример #4
0
// 选择一个点.
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();
        }
    }
}
Пример #5
0
// 点选择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();
	}
}
Пример #6
0
// 把区域存储到文件
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)