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 CList  playerlist; 
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;ipathlist.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;im_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; 
}