動畫程式編寫——DirectDraw之旅(3)(轉)
動畫程式編寫——DirectDraw之旅(3)(轉)[@more@] 屬於Win32程式的基本框架的我們用藍色標出,而用紅色表出的是我們要重點學習的。下面的所有程式都是 FullScreenMode.cpp 檔案中的內容,其中“IDB_DIRECTX”和“IDB_WinXP”都是圖片資源的ID號,我想如何向程式中新增資源應該不用我多說了吧:) 工程檔案:FullScreenMode.cpp #define STRICT #include #include #include #include "resource.h" #include "ddutil.h" //定義刪除指標和釋放物件的宏 #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } #define SCREEN_WIDTH 1024 //定義螢幕寬度 #define SCREEN_HEIGHT 768 //定義螢幕高度 #define SCREEN_BPP 8 //定義調色盤位數 #define SPRITE_DIAMETER 32 //定義飄動的子畫面 的直徑(寬度和高度一樣) #define NUM_SPRITES 10 //定義飄動的子畫面 的個數 #define HELPTEXT TEXT("Press Escape to quit.") //定義文字住表面 上面出現的這個 TEXT( ) 是一個系統標頭檔案裡定義的宏,起作用是檢查程式中是否定義了 Unicode ,如果有,就將括號中的文字轉化成寬自負,如果沒有,則轉化成ASCLL 碼。以下定義的是子畫面飄動時的屬性: struct SPRITE_STRUCT { FLOAT fPosX; //sprite當前座標的x值,如果在初始化時,即為初始座標x值 FLOAT fPosY; //sprite當前座標的y值,如果在初始化時,即為初始座標y值 FLOAT fVelX; //sprite在x軸上的速度 FLOAT fVelY; //sprite在y軸上的速度 }; CDisplay* g_pDisplay = NULL; /*CDisplay就是ddutil.h(我們又新加入的目錄中的)中定義的類,用於處理表面之間的複製翻頁等操作的類,再次定義一個全域性變數,用於以後對指向的表面之間進行操作*/ CSurface* g_pBackSurface = NULL; /* CSurface也是ddutil.h標頭檔案中定義的類,用於對錶面本身進行操作,如設定色彩鍵碼,在此定義的是背景圖畫指標*/ CSurface* g_pLogoSurface = NULL; /*子畫面圖畫指標*/ CSurface* g_pTextSurface = NULL; /*背景文字指標*/ BOOL g_bActive = FALSE; /*定義一個bool形變數,起到一個開關的作用,對程式流程進行控制*/ DWORD g_dwLastTick; /*用於記錄最後一次的系統時間*/ SPRITE_STRUCT g_Sprite[NUM_SPRITES]; /*定義多個子畫面,其中包括多個 運動時的屬性*/ Function-prototypes LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );//主視窗訊息處理函式 HRESULT WinInit( HINSTANCE hInst, int nCmdShow, HWND* phWnd, HACCEL* phAccel );//視窗類設定,註冊,並建立視窗 HRESULT InitDirectDraw( HWND hWnd ); VOID FreeDirectDraw(); HRESULT ProcessNextFrame(); VOID UpdateSprite( SPRITE_STRUCT* pSprite, FLOAT fTimeDelta ); HRESULT DisplayFrame(); HRESULT RestoreSurfaces(); WinMain() Desc: Entry point to the program. Initializes everything and calls UpdateFrame() when idle from the message pump. int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow ) { MSG msg; HWND hWnd; HACCEL hAccel; ZeroMemory( &g_Sprite, sizeof(SPRITE_STRUCT) * NUM_SPRITES );//清空記憶體 srand( GetTickCount() /*用於獲取自windows啟動以來經歷的時間長度(毫秒)*/ ); //設定隨機數隨時間變化而變化 if( FAILED( WinInit( hInst, nCmdShow, &hWnd, &hAccel ) ) ) return FALSE; if( FAILED( InitDirectDraw( hWnd ) ) ) { MessageBox( hWnd, TEXT("DirectDraw init failed. ") TEXT("The sample will now exit. "), TEXT("DirectDraw Sample"), MB_ICONERROR | MB_OK ); return FALSE; } g_dwLastTick = timeGetTime();//獲得當前系統時間 while( TRUE ) { // Look for messages, if none are found then // update the state and display it if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if( 0 == GetMessage(&msg, NULL, 0, 0 ) ) { // WM_QUIT was posted, so exit return (int)msg.wParam; } // Translate and dispatch the message if( 0 == TranslateAccelerator( hWnd, hAccel, &msg ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } else { if( g_bActive ) { // Move the sprites, blt them to the back buffer, then // flip or blt the back buffer to the primary buffer if( FAILED( ProcessNextFrame() ) /*設定下張頁面的子畫面的位置*/) { SAFE_DELETE( g_pDisplay ); MessageBox( hWnd, TEXT("Displaying the next frame failed. ") TEXT("The sample will now exit. "), TEXT("DirectDraw Sample"), MB_ICONERROR | MB_OK ); return FALSE; } } else { // Make sure we go to sleep if we have nothing else to do WaitMessage(); // Ignore time spent inactive g_dwLastTick = timeGetTime();//獲得當前系統時間 } } } } WinInit() Desc: Init the window HRESULT WinInit( HINSTANCE hInst, int nCmdShow, HWND* phWnd, HACCEL* phAccel ) { WNDCLASS wc; HWND hWnd; HACCEL hAccel; // Register the Window Class 設定視窗類 wc.lpszClassName = TEXT("FullScreenMode"); wc.lpfnWndProc = MainWndProc; wc.style = CS_VREDRAW | CS_HREDRAW; wc.hInstance = hInst; wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_MAIN) ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; if( RegisterClass( &wc ) == 0 /*註冊視窗類*/ ) return E_FAIL; // Load keyboard accelerators hAccel = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_MAIN_ACCEL) ); // Create and show the main window hWnd = CreateWindowEx( 0, TEXT("FullScreenMode"), TEXT("DirectDraw FullScreenMode Sample"), WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL ); if( hWnd == NULL ) return E_FAIL; ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); *phWnd = hWnd; *phAccel = hAccel; return S_OK; } InitDirectDraw() Desc: Create the DirectDraw object, and init the surfaces HRESULT InitDirectDraw( HWND hWnd ) { HRESULT hr; //接受返回值,其實是long型變數 LPDIRECTDRAWPALETTE pDDPal = NULL; //定義程式中的調色盤 int iSprite; //定義與sprite個數有關的計數器 g_pDisplay = new CDisplay();//動態開闢一個CDisplay類 if( FAILED( hr = g_pDisplay->CreateFullScreenDisplay( hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP ) ) ) //設定程式為全屏,並且g_pDisplay就為後備緩衝區表面的控制程式碼,即指向後備緩衝區表面的指標。 { MessageBox( hWnd, TEXT("This display card does not support 1024x768x8. "), TEXT("DirectDraw Sample"), MB_ICONERROR | MB_OK ); return hr; } // Create and set the palette when in palettized color if( FAILED( hr = g_pDisplay->CreatePaletteFromBitmap( &pDDPal, MAKEINTRESOURCE( IDB_DIRECTX ) ) ) ) //顧名思義,就是從bmp圖片中獲得調色盤值,並賦值在pDDPal結構指標中。 return hr; if( FAILED( hr = g_pDisplay->
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951828/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 三、建立動畫 (轉)遊戲程式設計動畫
- 編寫優質無錯程式碼(3) (轉)
- 編寫自己的程式碼庫:CSS3 常用動畫的實現CSSS3動畫
- 編寫自己的程式碼庫(css3常用動畫的實現)CSSS3動畫
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 五、DirectDraw中其它的DirectDraw範例 (轉)遊戲程式設計
- vue3程式碼編寫Vue
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 四、DirectDraw高階特性 (轉)遊戲程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 二、DirectDraw的體系 (轉)遊戲程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(四) (轉)遊戲程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(三) (轉)遊戲程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(二) (轉)遊戲程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(一) (轉)遊戲程式設計
- 用匯編編寫DOS下的記憶體駐留程式(3) (轉)記憶體
- 用Delphi編寫DelTree程式 (轉)
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 一、DirectDraw的基本圖象概念 (轉)遊戲程式設計
- 詳細講解DirectDraw程式設計基礎(轉)程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 二、第一個DirectDraw例項 (轉)遊戲程式設計
- 用VC++編寫CGI程式 (轉)C++
- 用VB編寫抽獎程式 (轉)
- 編寫易讀的程式碼 (轉)
- 編寫基於的POP3的電子郵件程式 (轉)
- (轉載)編寫高效的jQuery程式碼jQuery
- 用Delphi編寫安裝程式(1) (轉)
- 用VB編寫標準CGI程式 (轉)
- 用 C++Builder 編寫 Tray 程式 (轉)C++UI
- 自己編寫安裝製作程式 (轉)
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- 用VC++6.0編寫撥號程式 (轉)C++
- 使用MFC編寫internet查詢程式 (轉)
- 編寫優質無錯程式碼(2) (轉)
- 編寫優質無錯程式碼(1) (轉)
- 使用Delphi,SDK編寫Windows簡單程式 (轉)Windows
- 利用VB編寫螢幕保護程式 (轉)
- 利用Java編寫HTML檔案分析程式(轉)JavaHTML
- 為Linux 應用程式編寫 DLL(轉)Linux
- CSS 怎樣寫一個動畫(從基礎動畫到3d動畫)CSS動畫3D
- HTML元件(HTMLCOMPONENTS)之四編寫日曆(3)(轉)HTML元件
- 流暢的自行車動畫純CSS編寫動畫CSS