www.pudn.com > XmudOSr.rar > FindPath.cpp
// //处理路径部分 // #include "stdafx.h" #include "XMudClient.h" #include "3DFunction.h" #include "D3DRMScreen.h" #include "MenuCreateNew.h" #include "MapInfo.h" #include "MainScreen.h" #include "CommandCheck.h" #include "InitInternet.h" extern CRITICAL_SECTION csMaplist; extern CListplayerlist; extern CPlayerInfo * lpPlayerInfo; extern CList animationlist; extern animationCallbackArgs *cb; extern CList maplist; extern CMainScreen m_MainScreen; extern LPDIRECT3DRM3 g_lpD3DRM; extern rmfullglobals myglobs; extern LPDIRECT3DRMFRAME3 g_lpplayer; extern int g_playerState; extern CString g_sPlayerName; extern BOOL g_GetSameMove; // //ChangePath() Foundation // BOOL ChangePath(D3DVECTOR aimPosite,LPDIRECT3DRMFRAME3 roomFrame3,int iIndex) { D3DVECTOR *path; D3DVECTOR playerpos; float xpos,ypos,steplength; float yposabs,xposabs; float ftmppath; char tmpchar[20]; CString strpath; int i,j,iNumStep; g_playerState = STOP; lpPlayerInfo = playerlist.GetHead(); if(lpPlayerInfo->m_iSTATUS == AOS_facesb) { CString sLeaveSome; sLeaveSome.Format("%s你对%s说:'后会有期'",szGreenLow,lpPlayerInfo->m_sPERSONA); AddSelfMsg(sLeaveSome); lpPlayerInfo->m_iSTATUS = AOS_none; lpPlayerInfo->m_sPERSONA.Empty(); if(m_MainScreen.mFirstFD.nShowState == SHOWNPCSKILL || m_MainScreen.mFirstFD.nShowState == SHOWNPCEQUIP) { m_MainScreen.mFirstFD.nShowState = SHOWEQUIP; m_MainScreen.mFirstFD.bReDraw[0] = TRUE; m_MainScreen.mFirstFD.bReDraw[1] = TRUE; } m_MainScreen.szFaceSomeCName.Empty(); m_MainScreen.szFaceShowMsg.Empty(); m_MainScreen.bFaceSomeOne[0] = FALSE; m_MainScreen.bFaceSomeOne[1] = FALSE; m_MainScreen.bSelectOne = FALSE; } cb = animationlist.GetHead(); cb->pathlist.RemoveAll(); cb->time = STOP_START; g_lpplayer->GetPosition(myglobs.scene, &playerpos); for(i=0;i<99;i++) { xpos = aimPosite.x - playerpos.x; ypos = aimPosite.z - playerpos.z; yposabs = (float)fabs(ypos); xposabs = (float)fabs(xpos); if(xpos >-0.2f && xpos <0.2f && ypos >-0.2f &&ypos < 0.2f)break; if(xpos > 0.2f)//方向朝x正轴 { if(ypos > 0.2f)//目前点的右上方 { if(xpos>ypos)//角度小于45度(右上方)1.rightup,2.right,3.rightdown,4.up { iNumStep = (int)(xpos/0.2f); steplength = (float)((sqrt(ypos*ypos+xpos*xpos))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,0.2f,steplength)) { if(searchpath(playerpos,roomFrame3,0.2f,0.0f)) { playerpos.x +=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,0.2f,(0.0f-steplength))) { playerpos.x += 0.2f; playerpos.z -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,0.0f,steplength)) break; playerpos.z += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.x += 0.2f; playerpos.z += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else if(xpos<=ypos)//角度大于45度(右上方)1.rightup,2.up,3.right,4.leftup { iNumStep = (int)(ypos/0.2f); steplength = (float)((sqrt(ypos*ypos+xpos*xpos))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,steplength,0.2f)) { if(searchpath(playerpos,roomFrame3,0.0f,0.2f)) { playerpos.z +=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,0.2f,0.0f)) { playerpos.x += 0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,(0.0f-steplength),0.2f)) break; playerpos.x -= steplength; playerpos.z += 0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.z += 0.2f; playerpos.x += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } } else if(ypos < -0.2f)//目前点的右下方 { if(xpos>yposabs)//角度小于45度(右下方)1.rightdown,2,right,3,down,4,rightup { iNumStep = (int)(xpos/0.2f); steplength = (float)((sqrt(yposabs*yposabs+xpos*xpos))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,0.2f,(0.0f-steplength))) { if(searchpath(playerpos,roomFrame3,0.2f,0.0f)) { playerpos.x +=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,0.0f,(0.0f-steplength))) { playerpos.z -=steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,0.2f,steplength)) break; playerpos.x += 0.2f; playerpos.z = steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.x += 0.2f; playerpos.z -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else if(xpos<=yposabs)//角度大于45度,右下1.rightdown,2,down,3,right,4,leftdown { iNumStep = (int)(yposabs/0.2f); steplength = (float)((sqrt(yposabs*yposabs+xpos*xpos))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,steplength,(-0.2f))) { if(searchpath(playerpos,roomFrame3,0.0f,(-0.2f))) { playerpos.z -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,steplength,0.0f)) { playerpos.x +=steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,(0.0f-steplength),(-0.2f))) break; playerpos.x -=steplength; playerpos.z -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.z -= 0.2f; playerpos.x += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } }//end of else if } else//目前点的正右方(忽略y轴在正负0.2f之间) { iNumStep = (int)(xpos/0.2f); if(!searchpath(playerpos,roomFrame3,0.2f,0.0f)) break; playerpos.x += 0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else if(xpos < -0.2f)//方向朝x负轴 { if(ypos > 0.2f)//目前点的左上方 { if(xposabs>ypos)//角度小于45度(左上方)1.leftup,2,left,3,up,4,leftdown { iNumStep = (int)(xposabs/0.2f); steplength = (float)((sqrt(ypos*ypos+xposabs*xposabs))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,(-0.2f),steplength)) { if(searchpath(playerpos,roomFrame3,(-0.2f),0.0f)) { playerpos.x -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,0.0f,steplength)) { playerpos.z += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,(-0.2f),(0.0f-steplength))) break; playerpos.x -= 0.2f; playerpos.z -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.x -= 0.2f; playerpos.z += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else if(xposabs<=ypos)//角度大于45度(左上)1.leftup,2,up,3,left,4,rightup { iNumStep = (int)(ypos/0.2f); steplength = (float)((sqrt(ypos*ypos+xposabs*xposabs))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,(0.0f-steplength),0.2f)) { if(searchpath(playerpos,roomFrame3,0.0f,0.2f)) { playerpos.z +=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,(0.0f-steplength),0.0f)) { playerpos.x -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,steplength,0.2f)) break; playerpos.z += 0.2f; playerpos.x += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.z += 0.2f; playerpos.x -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } } else if(ypos < -0.2f)//目前点的左下方 { if(xposabs>yposabs)//角度小于45度(左下方)1.leftdown,2,left,3,down,4,leftup { iNumStep = (int)(xposabs/0.2f); steplength = (float)((sqrt(yposabs*yposabs+xposabs*xposabs))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,(-0.2f),(0.0f-steplength))) { if(searchpath(playerpos,roomFrame3,(-0.2f),0.0f)) { playerpos.x -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,0.0f,(0.0f-steplength))) { playerpos.z -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,(-0.2f),steplength)) break; playerpos.x -= 0.2f; playerpos.z += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.x -= 0.2f; playerpos.z -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else if(xposabs<=yposabs)//角度大于45度(左下方)1,leftdown,2,down,3,left,4,rightdown { iNumStep = (int)(yposabs/0.2f); steplength = (float)((sqrt(yposabs*yposabs+xposabs*xposabs))/iNumStep); steplength = (float)sqrt(steplength*steplength-0.2f*0.2f); if(!searchpath(playerpos,roomFrame3,(0.0f-steplength),(-0.2f))) { if(searchpath(playerpos,roomFrame3,0.0f,(-0.2f))) { playerpos.z -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(searchpath(playerpos,roomFrame3,(0.0f-steplength),0.0f)) { playerpos.x -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else { if(!searchpath(playerpos,roomFrame3,steplength,(-0.2f))) break; playerpos.z -= 0.2f; playerpos.x += steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else { playerpos.z -= 0.2f; playerpos.x -= steplength; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } }//end of else if } else//目前点的正左方(忽略y轴在正负0.2f之间) { iNumStep = (int)(xposabs/0.2f); if(!searchpath(playerpos,roomFrame3,0.0f,(-0.2f))) break; playerpos.x -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } } else//目标点的坐标在x轴正负0.2之间 { if(ypos > 0.2f)//目前点的正上方 { iNumStep = (int)(ypos/0.2f); if(!searchpath(playerpos,roomFrame3,steplength,0.2f)) break; playerpos.z +=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else if(ypos < -0.2f)//目前点的正下方 { iNumStep = (int)(yposabs/0.2f); if(!searchpath(playerpos,roomFrame3,steplength,(-0.2f))) break; playerpos.z -=0.2f; path = new D3DVECTOR; path->x = playerpos.x; path->y = playerpos.y; path->z = playerpos.z; cb->pathlist.AddTail(path); } else//基本在原地不动 { } } }//end for(;;) if(cb->pathlist.IsEmpty()) return TRUE; j = cb->pathlist.GetCount(); for(i=0;i pathlist.GetAt(cb->pathlist.FindIndex(i)); ftmppath = path->x; gcvt(ftmppath,6,tmpchar); strpath += tmpchar+CString("\t"); ftmppath = path->z; gcvt(ftmppath,6,tmpchar); strpath += tmpchar+CString("\t"); } /*cary if(g_GetSameMove) { CMapInfo *lpMapInfo; strpath = szMoveCmd+CString(" ")+g_sPlayerName+(" ")+strpath; EnterCriticalSection(&csMaplist); j = maplist.GetCount(); for(i=0;i m_sPLAYER_DBF != "") { if(lpMapInfo->m_sENAME != g_sPlayerName) { CPmudNet_SendToClient((char*)(LPCSTR)lpMapInfo->szPlayerIP,(const char*)strpath,strpath.GetLength(),TRUE); } } } LeaveCriticalSection(&csMaplist); } end*/ cb->iAimSite = iIndex; cb->time = LEFTGO_START; g_playerState = LEFTGO; return TRUE; } // 判断搜寻点可不可走 BOOL searchpath(D3DVECTOR posSearch, LPDIRECT3DRMFRAME3 roomFrame3, float xMove, float yMove) { LPDIRECT3DRMPICKED2ARRAY picked; D3DRMRAY rmRay; LPDIRECT3DRMVISUAL visual; LPDIRECT3DRMFRAMEARRAY frames; LPDIRECT3DRMFRAME frame; LPDIRECT3DRMFRAME3 pFrame3; BOOL bCheckOK=FALSE; posSearch.x += xMove*2.0f; posSearch.z += yMove*2.0f; rmRay.dvDir.x = posSearch.x; rmRay.dvDir.y = posSearch.y; rmRay.dvDir.z = posSearch.z; rmRay.dvPos.x = posSearch.x; rmRay.dvPos.y = posSearch.y+10.0f; rmRay.dvPos.z = posSearch.z; rmRay.dvDir.x -= rmRay.dvPos.x; rmRay.dvDir.y -= rmRay.dvPos.y; rmRay.dvDir.z -= rmRay.dvPos.z; myglobs.scene->RayPick(NULL, &rmRay, 0, &picked);//该处是检查是可移动的点 if (picked) { if (picked->GetSize()) { picked->GetPick(0, &visual, &frames, 0); frames->GetElement(frames->GetSize() - 1, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); if( roomFrame3 != pFrame3) { pFrame3->Release(); frame->Release(); frames->Release(); visual->Release(); bCheckOK = TRUE; } } } picked->Release(); return bCheckOK; }