|
|
大家好!
下面这个程序就是想试验一下如何建立后备缓冲和使用Flip()函数,但是程序执行到GetAttachedSurface函数的时候出错了,编译没有显示问题,想请教各位到底是怎么回事呢?
注:我承认我很懒(或者很烂),为了快点学习,少敲几行代码,没怎么加注释,也没有进行出错检测,呵呵,各位高人见笑了。
- #include<windows.h>
- #include<ddraw.h>
- #include<stdio.h>
- #include<math.h>
- #define SCREEN_WIDTH 640
- #define SCREEN_HEIGHT 480
- #define SCREEN_BPP 32
- #define KEYDOWN(vk_code) (((GetAsyncKeyState(vk_code)) & 0x8000) ? 1 : 0)
- ////////////////Global Variable/////////////////////////////////
- HDC hdc;
- PAINTSTRUCT ps;
- HWND hwnd_Main = NULL;
- int window_closed = 0;
- int angle = 0;
- ////////////////Game Variable////////////////////////////////////
- LPDIRECTDRAW7 lpdd = NULL;
- LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
- LPDIRECTDRAWSURFACE7 lpddsbackbuffer = NULL;
- DDSURFACEDESC2 ddsd;
- ////////////////Game Function////////////////////////////////////
- int Game_Init(void* parms = NULL,int num_parms = 0)
- {
- DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
- lpdd->SetCooperativeLevel(hwnd_Main,DDSCL_ALLOWMODEX | DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
- lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0);
- ZeroMemory(&ddsd,sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
- ddsd.dwBackBufferCount = 1;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
- lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL);
- ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
- lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsbackbuffer);//运行时到了这个地方不行了,提示中断,哎。
- return 0;
- }
- int Game_Main(void* parms = NULL,int num_parms = 0)
- {
- if(window_closed)
- return 0;
- if(KEYDOWN(VK_ESCAPE))
- {
- SendMessage(hwnd_Main,WM_QUIT,0,0);
- window_closed = 1;
- }
- lpddsbackbuffer->Lock(NULL,&ddsd,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
- DWORD* back_buffer = (DWORD*)ddsd.lpSurface;
- int index,pos_x,pos_y;
- int num_Pixel = SCREEN_WIDTH * SCREEN_HEIGHT;
- if(ddsd.lPitch == SCREEN_WIDTH)
- {
- for(index = 0;index < num_Pixel;index++)
- back_buffer[index] = 0xFF8888EE;
- pos_x = 100 * cos((double)angle) + SCREEN_WIDTH / 2;
- pos_y = 100 * sin((double)angle) + SCREEN_HEIGHT / 2;
- back_buffer[(pos_x) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x + 1) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x - 1) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x + 1) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x - 1) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x + 1) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- back_buffer[(pos_x - 1) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;
- angle += 5;
- angle %= 360;
- }
- else
- {
- hdc = BeginPaint(hwnd_Main,&ps);
- ::TextOut(hdc,200,150,"ddsd.lPitch ! = SCREEN_WIDTH",28);
- ::EndPaint(hwnd_Main,&ps);
- return 0;
- }
- lpddsbackbuffer->Unlock(NULL);
- lpddsprimary->Flip(NULL,DDFLIP_WAIT);
- ::Sleep(30);
- return 0;
- }
- int Game_Shutdown(void* parms = NULL,int num_parms = 0)
- {
- if(lpddsprimary != NULL)
- lpddsprimary->Release();
- lpddsprimary = NULL;
- if(lpddsbackbuffer != NULL)
- lpddsbackbuffer->Release();
- lpddsbackbuffer = NULL;
- if(lpdd != NULL)
- lpdd->Release();
- lpdd = NULL;
- return 0;
- }
- ////////////////Callback Function/////////////////////////////////
- LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
- {
- switch(message)
- {
- case WM_CREATE:
- {
- return 0;
- }
- break;
- case WM_PAINT:
- {
- hdc = BeginPaint(hwnd,&ps);
- //
- EndPaint(hwnd,&ps);
- return 0;
- }
- break;
- case WM_DESTROY:
- {
- PostQuitMessage(0);
- return 0;
- }
- break;
- default:
- break;
- }
- return DefWindowProc(hwnd,message,wparam,lparam);
- }
- ////////////////WinMain Function//////////////////////////////////
- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR Cmd,int Show)
- {
- WNDCLASSEX winclass;
- winclass.cbSize = sizeof(WNDCLASSEX);
- winclass.style = CS_HREDRAW | CS_VREDRAW;
- winclass.hbrBackground = CreateSolidBrush(RGB(88,88,222));
- winclass.hInstance = hInstance;
- winclass.lpfnWndProc = WinProc;
- winclass.lpszClassName = "Test_07_flip";
- RegisterClassEx(&winclass);
- HWND hwnd = CreateWindowEx(NULL,
- "Test_07_flip",
- "Flip Test",
- WS_POPUP | WS_VISIBLE,
- 0,0,
- SCREEN_WIDTH,SCREEN_HEIGHT,
- NULL,NULL,
- hInstance,
- NULL);
- hwnd_Main = hwnd;
- Game_Init();
- ShowWindow(hwnd,Show);
- UpdateWindow(hwnd);
- MSG msg;
- while(TRUE)
- {
- if(PeekMessage(&msg,hwnd,0,0,PM_REMOVE))
- {
- if(msg.message == WM_QUIT)
- break;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- Game_Main();
- }
- Game_Shutdown();
- return 0;
- }
复制代码 |
|