www.pudn.com > 3D_OnlineGame_Humen.rar > 3DFunction.cpp
#include "stdafx.h" #include "XMudClient.h" #include "MainScreen.h" #include "3DFunction.h" #include "D3DRMScreen.h" #include "MenuCreateNew.h" #include "MapInfo.h" #include "NpcInfo.h" #include "CommunicateMsg.h" #include "CommandCheck.h" #include "FacePlate.h" extern RECT rc3DMainFace; extern CListplayerlist; extern CList maplist; extern CMapInfo * lpMapInfo; extern CRITICAL_SECTION csAnimation; extern CList animationlist; extern CList exitlist; extern CExitInfo *lpExitInfo; extern SOCKET hLCltForRSvrSock; extern CMainScreen m_MainScreen; extern CMesssageWnd m_MessageWnd; extern LPDIRECT3DRM3 g_lpD3DRM; extern rmfullglobals myglobs; extern LPDIRECT3DRMFRAME3 g_lpplayer; extern LPDIRECT3DRMFRAME3 g_sFrame; extern D3DVECTOR g_PlayAndCameraPos; extern int g_playerState; extern int g_nGameState; extern BOOL g_Redraw2dFace[2]; extern PathInfo info; extern D3DVECTOR g_CameraPosition; extern char szSendBuf[]; BOOL g_bClientNet = TRUE; void D3DOnLButtonDown(POINT Pos) { animationCallbackArgs *cb; CPlayerInfo * lpPlayerInfo; int fnum; D3DVECTOR aimPosite; LPDIRECT3DRMVISUAL visual; LPDIRECT3DRMPICKED2ARRAY picked; D3DRMRAY rmRay; LPDIRECT3DRMFRAMEARRAY frames; LPDIRECT3DRMFRAME frame; LPDIRECT3DRMFRAME3 pFrame3; LPDIRECT3DRMFRAME3 roomFrame3; if(maplist.IsEmpty())return; lpPlayerInfo = playerlist.GetHead(); if(lpPlayerInfo->m_iSTATUS != AOS_none && !(lpPlayerInfo->m_iSTATUS & AOS_act_facesb)) return; if(m_MainScreen.bSelectOne) { m_MainScreen.szSelectOneName[0] = 0; m_MainScreen.DrawMsgBar(&m_MainScreen.rcSelectOnePos); m_MainScreen.bSelectOne = FALSE; if(m_MainScreen.bFaceSomeOne[0]||m_MainScreen.bFaceSomeOne[1]) { m_MainScreen.bFaceSomeOne[0] = FALSE; m_MainScreen.bFaceSomeOne[1] = FALSE; lpPlayerInfo->m_iSTATUS = AOS_none; lpPlayerInfo->m_sPERSONA = _T(""); } } myglobs.scene->GetChildren(&frames); fnum=frames->GetSize(); //0 ~ getsize()-1 if(fnum<6) { frames->Release(); return; } aimPosite = FindAndSelectVisual(Pos.x, Pos.y); if( g_sFrame == NULL){ frames->Release(); return; } frames->GetElement( 1, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); if( g_sFrame == pFrame3 ){ pFrame3->Release(); frame->Release(); frames->Release(); return; } frame->Release(); pFrame3->Release(); frames->GetElement( 5, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); roomFrame3=pFrame3; if( g_sFrame == pFrame3){ roomFrame3->Release(); pFrame3->Release(); frame->Release(); frames->Release(); return; } frame->Release(); pFrame3->Release(); if(GetAsyncKeyState(VK_CONTROL)&0x8000){ cb = animationlist.GetHead(); cb->pathlist.RemoveAll(); D3DVECTOR playerpos,camerapos; g_lpplayer->GetPosition(myglobs.scene, &playerpos); myglobs.camera->GetPosition(myglobs.scene, &camerapos); g_lpplayer->SetPosition( myglobs.scene,aimPosite.x, aimPosite.y, aimPosite.z); camerapos.x += aimPosite.x - playerpos.x; camerapos.z += aimPosite.z - playerpos.z; myglobs.camera->SetPosition(myglobs.scene, camerapos.x, camerapos.y, camerapos.z); myglobs.camera->LookAt(g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Z); myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); roomFrame3->Release(); frames->Release(); return; } frames->GetElement( 4, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); if( g_sFrame == pFrame3){ rmRay.dvDir.x = aimPosite.x; rmRay.dvDir.y = aimPosite.y; rmRay.dvDir.z = aimPosite.z; rmRay.dvPos.x = aimPosite.x; rmRay.dvPos.y = aimPosite.y+10.0f; rmRay.dvPos.z = aimPosite.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()){ LPDIRECT3DRMFRAMEARRAY sframes; LPDIRECT3DRMFRAME sframe; LPDIRECT3DRMFRAME3 spFrame3; picked->GetPick(0, &visual, &sframes, 0); sframes->GetElement(sframes->GetSize() - 1, &sframe); sframe->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&spFrame3); if( g_sFrame == spFrame3){ spFrame3->Release(); sframe->Release(); sframes->Release(); visual->Release(); ChangePath(aimPosite,roomFrame3,0); } else { spFrame3->Release(); sframe->Release(); sframes->Release(); visual->Release(); } } picked->Release(); } roomFrame3->Release(); frames->Release(); pFrame3->Release(); frame->Release(); return; } ChangePath(aimPosite,roomFrame3,1); roomFrame3->Release(); pFrame3->Release(); frames->Release(); frame->Release(); } void D3DOnLButtonUp(POINT Pos) { } void D3DOnRButtonDown(POINT Pos) { animationCallbackArgs *cb,*selfcb; CPlayerInfo *lpPlayerInfo; int i,j; D3DVECTOR aimPosite,tagPos; BOOL bFindPerson = FALSE; if(maplist.IsEmpty())return; lpPlayerInfo = playerlist.GetHead(); if(!(lpPlayerInfo->m_iSTATUS == AOS_none || (lpPlayerInfo->m_iSTATUS & AOS_act_facesb))) return; aimPosite = FindAndSelectVisual(Pos.x, Pos.y); if(m_MainScreen.bSelectOne) { m_MainScreen.DrawMsgBar(&m_MainScreen.rcSelectOnePos); m_MainScreen.bSelectOne = FALSE; } if(m_MainScreen.bFaceSomeOne[0]||m_MainScreen.bFaceSomeOne[1]) { m_MainScreen.bSelectOne = FALSE; m_MainScreen.bFaceSomeOne[0] = FALSE; m_MainScreen.bFaceSomeOne[1] = FALSE; lpPlayerInfo->m_iSTATUS = AOS_none; lpPlayerInfo->m_sPERSONA = _T(""); } BOOL bFindSomebody = FALSE; j = animationlist.GetCount(); for(i=1;i PlayerState == DEAD) continue; cb->frame3obj->GetPosition(myglobs.scene, &tagPos); if(fabs(aimPosite.x-tagPos.x) < 0.9 && fabs(aimPosite.z-tagPos.z) < 0.9){ strcpy(m_MainScreen.szSelectOneName,"§A¥s¦í¤F\""); strcat(m_MainScreen.szSelectOneName,cb->cCName); strcat(m_MainScreen.szSelectOneName,"\""); m_MainScreen.szSelectEName = cb->cXFileName; bFindSomebody = TRUE; if(!(m_MainScreen.bFaceSomeOne[0]||m_MainScreen.bFaceSomeOne[1])) { m_MainScreen.bSelectOne = TRUE; bFindPerson = TRUE; } m_MainScreen.szFaceShowMsg = GetNpcFaceInfo(cb->cXFileName); m_MainScreen.szFaceSomeCName = cb->cCName; CString strtmp; strtmp = szYellowHigt; strtmp += m_MainScreen.szFaceShowMsg; AddSelfMsg(strtmp); m_MainScreen.bFaceSomeOne[0] = TRUE; m_MainScreen.bFaceSomeOne[1] = TRUE; lpPlayerInfo->m_iSTATUS = AOS_facesb; lpPlayerInfo->m_sPERSONA = cb->cXFileName; g_lpplayer->LookAt( cb->frame3obj, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->LookAt( g_lpplayer, myglobs.scene,D3DRMCONSTRAIN_Z); selfcb = animationlist.GetHead(); g_playerState = STOP; selfcb->time = STOP_START; break; } } if(!bFindPerson) { m_MainScreen.bSelectOne = FALSE; m_MainScreen.bFaceSomeOne[0] = FALSE; m_MainScreen.bFaceSomeOne[1] = FALSE; } } void DeselectVisual() { g_sFrame = NULL; } void SelectVisual( LPDIRECT3DRMFRAME3 frame) { DeselectVisual(); g_sFrame = frame; } #define USE_RAYPICK D3DVECTOR FindAndSelectVisual(int x, int y) { D3DVECTOR aimPosite; LPDIRECT3DRMVISUAL visual; LPDIRECT3DRMFRAME frame; LPDIRECT3DRMFRAMEARRAY frames; LPDIRECT3DRMMESHBUILDER3 mesh; DeselectVisual(); #ifdef USE_RAYPICK LPDIRECT3DRMPICKED2ARRAY picked; D3DRMRAY rmRay; D3DRMVECTOR4D v4Src; int i; myglobs.camera->GetPosition(NULL, &rmRay.dvPos); g_lpplayer->GetPosition(myglobs.scene, &rmRay.dvDir); for(i=0;i<20;i++){ myglobs.view->Transform(&v4Src,&rmRay.dvDir); v4Src.x = (float)x * v4Src.w; v4Src.y = (float)y * v4Src.w; myglobs.view->InverseTransform(&rmRay.dvDir, &v4Src); rmRay.dvDir.y = 0.0f; } aimPosite.x = rmRay.dvDir.x; aimPosite.y = rmRay.dvDir.y; aimPosite.z = rmRay.dvDir.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); #else LPDIRECT3DRMPICKEDARRAY picked; view->Pick(x, y, &picked); #endif if (picked){ if (picked->GetSize()){ LPDIRECT3DRMPROGRESSIVEMESH pm; LPDIRECT3DRMFRAME3 pFrame3; LPDIRECT3DRMFRAME3 parent; picked->GetPick(0, &visual, &frames, 0); frames->GetElement(frames->GetSize() - 1, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMProgressiveMesh, (LPVOID*) &pm))){ SelectVisual(pFrame3); pm->Release(); } else if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder3, (void **) &mesh))){ pFrame3->GetParent(&parent); SelectVisual(parent); mesh->Release(); parent->Release(); }else{ SelectVisual(pFrame3); } pFrame3->Release(); frame->Release(); frames->Release(); visual->Release(); } picked->Release(); } return aimPosite; } void DeleteVisual() { if (g_sFrame){ LPDIRECT3DRMFRAME3 parent, frame = g_sFrame; DeselectVisual(); frame->GetParent(&parent); parent->DeleteChild(frame); parent->Release(); } } BOOL BumpAndShowMsg() { CPlayerInfo *lpPlayerInfo; D3DVECTOR tmpPos,tagPos; CString cMsg,szTemp; int i,j; CString parm = (" "); BOOL bFindPerson = FALSE; lpPlayerInfo = playerlist.GetHead(); g_lpplayer->GetPosition(myglobs.scene, &tmpPos); j = exitlist.GetCount(); for(i=0;i frame3obj->GetPosition(myglobs.scene, &tagPos); if(fabs(tmpPos.x-tagPos.x) < 0.9f && fabs(tmpPos.z-tagPos.z)<0.9f){ bFindPerson = TRUE; break; } } if(!bFindPerson)return FALSE; j = maplist.GetCount(); for(i=0;i m_sEXIT_DBF == lpExitInfo->cXFileName){ break; } } if(!lpMapInfo->m_sMAPINFO.IsEmpty()){ return FALSE; } lpPlayerInfo = playerlist.GetHead(); D3DVECTOR tmppos; g_lpplayer->GetPosition(myglobs.scene, &g_PlayAndCameraPos); myglobs.camera->GetPosition(myglobs.scene, &tmppos); g_PlayAndCameraPos.x = tmppos.x - g_PlayAndCameraPos.x; g_PlayAndCameraPos.y = tmppos.y - g_PlayAndCameraPos.y; g_PlayAndCameraPos.z = tmppos.z - g_PlayAndCameraPos.z; szTemp.Format("%s %s",szChangeMap,lpMapInfo->m_sCNAME); Send(hLCltForRSvrSock,szTemp); g_nGameState = GAME_WAIT; g_bClientNet = FALSE; return TRUE; }