游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2311|回复: 3

directdraw建立后备缓冲函数GetAttachedSurface不能正常运行,为

[复制链接]

4

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2008-11-7 18:25:00 | 显示全部楼层 |阅读模式
大家好!
下面这个程序就是想试验一下如何建立后备缓冲和使用Flip()函数,但是程序执行到GetAttachedSurface函数的时候出错了,编译没有显示问题,想请教各位到底是怎么回事呢?
注:我承认我很懒(或者很烂),为了快点学习,少敲几行代码,没怎么加注释,也没有进行出错检测,呵呵,各位高人见笑了。


  1. #include<windows.h>
  2. #include<ddraw.h>
  3. #include<stdio.h>
  4. #include<math.h>

  5. #define SCREEN_WIDTH        640
  6. #define SCREEN_HEIGHT        480
  7. #define SCREEN_BPP            32
  8. #define KEYDOWN(vk_code)    (((GetAsyncKeyState(vk_code)) & 0x8000) ? 1 : 0)

  9. ////////////////Global Variable/////////////////////////////////
  10. HDC hdc;
  11. PAINTSTRUCT ps;
  12. HWND hwnd_Main        = NULL;
  13. int window_closed    = 0;
  14. int angle            = 0;

  15. ////////////////Game Variable////////////////////////////////////
  16. LPDIRECTDRAW7            lpdd            = NULL;
  17. LPDIRECTDRAWSURFACE7    lpddsprimary    = NULL;
  18. LPDIRECTDRAWSURFACE7    lpddsbackbuffer    = NULL;
  19. DDSURFACEDESC2            ddsd;

  20. ////////////////Game Function////////////////////////////////////
  21. int Game_Init(void* parms = NULL,int num_parms = 0)
  22. {
  23.     DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);

  24.     lpdd->SetCooperativeLevel(hwnd_Main,DDSCL_ALLOWMODEX | DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

  25.     lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0);

  26.     ZeroMemory(&ddsd,sizeof(ddsd));
  27.     ddsd.dwSize                = sizeof(ddsd);
  28.     ddsd.dwFlags            = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  29.     ddsd.dwBackBufferCount    = 1;
  30.     ddsd.ddsCaps.dwCaps        = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

  31.     lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL);

  32.     ddsd.ddsCaps.dwCaps        = DDSCAPS_BACKBUFFER;

  33.     lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsbackbuffer);//运行时到了这个地方不行了,提示中断,哎。

  34. return 0;
  35. }

  36. int Game_Main(void* parms = NULL,int num_parms = 0)
  37. {
  38.     if(window_closed)
  39.         return 0;

  40.     if(KEYDOWN(VK_ESCAPE))
  41.     {
  42.         SendMessage(hwnd_Main,WM_QUIT,0,0);
  43.         window_closed = 1;
  44.     }

  45.     lpddsbackbuffer->Lock(NULL,&ddsd,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);

  46.     DWORD* back_buffer = (DWORD*)ddsd.lpSurface;

  47.     int index,pos_x,pos_y;
  48.     int num_Pixel = SCREEN_WIDTH * SCREEN_HEIGHT;
  49.     if(ddsd.lPitch == SCREEN_WIDTH)
  50.     {
  51.         for(index = 0;index < num_Pixel;index++)
  52.             back_buffer[index] = 0xFF8888EE;
  53.         pos_x = 100 * cos((double)angle) + SCREEN_WIDTH / 2;
  54.         pos_y = 100 * sin((double)angle) + SCREEN_HEIGHT / 2;

  55.         back_buffer[(pos_x) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
  56.         back_buffer[(pos_x) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;
  57.         back_buffer[(pos_x) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
  58.         back_buffer[(pos_x + 1) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
  59.         back_buffer[(pos_x - 1) + (pos_y) * SCREEN_WIDTH] = 0xFFFFFF00;
  60.         back_buffer[(pos_x + 1) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;
  61.         back_buffer[(pos_x - 1) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
  62.         back_buffer[(pos_x + 1) + (pos_y - 1) * SCREEN_WIDTH] = 0xFFFFFF00;
  63.         back_buffer[(pos_x - 1) + (pos_y + 1) * SCREEN_WIDTH] = 0xFFFFFF00;

  64.         angle += 5;
  65.         angle %= 360;
  66.     }
  67.     else
  68.     {
  69.         hdc = BeginPaint(hwnd_Main,&ps);
  70.         ::TextOut(hdc,200,150,"ddsd.lPitch ! = SCREEN_WIDTH",28);
  71.         ::EndPaint(hwnd_Main,&ps);
  72.         return 0;
  73.     }

  74.     lpddsbackbuffer->Unlock(NULL);

  75.     lpddsprimary->Flip(NULL,DDFLIP_WAIT);

  76.     ::Sleep(30);

  77. return 0;
  78. }

  79. int Game_Shutdown(void* parms = NULL,int num_parms = 0)
  80. {
  81.     if(lpddsprimary != NULL)
  82.         lpddsprimary->Release();
  83.     lpddsprimary = NULL;

  84.     if(lpddsbackbuffer != NULL)
  85.         lpddsbackbuffer->Release();
  86.     lpddsbackbuffer = NULL;

  87.     if(lpdd != NULL)
  88.         lpdd->Release();
  89.     lpdd = NULL;

  90. return 0;
  91. }

  92. ////////////////Callback Function/////////////////////////////////
  93. LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
  94. {
  95.     switch(message)
  96.     {
  97.     case WM_CREATE:
  98.         {
  99.             return 0;
  100.         }
  101.         break;

  102.     case WM_PAINT:
  103.         {
  104.             hdc = BeginPaint(hwnd,&ps);
  105.             //
  106.             EndPaint(hwnd,&ps);
  107.             return 0;
  108.         }
  109.         break;

  110.     case WM_DESTROY:
  111.         {
  112.             PostQuitMessage(0);
  113.             return 0;
  114.         }
  115.         break;

  116.     default:
  117.         break;
  118.     }
  119.     return DefWindowProc(hwnd,message,wparam,lparam);
  120. }

  121. ////////////////WinMain Function//////////////////////////////////
  122. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR Cmd,int Show)
  123. {
  124.     WNDCLASSEX winclass;
  125.     winclass.cbSize            = sizeof(WNDCLASSEX);
  126.     winclass.style            = CS_HREDRAW | CS_VREDRAW;
  127.     winclass.hbrBackground    = CreateSolidBrush(RGB(88,88,222));
  128.     winclass.hInstance        = hInstance;
  129.     winclass.lpfnWndProc    = WinProc;
  130.     winclass.lpszClassName    = "Test_07_flip";

  131.     RegisterClassEx(&winclass);

  132.     HWND hwnd = CreateWindowEx(NULL,
  133.                             "Test_07_flip",
  134.                             "Flip Test",
  135.                             WS_POPUP | WS_VISIBLE,
  136.                             0,0,
  137.                             SCREEN_WIDTH,SCREEN_HEIGHT,
  138.                             NULL,NULL,
  139.                             hInstance,
  140.                             NULL);

  141.     hwnd_Main = hwnd;

  142.     Game_Init();

  143.     ShowWindow(hwnd,Show);
  144.     UpdateWindow(hwnd);

  145.     MSG msg;

  146.     while(TRUE)
  147.     {
  148.         if(PeekMessage(&msg,hwnd,0,0,PM_REMOVE))
  149.         {
  150.             if(msg.message == WM_QUIT)
  151.                 break;
  152.             TranslateMessage(&msg);
  153.             DispatchMessage(&msg);
  154.         }

  155.         Game_Main();
  156.     }

  157.     Game_Shutdown();

  158.     return 0;
  159. }
复制代码

4

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2008-11-7 21:34:00 | 显示全部楼层

Re:directdraw建立后备缓冲函数GetAttachedSurface不能正常运行

运行时说0x004010ac未处理的异常之类的,反复产看了,还是看不出来问题的所在。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-11-8 03:28:00 | 显示全部楼层

Re:directdraw建立后备缓冲函数GetAttachedSurface不能正常运行

下载这里现成的类库代码即可。
cpp.instemast.com
例子:
http://bbs.gameres.com/showthread.asp?threadid=117721

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2008-11-8 14:16:00 | 显示全部楼层

Re:directdraw建立后备缓冲函数GetAttachedSurface不能正常运行

在获取后缓冲之前先把ddsd.ddsCaps清0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 23:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表