www.pudn.com > XmudOSr.rar > D3DRMScreen.cpp
#include "stdafx.h" #include "XMudClient.h" #include "D3DRMScreen.h" #include "MainScreen.h" #include "d3dappi.h" #include "MenuCreateNew.h" #include "MapInfo.h" #include "NpcInfo.h" #include "CommandCheck.h" #include "FacePlate.h" #include "MyMusic.h" #include#include "MyDInput.h" #define MSG(str) MessageBox( NULL, str, "Application Message", MB_OK ) extern char g_tszPathName[256]; extern D3DVECTOR g_CameraPosition; LPDIRECT3DRMFRAME3 g_lights; LPDIRECT3DRMLIGHT g_ambient; LPDIRECT3DRMLIGHT g_parallel; LPDIRECT3DRMFRAME3 g_lpplayer; LPDIRECT3DRMFRAME3 g_pChaseFrame; LPDIRECT3DRMANIMATION2 g_lpAnim; LPDIRECT3DRMFRAME3 g_sFrame = NULL;//处理被鼠标选种的3D物体 D3DRMBOX BaseBox; D3DVECTOR BaseCenter; D3DVECTOR g_PlayAndCameraPos = D3DVECTOR(0,-1,0); D3DVECTOR g_lightgammer = D3DVECTOR(0.8f,0.8f,0.8f); PathInfo info; int g_playerState = STOP; extern float g_fCamfov; extern char g_tszPathName[256]; extern LPDIRECT3DRM3 g_lpD3DRM; extern rmfullglobals myglobs; extern CMainScreen m_MainScreen; char szPlayerName[16]; CList exitlist; CExitInfo *lpExitInfo; extern CRITICAL_SECTION csMaplist; extern CList maplist; extern CList playerlist; extern CPlayerInfo * lpPlayerInfo; extern CList animationlist; extern animationCallbackArgs *cb; extern CList npclist; extern CNpcInfo *lpNpcInfo; extern BOOL g_GetSameMove; extern CRITICAL_SECTION csAnimation; extern void QuitResolution(void); void __cdecl CleanupObjectsCallback( LPDIRECT3DRMOBJECT pObj, VOID* pArg ) { PathInfo* pInfo = (PathInfo*)pArg; pInfo->pChaseFrame->Release(); pInfo->pPlaneFrame->Release(); pInfo->pFlightPath->Release(); } void __cdecl MoveCameraCallback( LPDIRECT3DRMFRAME3 pCamera, VOID* pArg, D3DVALUE delta ) { PathInfo* pInfo = (PathInfo*)pArg; D3DVECTOR dir, up; D3DVECTOR dirCam, upCam; LPDIRECT3DRMFRAME3 pScene; myglobs.camera->GetScene( &pScene ); pInfo->fTime += 0.04f; pInfo->pFlightPath->SetFrame( myglobs.camera ); pInfo->pFlightPath->SetTime( pInfo->fTime ); myglobs.camera->LookAt( g_lpplayer, pScene, D3DRMCONSTRAIN_Z); pInfo->pFlightPath->SetTime( pInfo->fTime + 0.4f); pScene->Release(); } extern BOOL CreateTreeDecal(LPDIRECT3DRM3 pD3DRM,LPDIRECT3DRMFRAME3 pScene,D3DVALUE x,D3DVALUE y,D3DVALUE z); extern BOOL CreateTreeDecalAlpha(LPDIRECT3DRM3 pD3DRM,LPDIRECT3DRMFRAME3 pScene,D3DVALUE x,D3DVALUE y,D3DVALUE z); //----------------------------------------------------------------------------- //建立游戏主场景 //----------------------------------------------------------------------------- BOOL BuildScene( LPDIRECT3DRM3 pD3DRM, LPDIRECT3DRMDEVICE3 pDevice, LPDIRECT3DRMVIEWPORT2 pViewport, LPDIRECT3DRMFRAME3 pScene, LPDIRECT3DRMFRAME3 pCamera ) { CMapInfo * lpMapInfo; m_MainScreen.PrepareNewMapInfo(); LPDIRECT3DRMMESHBUILDER3 mesh_builder = NULL; LPDIRECT3DRMMESHBUILDER3 mesh_builder_base = NULL; LPDIRECT3DRMMESH mesh = NULL; LPDIRECT3DRMMESH meshbase = NULL; LPDIRECT3DRMFRAME3 frame = NULL; LPDIRECT3DRMFRAME3 baseframe = NULL; LPDIRECT3DRMFRAME3 lights = NULL; LPDIRECT3DRMLIGHT ambient = NULL; LPDIRECT3DRMLIGHT parallel = NULL; LPDIRECT3DRMFRAME3 playerframe = NULL; LPDIRECT3DRMFRAME3 chaseFrame = NULL; D3DVECTOR exitpos,lightpos; char pFloorFileName[256],pFileName[256],pFileName1[256],pFileName2[256],TagFileName[256]; int i=0,j; // 定义map的三维mesh,建议map mesh 最好不要有Scale LPTSTR lpsz,lpsz2,lpsz3,lpsz4; CString buf,buf1,buf2,buf3,buf4; j = maplist.GetCount(); lpMapInfo=maplist.GetHead(); buf4 = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString("base")+CString(".x"); lpsz4 = buf4.GetBuffer(buf4.GetLength()+1); _tcscpy(lpsz4, buf4); strcpy(pFloorFileName,g_tszPathName); strcat(pFloorFileName,lpsz4); buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString(".x"); lpsz = buf.GetBuffer(buf.GetLength()+1); _tcscpy(lpsz, buf); strcpy(pFileName,g_tszPathName); strcat(pFileName,lpsz); lpPlayerInfo = playerlist.GetHead(); strcpy(szPlayerName,lpPlayerInfo->m_sENAME); buf1 = CString("\\media\\")+lpPlayerInfo->m_sXFILENAME; lpsz = buf1.GetBuffer(buf1.GetLength()+1); strcpy(pFileName1,g_tszPathName); strcat(pFileName1,lpsz); buf2 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); lpsz2 = buf2.GetBuffer(buf2.GetLength()+1); //firstplayerfilename strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz2); buf3 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); strcpy(pFileName2,g_tszPathName); strcat(pFileName2,lpsz3); if(!modifyfile(pFileName1,lpPlayerInfo->m_sENAME)){ MSG(lstrcat(pFileName1,"Load File Error!")); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } BOOL bFindRoom = FALSE; lpPlayerInfo = playerlist.GetHead(); if(!lpPlayerInfo->m_sROOM.IsEmpty()){ for(i=1;i m_sEXIT_DBF != "") { if(!stricmp(lpMapInfo->m_sCNAME,lpPlayerInfo->m_sROOM)) { bFindRoom = TRUE; break; } } } } // 定义Player的初始位置 D3DVECTOR path = D3DVECTOR((float)lpMapInfo->m_fPOSITION_X, (float)lpMapInfo->m_fPOSITION_Y, (float)lpMapInfo->m_fPOSITION_Z); if((float)lpMapInfo->m_fPOSITION_X == 0 && (float)lpMapInfo->m_fPOSITION_Y == 0 && (float)lpMapInfo->m_fPOSITION_Z == 0){ for(i=1;i m_sENAME != lpPlayerInfo->m_sENAME){ if(lpMapInfo->m_sEXIT_DBF != ""){ path.x = (float)lpMapInfo->m_fPOSITION_X; path.y = 0.0f; path.z = (float)lpMapInfo->m_fPOSITION_Z; break; } } } } lpMapInfo = maplist.GetHead(); lpPlayerInfo->m_sROOM = lpMapInfo->m_sENAME; CTime CurrentTime=CTime::GetCurrentTime(); int iMinTime = CurrentTime.GetMinute(); if( iMinTime >= 0 && iMinTime < 10 ){ //在游戏中表示早晨6:00到8:00 lightpos.x = 50.0f; lightpos.y = 20.0f; lightpos.z = -25.0f; }else if( iMinTime >= 10 && iMinTime < 20 ){ //在游戏中表示早晨8:00到10:00 lightpos.x = 25.0f; lightpos.y = 30.0f; lightpos.z = -25.0f; }else if( iMinTime >= 20 && iMinTime < 30 ){ //在游戏中表示早晨10:00到12:00 lightpos.x = 5.0f; lightpos.y = 55.0f; lightpos.z = -25.0f; }else if( iMinTime >= 30 && iMinTime < 40 ){ //在游戏中表示早晨12:00到14:00 lightpos.x = -5.0f; lightpos.y = 55.0f; lightpos.z = -25.0f; }else if( iMinTime >= 40 && iMinTime < 50 ){ //在游戏中表示早晨14:00到16:00 lightpos.x = -25.0f; lightpos.y = 30.0f; lightpos.z = -25.0f; }else if( iMinTime >= 40 && iMinTime <= 59 ){ //在游戏中表示早晨16:00到18:00 lightpos.x = -50.0f; lightpos.y = 20.0f; lightpos.z = -25.0f; } if(FAILED(pD3DRM->CreateFrame(pScene,&lights))) goto generic_error; if(FAILED(lights->SetPosition(pScene,lightpos.x,lightpos.y,lightpos.z))) goto generic_error; if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,0.8f,0.6f,0.7f,¶llel))) goto generic_error; if(FAILED(lights->AddLight(parallel))) goto generic_error; if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,0.8f,0.8f,0.8f,&ambient))) goto generic_error; if(FAILED(pScene->AddLight(ambient))) goto generic_error; g_lights = lights; g_ambient = ambient; g_parallel = parallel; g_parallel->SetColorRGB( g_lightgammer.x,g_lightgammer.y,g_lightgammer.z); if(FAILED(pD3DRM->CreateFrame(pScene, &playerframe))) goto generic_error; if (FAILED(pD3DRM->Load(TagFileName, NULL, NULL, 0, D3DRMLOAD_FROMFILE, loadXFileCallback, (LPVOID)playerframe, loadTextures, NULL, NULL))) goto ret_with_error; cb = animationlist.GetHead(); cb->cXFileName = lpPlayerInfo->m_sENAME; cb->cCName = lpPlayerInfo->m_sCNAME; cb->cTitle = lpPlayerInfo->m_sTITLE; if(!DeleteFile(pFileName2)) goto ret_with_error; //调瓜衫pfile后删除。 if(FAILED(playerframe->SetPosition(pScene,path.x,path.y,path.z))) goto generic_error; if(FAILED(pD3DRM->CreateFrame(pScene,&chaseFrame))) goto generic_error; if(FAILED(chaseFrame->SetPosition(pScene,path.x,path.y,path.z))) goto generic_error; //建立地表 if(FAILED(pD3DRM->CreateFrame(pScene,&baseframe))) goto generic_error; if(FAILED(pD3DRM->CreateMeshBuilder(&mesh_builder_base))) goto generic_error; if(FAILED(mesh_builder_base->Load(pFloorFileName,NULL,D3DRMLOAD_FROMFILE,NULL,NULL))) goto generic_error; if(FAILED(mesh_builder_base->CreateMesh(&meshbase))) goto generic_error; if(FAILED(baseframe->AddVisual((LPDIRECT3DRMVISUAL)meshbase))) goto generic_error; if(FAILED(meshbase->GetBox(&BaseBox))) goto generic_error; #define random2(n) ((n==0)?0:(rand()%(n))) BaseCenter.x=(BaseBox.max.x-BaseBox.min.x)*(random2(3)+4)/10; BaseCenter.y=(BaseBox.max.y-BaseBox.min.y)*(random2(3)+4)/10; BaseCenter.z=(BaseBox.max.z-BaseBox.min.z)*(random2(3)+4)/10; //建立房屋 if(FAILED(pD3DRM->CreateFrame(pScene,&frame))) goto generic_error; if(FAILED(pD3DRM->CreateMeshBuilder(&mesh_builder))) goto generic_error; if(FAILED(mesh_builder->Load(pFileName,NULL,D3DRMLOAD_FROMFILE,NULL,NULL))) goto generic_error; if(FAILED(mesh_builder->CreateMesh(&mesh))) goto generic_error; if(FAILED(frame->AddVisual((LPDIRECT3DRMVISUAL)mesh))) goto generic_error; g_lpplayer = playerframe; g_pChaseFrame = chaseFrame; if(g_PlayAndCameraPos.y == -1) { pCamera->SetPosition(pScene,path.x-12.0f, path.y+ 6.5f, path.z-12.0f); }else{ pCamera->SetPosition(pScene,path.x+g_PlayAndCameraPos.x, path.y+g_PlayAndCameraPos.y, path.z+g_PlayAndCameraPos.z); } pCamera->LookAt(g_lpplayer, pScene, D3DRMCONSTRAIN_Z); pCamera->GetPosition(pScene,&g_CameraPosition); myglobs.view->SetField( g_fCamfov ); for(i=1;i m_sENAME != lpPlayerInfo->m_sENAME){ if(lpMapInfo->m_sEXIT_DBF != ""){ exitpos.x = (float)lpMapInfo->m_fPOSITION_X; exitpos.y = 0.0f; exitpos.z = (float)lpMapInfo->m_fPOSITION_Z; AddItemXFile( "\\media\\exit.x",exitpos,lpMapInfo->m_sEXIT_DBF); }else if(lpMapInfo->m_sNPC_DBF != ""){ if(lpMapInfo->m_sMAPINFO == "DEAD") continue; exitpos.x = (float)lpMapInfo->m_fPOSITION_X; exitpos.y = 0.0f; exitpos.z = (float)lpMapInfo->m_fPOSITION_Z; buf2 = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString(".x"); lpsz2 = buf2.GetBuffer(buf2.GetLength()+1); strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz2); if(!modifyfile(TagFileName,lpMapInfo->m_sENAME)){ MSG(lstrcat(TagFileName,"Load File Error!")); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } buf3 = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); strcpy(pFileName2,g_tszPathName); strcat(pFileName2,lpsz3); LoadXFile( pFileName2,exitpos,(float)lpMapInfo->m_fSCALE); cb = animationlist.GetTail(); cb->cXFileType = CString("NPC"); cb->cXFileName = lpMapInfo->m_sENAME; cb->cCName = lpMapInfo->m_sCNAME; D3DVECTOR Npcposite; int k=0; for(;k<50;k++){ //给出NPC的初始化地图位置 Npcposite = GetNextPosite(cb->frame3obj,cb); Npcposite.y=0; { g_GetSameMove=FALSE; cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); } } if(lpMapInfo->m_sMAPINFO == "DEAD"){ cb->PlayerState = DEAD; cb->time = DEAD_START; }else if(lpMapInfo->m_sMAPINFO.IsEmpty()){ if(g_GetSameMove){ cb->PlayerState= STOP; cb->time = STOP_START; cb->way = -1; } else { cb->PlayerState= LEFTGO; cb->time = LEFTGO_START; cb->nSteps = 0; cb->way = rand()%8; } } DeleteFile(pFileName2); npclist.RemoveAll(); g_GetSameMove=FALSE; }else if(lpMapInfo->m_sPLAYER_DBF != ""){ if(lpMapInfo->m_sMAPINFO == "DEAD") continue; CString PlayerName = lpMapInfo->m_sENAME; buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME; lpsz = buf.GetBuffer(buf.GetLength()+1); strcpy(pFileName,g_tszPathName); strcat(pFileName,lpsz); if(!modifyfile(pFileName,lpMapInfo->m_sENAME)){ MSG(lstrcat(TagFileName,"Load File Error!")); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); }//建立tmpfile buf = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); lpsz = buf.GetBuffer(buf.GetLength()+1); strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz); //修改maplist,增加3D模型 AddXFile(TagFileName); DeleteFile(TagFileName); cb = animationlist.GetTail(); cb->cXFileType = CString("OTHERPLAY"); cb->PlayerState= LEFTGO; cb->time = LEFTGO_START; cb->cXFileName = PlayerName; cb->cCName = lpMapInfo->m_sCNAME; cb->cTitle = lpMapInfo->m_sTITLE; // 设定其它玩家进入的位置 cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); if(lpMapInfo->m_sMAPINFO == "DEAD") { cb->PlayerState = DEAD; cb->time = DEAD_START; } } } } SAFE_RELEASE( playerframe ); SAFE_RELEASE( chaseFrame ); SAFE_RELEASE( lights ); SAFE_RELEASE( mesh_builder ); SAFE_RELEASE( mesh_builder_base ); SAFE_RELEASE( mesh ); SAFE_RELEASE( meshbase ); SAFE_RELEASE( ambient ); SAFE_RELEASE( parallel ); SAFE_RELEASE( frame ); SAFE_RELEASE( baseframe ); return TRUE; generic_error: MSG("A failure has occurred while building the scene.\n"); ret_with_error: SAFE_RELEASE( playerframe ); SAFE_RELEASE( chaseFrame ); SAFE_RELEASE( lights ); SAFE_RELEASE( mesh_builder ); SAFE_RELEASE( mesh_builder_base ); SAFE_RELEASE( mesh ); SAFE_RELEASE( meshbase ); SAFE_RELEASE( ambient ); SAFE_RELEASE( parallel ); SAFE_RELEASE( frame ); SAFE_RELEASE( baseframe ); return FALSE; } VOID OverrideDefaults( BOOL* pbNoTextures, BOOL* pbResizingDisabled, BOOL* pbConstRenderQuality, CHAR** pstrName ) { (*pbNoTextures) = TRUE; (*pbConstRenderQuality) = TRUE; (*pstrName) = "Wang-HuaKui D3DEngine"; } void __cdecl loadXFileCallback(LPDIRECT3DRMOBJECT pObj, REFIID guidObj, LPVOID pArg) { LPDIRECT3DRMVISUAL pVis; LPDIRECT3DRMFRAME3 pParent = (LPDIRECT3DRMFRAME3)pArg; LPDIRECT3DRMFRAME3 pFrame; LPDIRECT3DRMANIMATIONSET2 pAnimSet; if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame))){ pParent->AddChild(pFrame); SAFE_RELEASE(pFrame); SAFE_RELEASE(pObj); return; } if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMVisual, (LPVOID*)&pVis))){ g_lpD3DRM->CreateFrame(pParent, &pFrame); pFrame->AddVisual(pVis); SAFE_RELEASE(pFrame); SAFE_RELEASE(pVis); SAFE_RELEASE(pObj); return; } if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMAnimationSet2, (LPVOID*)&pAnimSet))){ setAnimationCallback(pParent, pAnimSet); SAFE_RELEASE(pObj); return; } OutputDebugString("Object loaded with no known D3DRM interface"); SAFE_RELEASE(pObj); return; } HRESULT __cdecl loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE3 *tex) { char *sTmpName = name; while(sTmpName[0] != '.') sTmpName ++; strcpy(sTmpName, ".bmp"); if (FAILED(g_lpD3DRM->LoadTexture(name, tex))) return -1; return 0; } BOOL setAnimationCallback(LPDIRECT3DRMFRAME3 frame, LPDIRECT3DRMANIMATIONSET2 animset) { animationCallbackArgs *cb; cb = new animationCallbackArgs; if (!cb) return FALSE; cb->frame3obj = frame; cb->animset = animset; cb->time = D3DVAL(50); EnterCriticalSection(&csAnimation); animationlist.AddTail(cb); LeaveCriticalSection(&csAnimation); if (FAILED(frame->AddMoveCallback(animationCallback, (void *) cb, D3DRMCALLBACK_PREORDER))) return FALSE; if (FAILED(frame->AddDestroyCallback(animationDestroyCallback, animset))) return FALSE; return TRUE; } HRESULT AddItemXFile(const char * filename,D3DVECTOR playerpos,CString cXfileName) { HRESULT hr; LPDIRECT3DRMFRAME3 pParent; char tmpfilename[256]; strcpy(tmpfilename,g_tszPathName); strcat(tmpfilename,filename); if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))){ MSG("Failed to create XFiles parent frame"); return(hr); } if (FAILED(hr = g_lpD3DRM->Load((LPVOID)tmpfilename, NULL, NULL, 0, D3DRMLOAD_FROMFILE, loadXFileCallback, (LPVOID)pParent, loadTextures, NULL, NULL))){ SAFE_RELEASE(pParent); MSG("Failed to load X File"); return(hr); } pParent->SetPosition( myglobs.scene, playerpos.x, playerpos.y, playerpos.z); lpExitInfo = new CExitInfo; lpExitInfo->frame3obj = pParent; lpExitInfo->cXFileName = cXfileName; lpExitInfo->posExit = playerpos; exitlist.AddTail(lpExitInfo); SAFE_RELEASE(pParent); return(D3DRM_OK); } HRESULT LoadXFile(const char *filename,D3DVECTOR playerpos,float fRotation) { HRESULT hr; LPDIRECT3DRMFRAME3 pParent; if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))){ MSG("Failed to create XFiles parent frame"); return(hr); } if (FAILED(hr = g_lpD3DRM->Load((LPVOID)filename, NULL, NULL, 0, D3DRMLOAD_FROMFILE, loadXFileCallback, (LPVOID)pParent, loadTextures, NULL, NULL))){ SAFE_RELEASE(pParent); MSG("Failed to load X File"); return(hr); } pParent->SetPosition( myglobs.scene, playerpos.x, playerpos.y, playerpos.z); pParent->AddRotation(D3DRMCOMBINE_BEFORE, 0.0f, 1.0f, 0.0f, fRotation); SAFE_RELEASE(pParent); return(D3DRM_OK); } HRESULT AddXFile(const char * filename) { CMapInfo * lpMapInfo; HRESULT hr; LPDIRECT3DRMFRAME3 pParent; if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))) return(hr); lpMapInfo = maplist.GetHead(); pParent->SetPosition( myglobs.scene, (float)lpMapInfo->m_fPOSITION_X, (float)lpMapInfo->m_fPOSITION_Y, (float)lpMapInfo->m_fPOSITION_Z ); if (FAILED(hr = g_lpD3DRM->Load((LPVOID)filename, NULL, NULL, 0, D3DRMLOAD_FROMFILE, loadXFileCallback, (LPVOID)pParent, loadTextures, NULL, NULL))){ SAFE_RELEASE(pParent); return(hr); } SAFE_RELEASE(pParent); return(D3DRM_OK); } BOOL modifyfile(char * FileName, CString sTagName) { LPTSTR lpsz; CString buf; FILE *fp; FILE *out; char string[255],str[255],TagFileName[256]; char *ptr,*p1; buf = CString("\\media\\")+sTagName+CString(".x"); lpsz = buf.GetBuffer(buf.GetLength()+1); strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz); fp=fopen(FileName,"rt"); if(!fp)return FALSE; out=fopen(TagFileName,"wt"); while(!feof(fp)){ fgets(string,255,fp); ptr=strstr(string,"pmud"); if(ptr!=NULL){ p1=ptr+strlen("pmud"); strcpy(str,p1); *ptr='\0'; strcat(string,sTagName); strcat(string,str); } fputs(string, out); } fclose(fp); fclose(out); return TRUE; } void SetCammerPos(int cammerpos) { D3DVECTOR playerpos,currentpos; g_lpplayer->GetPosition(myglobs.scene, &playerpos); myglobs.camera->GetPosition(myglobs.scene, ¤tpos); currentpos.x = playerpos.x-(float)(17.0f*cos(3.141592f*cammerpos/60.0f)); currentpos.z = playerpos.z-(float)(17.0f*sin(3.141592f*cammerpos/60.0f)); myglobs.camera->SetPosition(myglobs.scene, currentpos.x, currentpos.y, currentpos.z); myglobs.camera->LookAt(g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Z); myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); } //服务器发来某用户进入同一地图 void SomejoinMap(char * JoinMapMsg) { CMapInfo *lpMapInfo; CStringList strls; char *ps; CString parm = CString("\t"); CString strtmp; //开始分解mapdata ps=strtok(JoinMapMsg,(const char*)parm); strls.AddTail(ps); for(;;){ ps=strtok(NULL,(const char*)parm); if(ps==NULL)break; strls.AddTail(ps); } if( strls.GetCount() < 5 ) {//收到错误的加入指令 strls.RemoveAll(); return; } EnterCriticalSection(&csMaplist); if(maplist.IsEmpty()) { LeaveCriticalSection(&csMaplist); return; } lpMapInfo = maplist.GetHead(); strtmp = strls.GetHead(); int i,j; BOOL bFindInMapAlready = FALSE; if(strtmp == lpMapInfo->m_sENAME && lpMapInfo->m_sENAME != szPlayerName) {//同在一张地图 j = maplist.GetCount(); for(i=0;i m_sENAME == strls.GetAt( strls.FindIndex(2))){ bFindInMapAlready = TRUE; break; } } if(!bFindInMapAlready){ lpMapInfo = new CMapInfo; strtmp = strls.GetAt( strls.FindIndex(1)); lpMapInfo->m_sCNAME = strtmp; strtmp = strls.GetAt( strls.FindIndex(2)); lpMapInfo->m_sENAME = strtmp; strtmp = strls.GetAt( strls.FindIndex(3)); lpMapInfo->m_sTITLE = strtmp; strtmp = strls.GetAt( strls.FindIndex(4)); lpMapInfo->m_sPLAYER_DBF = strtmp;//门派 strtmp = strls.GetAt( strls.FindIndex(5)); lpMapInfo->m_sXFILENAME = strtmp; strtmp = strls.GetAt( strls.FindIndex(6)); lpMapInfo->szPlayerIP = strtmp; maplist.AddTail(lpMapInfo); } }else{ strls.RemoveAll(); LeaveCriticalSection(&csMaplist);//如果假设不在一张地图,也不能影响我。 return; } strls.RemoveAll(); LeaveCriticalSection(&csMaplist); if(bFindInMapAlready) return; CString buf; char pFileName[128]; char TagFileName[128]; LPTSTR lpsz; buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME; lpsz = buf.GetBuffer(buf.GetLength()+1); strcpy(pFileName,g_tszPathName); strcat(pFileName,lpsz); if(!modifyfile(pFileName,lpMapInfo->m_sENAME)) return; buf = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); lpsz = buf.GetBuffer(buf.GetLength()+1); strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz); //修改maplist,增加3D模型 AddXFile(TagFileName); DeleteFile(TagFileName); //此处不正确,当二个人物进入MAP时,不能够判断先发而后至的情况。 EnterCriticalSection(&csAnimation); cb = animationlist.GetTail(); cb->cXFileType = CString("OTHERPLAY"); cb->PlayerState= LEFTGO; cb->cXFileName = lpMapInfo->m_sENAME; cb->cCName = lpMapInfo->m_sCNAME; cb->cTitle = lpMapInfo->m_sTITLE; // 设定其它玩家进入的位置 cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); LeaveCriticalSection(&csAnimation); } void SomeQuitMap(char * ExitMapMsg,char *szExitName,bool bEscape) { CMapInfo *lpMapInfo; CStringList strls; char *ps; CString parm = CString("\t"); CString strtmp; LPDIRECT3DRMFRAME3 parent, frame; CString sWhoCName; //开始分解mapdata ps=strtok(ExitMapMsg,(const char*)parm); strls.AddTail(ps); for(;;) { ps=strtok(NULL,(const char*)parm); if(ps==NULL)break; strls.AddTail(ps); } EnterCriticalSection(&csMaplist); lpMapInfo = maplist.GetHead(); strtmp = strls.GetHead(); strls.RemoveAll(); int i,j; BOOL bFindInMapAlready = FALSE; j = maplist.GetCount(); for(i=0;i m_sENAME == strtmp) { sWhoCName = lpMapInfo->m_sCNAME; bFindInMapAlready = TRUE; maplist.RemoveAt(maplist.FindIndex(i)); delete lpMapInfo; break; } } LeaveCriticalSection(&csMaplist); if(!bFindInMapAlready) return; // guanhua 2000/10/02 start if(bEscape == FALSE) { // guanhua 2000/10/02 end // Spock start char sResult[256]; if (strcmp(szExitName, "EXIT")) sprintf(sResult,"%s(180,0,0)%s朝(%s)走去",szNewColor,sWhoCName,szExitName); else sprintf(sResult,"%s(180,0,0)%s离线",szNewColor,sWhoCName); // CString sResult = CString(szNewColor) + "(150,0,0)" + sWhoCName + "朝(" + szExitName + ")走去"; // Spock end SendShowMsg(sResult); // guanhua 2000/10/02 start } // guanhua 2000/10/02 end bFindInMapAlready = FALSE; POSITION tmpPosite; D3DVECTOR exitpos; j = animationlist.GetCount(); for(i=0;i cXFileName)) { tmpPosite = animationlist.FindIndex(i); bFindInMapAlready = TRUE; frame = cb->frame3obj; break; } } if(!bFindInMapAlready) { // LeaveCriticalSection(&csAnimation); return; } for(i=0;i cXFileName)) { cb->frame3obj->GetPosition(myglobs.scene, &exitpos); frame->SetPosition(myglobs.scene,exitpos.x, exitpos.y, exitpos.z); // DelayTime(500); Sleep(500); break; } } EnterCriticalSection(&csAnimation); cb = animationlist.GetAt(tmpPosite); if(!cb->pathlist.IsEmpty()) cb->pathlist.RemoveAll(); animationlist.RemoveAt(tmpPosite); delete cb; LeaveCriticalSection(&csAnimation); frame->DeleteMoveCallback(animationCallback, (void *) cb); frame->GetParent(&parent); parent->DeleteChild(frame); parent->Release(); } extern HRESULT AVITextureQuit(void); void DoPlayerDead() { /* CPlayerInfo * lpPlayerInfo; TFightTag *lpFightTag,*lpOppFightTag; int i,j; EnterCriticalSection(&csAnimation); lpPlayerInfo = playerlist.GetHead(); animationCallbackArgs *selfcb ,*cb,*tmpcb; g_playerState = DEAD; selfcb = animationlist.GetHead(); selfcb->time = DEAD_START; j = selfcb->fightopplist.GetCount(); for(i=0;i fightopplist.GetAt(selfcb->fightopplist.FindIndex(i)); cb = animationlist.GetAt(lpFightTag->tagPosite); int m,n; n = cb->fightopplist.GetCount(); for(m=0;m fightopplist.GetAt(cb->fightopplist.FindIndex(m)); tmpcb = animationlist.GetAt(lpOppFightTag->tagPosite); if(selfcb->cXFileName == tmpcb->cXFileName) { cb->PlayerState = STOP; cb->time = STOP_START; delete lpFightTag; cb->fightopplist.RemoveAt(cb->fightopplist.FindIndex(m)); D3DVECTOR tagPos; cb->frame3obj->GetPosition(myglobs.scene, &tagPos); tagPos.y -= 1.5f; cb->frame3obj->SetPosition(myglobs.scene, tagPos.x,tagPos.y,tagPos.z); break; } } } selfcb->fightopplist.RemoveAll(); LeaveCriticalSection(&csAnimation); myglobs.camera->LookAt( g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Y); */ maplist.RemoveAll(); ReleaseD3DScreen(); EnterCriticalSection(&csAnimation); animationlist.RemoveAll(); LeaveCriticalSection(&csAnimation); exitlist.RemoveAll(); // AVITextureQuit(); CreateNewScreen(); m_MainScreen.PrepareNewMapInfo(); char pFileName1[256], pFileName2[256], TagFileName[256]; // 定义map的三维mesh,建议map mesh 最好不要有Scale LPTSTR lpsz,lpsz2,lpsz3; CString buf,buf1,buf2,buf3,buf4; lpPlayerInfo = playerlist.GetHead(); strcpy(szPlayerName,lpPlayerInfo->m_sENAME); buf1 = CString("\\media\\")+lpPlayerInfo->m_sXFILENAME; lpsz = buf1.GetBuffer(buf1.GetLength()+1); strcpy(pFileName1,g_tszPathName); strcat(pFileName1,lpsz); buf2 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); lpsz2 = buf2.GetBuffer(buf2.GetLength()+1); //firstplayerfilename strcpy(TagFileName,g_tszPathName); strcat(TagFileName,lpsz2); buf3 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); strcpy(pFileName2,g_tszPathName); strcat(pFileName2,lpsz3); if(!modifyfile(pFileName1,lpPlayerInfo->m_sENAME)) { MSG(lstrcat(pFileName1,"Load File Error!")); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); }//建立tmpfile。 LPDIRECT3DRMFRAME3 frame = NULL; LPDIRECT3DRMFRAME3 lights = NULL; LPDIRECT3DRMLIGHT ambient = NULL; LPDIRECT3DRMLIGHT parallel = NULL; LPDIRECT3DRMFRAME3 playerframe = NULL; LPDIRECT3DRMFRAME3 chaseFrame = NULL; D3DVECTOR path = D3DVECTOR(0.0f,0.0f,0.0f); D3DVECTOR lightpos; CTime CurrentTime=CTime::GetCurrentTime(); int iMinTime = CurrentTime.GetMinute(); if( iMinTime >= 0 && iMinTime < 10 ) { //在游戏中表示早晨6:00到8:00 lightpos.x = 50.0f; lightpos.y = 20.0f; lightpos.z = -25.0f; } else if( iMinTime >= 10 && iMinTime < 20 ) { //在游戏中表示早晨8:00到10:00 lightpos.x = 25.0f; lightpos.y = 30.0f; lightpos.z = -25.0f; } else if( iMinTime >= 20 && iMinTime < 30 ) { //在游戏中表示早晨10:00到12:00 lightpos.x = 5.0f; lightpos.y = 55.0f; lightpos.z = -25.0f; } else if( iMinTime >= 30 && iMinTime < 40 ) { //在游戏中表示早晨12:00到14:00 lightpos.x = -5.0f; lightpos.y = 55.0f; lightpos.z = -25.0f; } else if( iMinTime >= 40 && iMinTime < 50 ) { //在游戏中表示早晨14:00到16:00 lightpos.x = -25.0f; lightpos.y = 30.0f; lightpos.z = -25.0f; } else if( iMinTime >= 40 && iMinTime <= 59 ) { //在游戏中表示早晨16:00到18:00 lightpos.x = -50.0f; lightpos.y = 20.0f; lightpos.z = -25.0f; } // initialize the lights in the scene if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene,&lights))) goto generic_error; if(FAILED(lights->SetPosition(myglobs.scene,lightpos.x,lightpos.y,lightpos.z))) goto generic_error; if(FAILED(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,0.8f,0.6f,0.7f,¶llel))) goto generic_error; if(FAILED(lights->AddLight(parallel))) goto generic_error; if(FAILED(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,0.8f,0.8f,0.8f,&ambient))) goto generic_error; if(FAILED(myglobs.scene->AddLight(ambient))) goto generic_error; g_lights = lights; g_ambient = ambient; g_parallel = parallel; if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene, &playerframe))) goto generic_error; if (FAILED(g_lpD3DRM->Load(TagFileName, NULL, NULL, 0, D3DRMLOAD_FROMFILE, loadXFileCallback, (LPVOID)playerframe, loadTextures, NULL, NULL))) goto ret_with_error; if(!DeleteFile(pFileName2)) goto ret_with_error; //调瓜衫pfile后删除。 if(FAILED(playerframe->SetPosition(myglobs.scene,path.x,path.y,path.z))) goto generic_error; if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene,&chaseFrame))) goto generic_error; if(FAILED(chaseFrame->SetPosition(myglobs.scene,path.x,path.y,path.z))) goto generic_error; g_lpplayer = playerframe; g_pChaseFrame = chaseFrame; if(g_PlayAndCameraPos.y == -1){ myglobs.camera->SetPosition(myglobs.scene,path.x-15.0f, path.y+ 8.5f, path.z-15.0f); }else{ myglobs.camera->SetPosition(myglobs.scene,path.x+g_PlayAndCameraPos.x, path.y+g_PlayAndCameraPos.y, path.z+g_PlayAndCameraPos.z); } myglobs.camera->LookAt(g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Z); myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); myglobs.view->SetField( 0.3f ); EnterCriticalSection(&csAnimation); cb = animationlist.GetHead(); g_playerState = DEAD; cb->cCName = lpPlayerInfo->m_sCNAME; cb->cTitle = lpPlayerInfo->m_sTITLE; cb->time = DEAD_START; LeaveCriticalSection(&csAnimation); SAFE_RELEASE( playerframe ); SAFE_RELEASE( chaseFrame ); SAFE_RELEASE( lights ); SAFE_RELEASE( ambient ); SAFE_RELEASE( parallel ); SAFE_RELEASE( frame ); return; generic_error: MSG("A failure has occurred while building the scene.\n"); ret_with_error: SAFE_RELEASE( playerframe ); SAFE_RELEASE( chaseFrame ); SAFE_RELEASE( lights ); SAFE_RELEASE( ambient ); SAFE_RELEASE( parallel ); SAFE_RELEASE( frame ); return; }