www.pudn.com > 3D_OnlineGame_Humen.rar > FacePlate.cpp
//----------------------------------------------------------- // // Function 應用程序中的面板surface // 主要是裝入各類型的圖片文件等等 // //----------------------------------------------------------- #include "stdafx.h" #include "XMudClient.h" #include "FacePlate.h" #include "Unpackfile.h" #include "StartGameMenu.h" #include "MenuLoadOldPlay.h" #include "MenuCreateNew.h" #include "MainScreen.h" #include "InitInternet.h" #include "MyMusic.h" #include#include "MyDInput.h" //add header file #include "wgs\common.h" #include "wgs\WGS.h" //end #define _MAX(a,b) ((a>b)?a:b); extern rmfullglobals myglobs; extern D3DAppInfo* d3dapp; extern char g_tszPathName[256]; extern int g_nGameState; extern CStringList g_strlistMesssage; extern CStringList g_strlistSelfMsg; extern CMainScreen m_MainScreen; extern CStartGameMenu m_StartGameMenu; extern CMenuLoadOldPlay m_MenuLoadOldPlay; extern CMenuCreateNew m_MenuCreateNew; extern HFONT g_MessagehFont; extern HFONT g_MessagehFont1; extern HFONT g_MessagehFont2; extern CMainScreen m_MainScreen; extern int nSpareTime; //剩下的時間(單位:秒) extern int nRecTimes; //收到的信息次數 extern void QuitResolution(void); BITMAP tmpbmp; BITMAPINFOHEADER m_infohead; void Free2DSurfaces() { if( myglobs.g_lpDDSGameMenu != NULL){ myglobs.g_lpDDSGameMenu->Release(); myglobs.g_lpDDSGameMenu = NULL; } if( myglobs.g_lpDDSMainFace != NULL ){ myglobs.g_lpDDSMainFace->Release(); myglobs.g_lpDDSMainFace = NULL; } if(myglobs.g_lpDDSWGS != NULL){ myglobs.g_lpDDSWGS->Release(); myglobs.g_lpDDSWGS=NULL; } if(myglobs.g_lpDDSSelectServer != NULL){ myglobs.g_lpDDSSelectServer->Release(); myglobs.g_lpDDSSelectServer=NULL; } } HRESULT Create2DSurfaces(LPDIRECTDRAW lpdd4) { if( lpdd4 == NULL ) return E_FAIL; char szMainFaceBar[256]; lstrcpy( szMainFaceBar, "Splash.bmp" ); myglobs.g_lpDDSMainFace = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); if( NULL != myglobs.g_lpDDSMainFace ) DDSetColorKey(myglobs.g_lpDDSMainFace, RGB(0,255,0)); else return E_FAIL; lstrcpy( szMainFaceBar, "Start.bmp" ); myglobs.g_lpDDSGameMenu = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); if( NULL != myglobs.g_lpDDSGameMenu ) DDSetColorKey(myglobs.g_lpDDSGameMenu, RGB(0,255,0)); else return E_FAIL; lstrcpy( szMainFaceBar, "WGS.bmp" ); myglobs.g_lpDDSWGS = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); if( NULL != myglobs.g_lpDDSWGS ) DDSetColorKey(myglobs.g_lpDDSWGS, RGB(0,255,0)); else return E_FAIL; lstrcpy( szMainFaceBar, "Select.bmp" ); myglobs.g_lpDDSSelectServer = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); if( NULL != myglobs.g_lpDDSSelectServer ) DDSetColorKey(myglobs.g_lpDDSSelectServer, RGB(0,255,0)); else return E_FAIL; return S_OK; } //----------------------------------------------------------------------------- // Name: DDSetColorKey() // Desc: Set a color key for a surface, given a RGB. // If you pass CLR_INVALID as the color key, the pixel // in the upper-left corner will be used. //----------------------------------------------------------------------------- HRESULT DDSetColorKey(IDirectDrawSurface * pdds, COLORREF rgb) { DDCOLORKEY ddck; ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb); ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue; return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck); } DWORD DDColorMatch(IDirectDrawSurface * pdds, COLORREF rgb) { COLORREF rgbT; HDC hdc; DWORD dw = CLR_INVALID; DDSURFACEDESC ddsd; HRESULT hres; if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK){ rgbT = GetPixel(hdc, 0, 0); SetPixel(hdc, 0, 0, rgb); pdds->ReleaseDC(hdc); } ddsd.dwSize = sizeof(ddsd); while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING); if (hres == DD_OK){ dw = *(DWORD *) ddsd.lpSurface; if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32){ dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; } pdds->Unlock(NULL); } if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK){ SetPixel(hdc, 0, 0, rgbT); pdds->ReleaseDC(hdc); } return dw; } HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy) { HDC hdcImage; HDC hdc; BITMAP bm; DDSURFACEDESC ddsd; HRESULT hr; if (hbm == NULL || pdds == NULL) return E_FAIL; pdds->Restore(); hdcImage = CreateCompatibleDC(NULL); if (!hdcImage) OutputDebugString(TEXT("createcompatible dc failed\n")); SelectObject(hdcImage, hbm); GetObject(hbm, sizeof(bm), &bm); dx = dx == 0 ? bm.bmWidth : dx; dy = dy == 0 ? bm.bmHeight : dy; ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; pdds->GetSurfaceDesc(&ddsd); if ((hr = pdds->GetDC(&hdc)) == DD_OK){ StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY); pdds->ReleaseDC(hdc); } delete [] tmpbmp.bmBits; DeleteDC(hdcImage); return hr; } IDirectDrawSurface *DDLoadBitmap(IDirectDraw *pdd, LPCTSTR tszBitmap, int dx, int dy) { HBITMAP hbm; BITMAP bm; DDSURFACEDESC ddsd; IDirectDrawSurface *pdds; char cTempBmp[256]; lstrcpy( cTempBmp,g_tszPathName); lstrcat( cTempBmp, "\\bmpdata\\" ); lstrcat( cTempBmp, tszBitmap ); hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), cTempBmp, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); if (hbm == NULL) hbm = (HBITMAP)LoadImage(NULL, cTempBmp, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_MONOCHROME); if (hbm == NULL){ CString cBmpFilename; UNPACKALL m_UnpackFile; char cTempBmp[256]; lstrcpy( cTempBmp, g_tszPathName ); lstrcat( cTempBmp, "\\bmpdata\\PicFile" ); cBmpFilename = m_UnpackFile.GetFile( cTempBmp,tszBitmap); if(cBmpFilename.IsEmpty()) return NULL; hbm = (HBITMAP)LoadImage(0,cBmpFilename,IMAGE_BITMAP,dx, dy,LR_LOADFROMFILE); if( hbm == NULL) return NULL; DeleteFile(cBmpFilename); } GetObject(hbm, sizeof(bm), &bm); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = bm.bmWidth; ddsd.dwHeight = bm.bmHeight; if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK) return NULL; DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); DeleteObject(hbm); return pdds; } void DDReLoadBitmap(IDirectDrawSurface *pdds, LPCTSTR tszBitmap, int dx, int dy) { HBITMAP hbm; BITMAP bm; char cTempBmp[256]; lstrcpy( cTempBmp,g_tszPathName); lstrcat( cTempBmp, "\\bmpdata\\" ); lstrcat( cTempBmp, tszBitmap ); hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), cTempBmp, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); if (hbm == NULL) hbm = (HBITMAP)LoadImage(NULL, cTempBmp, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_MONOCHROME); if (hbm == NULL){ CString cBmpFilename; UNPACKALL m_UnpackFile; char cTempBmp[256]; lstrcpy( cTempBmp, g_tszPathName ); lstrcat( cTempBmp, "\\bmpdata\\PicFile" ); cBmpFilename = m_UnpackFile.GetFile( cTempBmp,tszBitmap); if(cBmpFilename.IsEmpty()) return; hbm = (HBITMAP)LoadImage(0,cBmpFilename,IMAGE_BITMAP,dx, dy,LR_LOADFROMFILE); if( hbm == NULL) return; DeleteFile(cBmpFilename); } GetObject(hbm, sizeof(bm), &bm); DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); DeleteObject(hbm); } BOOL LoadBitmapInfo(LPCTSTR fName, BITMAP &bmp) { CFile cf; if(!cf.Open( fName, CFile::modeRead )){ TRACE("Bmp file open error."); return NULL; } BITMAPFILEHEADER m_filehead; cf.Read( &m_filehead, sizeof(BITMAPFILEHEADER) ); cf.Read( &m_infohead, sizeof(BITMAPINFOHEADER) ); if(m_filehead.bfType != 0x4d42 ){ TRACE("This isn't a bmp files."); return FALSE; } if(m_filehead.bfSize != cf.GetLength() ){ TRACE("Bmp file data error."); return FALSE; } char * m_buf; m_buf = (char *) new char[ m_infohead.biSizeImage ]; if( m_buf == NULL ) return NULL; cf.Seek( m_filehead.bfOffBits, CFile::begin ); cf.Read( m_buf, m_infohead.biSizeImage ); bmp.bmBits = m_buf; bmp.bmBitsPixel = m_infohead.biBitCount; bmp.bmHeight = m_infohead.biHeight; bmp.bmPlanes = m_infohead.biPlanes; bmp.bmType = 0; bmp.bmWidth = m_infohead.biWidth; bmp.bmWidthBytes = (m_infohead.biWidth+3)&~3; return TRUE; } void MyGetTextExtentPoint32(char *string,long len,SIZE *Size,BOOL bFlag) { HDC hDC; HRESULT ddrval; ddrval=d3dapp->lpBackBuffer->GetDC(&hDC); if(bFlag) SelectObject(hDC, g_MessagehFont2); GetTextExtentPoint32(hDC,string,len,Size); d3dapp->lpBackBuffer->ReleaseDC(hDC); } void DrawGameString(char *string,LPRECT lpRect,UINT uFormat ,COLORREF TextColor,COLORREF BkColor,BOOL bFlag) { HDC hdc; HRESULT ddrval; ddrval=d3dapp->lpBackBuffer->GetDC(&hdc); if(bFlag) SelectObject(hdc, g_MessagehFont2); SetTextColor(hdc,TextColor); if(BkColor == RGB(0,0,0)) SetBkMode(hdc,TRANSPARENT); else SetBkColor(hdc,BkColor); DrawText(hdc,string,strlen(string),lpRect,uFormat); d3dapp->lpBackBuffer->ReleaseDC(hdc); } void DrawInterLace() { HDC hdc; HRESULT ddrval; int i; while( TRUE ){ ddrval =d3dapp->lpBackBuffer->GetDC(&hdc); if( ddrval == DD_OK ){ SetTextColor(hdc,RGB(0,0,0)); for(i=0;i<600;i++){ i++; MoveToEx(hdc,0,i,NULL); LineTo(hdc,800,i); } d3dapp->lpBackBuffer->ReleaseDC(hdc); return; } if( ddrval == DDERR_SURFACELOST ){ if( !RestoreSurfaces() ) return; } if( ddrval != DDERR_WASSTILLDRAWING ) return; } } void DrawProgress(BOOL bLogon) { #define PROGRESS_BAR_WIDTH 460 HDC hdc; HRESULT ddrval; static CTime LastTime = CTime::GetCurrentTime(); static BOOL bSplash = FALSE; char szBuffer[128]; COLORREF tmpColor; RECT rcTmp; int nPercent; nPercent = (nRecTimes+1) * PROGRESS_BAR_WIDTH / (bLogon? 13 : 6 ); if(nPercent > PROGRESS_BAR_WIDTH) nPercent = PROGRESS_BAR_WIDTH; bSplash = !bSplash; tmpColor = bSplash? RGB(255,0,0) : RGB(255,255,0) ; CTime CurrentTime = CTime::GetCurrentTime(); if( (CurrentTime - LastTime) > 1L){ LastTime = CurrentTime; nSpareTime --; if(nSpareTime < 1){ CPmudNet_End(); Msg("與此伺服器連接速度太慢,請選擇其他連接/n伺服器"); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } } if( bLogon ) wsprintf(szBuffer,"正在簽到請稍候......(%d)秒", nSpareTime); else wsprintf(szBuffer,"正在接收地圖數據......(%d)秒", nSpareTime); int x,y; x = 155; y = 425; if( bLogon ){ SetRect(&rcTmp,240-224,795-377,720-224,895-377); bltObject(x,y, myglobs.g_lpDDSGameMenu, &rcTmp, DDBLTFAST_SRCCOLORKEY); }else{ SetRect(&rcTmp, 26, 205, 26+120, 205+100 ); bltObject(x,y, myglobs.g_lpDDSGameMenu, &rcTmp, DDBLTFAST_SRCCOLORKEY); bltObject(x+120, y, myglobs.g_lpDDSGameMenu, &rcTmp, DDBLTFAST_SRCCOLORKEY); bltObject(x+240, y, myglobs.g_lpDDSGameMenu, &rcTmp, DDBLTFAST_SRCCOLORKEY); bltObject(x+360, y, myglobs.g_lpDDSGameMenu, &rcTmp, DDBLTFAST_SRCCOLORKEY); } SetRect(&rcTmp, x+120, y+65, x+360, y+85); DrawGameString(szBuffer ,&rcTmp ,DT_LEFT | DT_VCENTER ,tmpColor ,RGB(0,0,0),FALSE); while( TRUE ){ ddrval = d3dapp->lpBackBuffer->GetDC(&hdc); if( ddrval == DD_OK ){ CDC * pDC; pDC = CDC::FromHandle(hdc); SetRect(&rcTmp, x+10, y+10, x+470, y+50); FillRect(hdc,&rcTmp, (HBRUSH)GetStockObject(BLACK_BRUSH)); SetRect(&rcTmp, x, y, x+480, y+100); pDC->Draw3dRect(&rcTmp, RGB(200,100,50), RGB(90,30,20) ); SetRect(&rcTmp, x+1, y+1, x+479, y+99); pDC->Draw3dRect(&rcTmp, RGB(150,80,50), RGB(120,60,30) ); static BOOL bFirstIn = TRUE; static int LastHeight[PROGRESS_BAR_WIDTH]; static int inTimes = 2; int i,j,g,b; x += 10; y += 50; if( bFirstIn ){ bFirstIn = FALSE; LastHeight[0] = 10; for(i=1; i 35 ) LastHeight[i] = 35; } } inTimes--; if( inTimes < 0 ) inTimes = 919; LastHeight[(inTimes>>1)] = LastHeight[((inTimes>>1)+1)%PROGRESS_BAR_WIDTH] + rand()%5 - 2; if(LastHeight[inTimes>>1] < 0) LastHeight[inTimes>>1] = 0; else if( LastHeight[inTimes>>1] > 35 ) LastHeight[inTimes>>1] = 35; register int n; n = LastHeight[inTimes>>1] + rand()%5; for(j=0; j >2) - j) / n; }else{ g = 1020 * (n - j ) / n / 3; b = 0; } SetPixelV(hdc, x, y, RGB(255, g, b)); } y += n; x++; for(i=1;i >1))%PROGRESS_BAR_WIDTH; j = (n-1+PROGRESS_BAR_WIDTH)%PROGRESS_BAR_WIDTH; g = 5 - abs(LastHeight[n] - LastHeight[j]); LastHeight[n] = _MAX(LastHeight[n], LastHeight[j]); LastHeight[n] += rand()%g - 2; n = LastHeight[n] + rand()%5; if( i < nPercent ){ y = 475; for(j=0; j >2) - j) / n; }else{ g = 1020 * (n - j ) / n / 3; b = 0; } SetPixelV(hdc, x, y, RGB(255, g, b)); } x++; } } d3dapp->lpBackBuffer->ReleaseDC(hdc); return; } if( ddrval == DDERR_SURFACELOST ){ if( !RestoreSurfaces() ) return; } if( ddrval != DDERR_WASSTILLDRAWING ) return; } } HRESULT getObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ) { HRESULT ddrval; while(TRUE){ ddrval=surf->BltFast(x,y,d3dapp->lpBackBuffer,src,flags); if(ddrval==DD_OK) break; if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) break; if(ddrval!=DDERR_WASSTILLDRAWING) break; } return ddrval; } HRESULT bltObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ) { HRESULT ddrval; while(TRUE){ ddrval=d3dapp->lpBackBuffer->BltFast(x,y,surf,src,flags); if(ddrval==DD_OK) break; if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) break; if(ddrval!=DDERR_WASSTILLDRAWING) break; } return ddrval; } void ReleaseD3DScreen() { LPDIRECT3DRMFRAMEARRAY frames; int i,fnum; myglobs.scene->GetChildren(&frames); fnum=frames->GetSize(); //0 ~ getsize()-1 for(i=1; i GetElement( fnum-i, &subframe); subframe->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); myglobs.scene->DeleteChild(pFrame3); subframe->Release(); pFrame3->Release(); } frames->Release(); } HRESULT bltButtonObject( LPRECT rctar, LPRECT src, LPDIRECTDRAWSURFACE surf, DWORD flags ) { HRESULT ddrval; int x,y; x = rctar->left; y = rctar->top; while(TRUE){ ddrval=d3dapp->lpBackBuffer->BltFast(x,y,surf,src,flags); if(ddrval==DD_OK ) return ddrval; if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) return ddrval; if(ddrval!=DDERR_WASSTILLDRAWING) return ddrval; } return ddrval; } void bltScore( char *num, int x, int y ,LPRECT src,LPDIRECTDRAWSURFACE surf) { char *c; int i; RECT tmpsrc; tmpsrc.top = src->top; tmpsrc.bottom = src->bottom; tmpsrc.right = src->right; for(c=num; *c != '\0'; c++){ tmpsrc.left = src->left; i = *c - '0'; tmpsrc.left += i*12; tmpsrc.right = tmpsrc.left + 12; tmpsrc.bottom = tmpsrc.top + 18; bltObject( x, y, surf, &tmpsrc, DDBLTFAST_SRCCOLORKEY ); x += 13; } } void ShowErrorMsg(char *szErrorMsg) { HDC hdc; HRESULT ddrval; RECT rcRect = {191,334,392,350}; while( TRUE ){ ddrval =d3dapp->lpBackBuffer->GetDC(&hdc); SelectObject(hdc, g_MessagehFont); if( ddrval == DD_OK ){ SetTextColor(hdc,RGB(255,255,0)); SetBkMode( hdc, TRANSPARENT ); DrawText(hdc,szErrorMsg,-1,&rcRect,DT_LEFT | DT_VCENTER); d3dapp->lpBackBuffer->ReleaseDC(hdc); return; } if( ddrval == DDERR_SURFACELOST ){ if( !RestoreSurfaces() ) return; } if( ddrval != DDERR_WASSTILLDRAWING ) return; } } HRESULT Draw2DSurFaces( ) { HRESULT hr; if(myglobs.g_lpDDSGameMenu){ switch(g_nGameState){ case GAME_SETUP: hr = m_StartGameMenu.Draw2DSetup(); break; case GAME_LOADPLAYER: hr = m_MenuLoadOldPlay.Draw2DSetup(); break; case GAME_CREATEPLAYER: hr = m_MenuCreateNew.Draw2DSetup(); break; case GAME_MAIN: case GAME_WAIT: hr = m_MainScreen.Draw2DMainScreen(); break; case GAME_CHANGEMAP: hr = m_MainScreen.DrawChangeMapScreen(); break; case GAME_SERVER: hr=wgs.ShowWGS(d3dapp->lpBackBuffer,myglobs.g_lpDDSWGS); break; default: break; } } return hr; }