OutScreen.cpp
上传用户:semy2100
上传日期:2013-01-22
资源大小:3633k
文件大小:9k
源码类别:

射击游戏

开发平台:

Visual C++

  1. /********************************************************************
  2. *                        空运爆发                                    *
  3. *                       Version 2.0                                  *
  4. * 本游戏全部代码由:                                                 *
  5. *                   冲天实验室   梁锋 编写                           *
  6. *                    邮箱:lenwine@126.com                           *
  7. *                bbs: http://free2.e-168.cn/lenwind (正在开发中...)  *
  8. **********************************************************************/
  9. #include "stdafx.h"
  10. static int bglong=::GetSystemMetrics(SM_CXSCREEN);
  11. static int bgtall=::GetSystemMetrics(SM_CYSCREEN);
  12. #define ID_TIMER 0
  13. #define bsupan 168
  14. static int forewidth, foreheight;//前台页面的宽度和高度
  15. static RECT backrect; //后台页面映射矩形
  16. static int backwidth, backheight;//后台页面的宽度和高度
  17. //===========================================
  18. LPDIRECTDRAW            lpDD;       //DirectDraw对象
  19. LPDIRECTDRAWCLIPPER lpClipper; //DirectDrawClipper对象
  20. LPDIRECTDRAWSURFACE     lpDDSFront; //以下均为DirectDrawSurface对象
  21. LPDIRECTDRAWSURFACE     lpDDSBack;   
  22. LPDIRECTDRAWSURFACE     lpDDSBall;
  23. LPDIRECTDRAWSURFACE     lpDDSBom[2];   
  24. LPDIRECTDRAWSURFACE     lpDDSMap;   
  25. LPDIRECTDRAWSURFACE     lpDDSBulet[2];
  26. LPDIRECTDRAWSURFACE     lpDDSFlame;
  27. //===========================================
  28. OutScreen::OutScreen(Manager *mgr):mManager(mgr)
  29. {
  30. DesignCS(mManager->MgrFace,mManager->Imglong,mManager->Imgtall);//客户区大小设置
  31.    // InitDDraw(mManager->MgrFace,mManager->Imglong,mManager->Imgtall);
  32. bk=(HBITMAP)LoadImage(NULL,"diimg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
  33.     
  34. bMap=new Showmap("Fire.bmp",0,true,RGB(255,0,255));
  35. SetTimer(mManager->MgrFace,ID_TIMER,1000,NULL);
  36. OSdc=GetDC(mManager->MgrFace);//得到句柄
  37.     bkdc=CreateCompatibleDC(OSdc);
  38. Mdc=CreateCompatibleDC(OSdc);
  39.     memDC=CreateCompatibleDC(OSdc);
  40.     hBitmap=CreateCompatibleBitmap(memDC,mManager->Imglong,mManager->Imgtall);//创建兼容位图
  41. Mbit=CreateCompatibleBitmap(OSdc,mManager->Imglong,mManager->Imgtall);
  42.      
  43. SelectObject(bkdc,bk);
  44. SelectObject(Mdc,hBitmap);
  45. SelectObject(Mdc,Mbit);
  46. }
  47. OutScreen::~OutScreen()//析构函数
  48. {
  49. ReleaseDC(mManager->MgrFace,OSdc);
  50. DeleteDC(Mdc);
  51. DeleteDC(memDC);
  52. DeleteObject(Mbit); 
  53. DeleteObject(hBitmap);
  54. DeleteDC(bkdc);
  55. DeleteObject(bk);
  56. }
  57. void OutScreen::PaintOutPut(int x,int y,int Bitlong,int Bittall,int bx,int by,bool bHStyles)
  58. {
  59. StretchBlt(Mdc,0,y,32,mManager->Imgtall,bkdc,0,y,480,32,SRCCOPY);
  60. bMap->DImage(Mdc,x,y,Bitlong,Bittall,bx,by);//角色显示
  61. }
  62. //把画面输出到客户屏幕上
  63. void OutScreen::PmOutPut()
  64. {
  65.     
  66. BitBlt(Mdc,0,0,mManager->Imglong,mManager->Imgtall,memDC,0,0,SRCCOPY);
  67. StretchBlt(Mdc,0,0,mManager->Imglong,64,bkdc,0,0,64,480,SRCCOPY);
  68.     //StretchBlt(OSdc,0,0,mManager->Imglong,mManager->Imgtall,bksdc,0,0,608,480,SRCCOPY);
  69.    // paintsp();
  70. BitBlt(OSdc,0,0,mManager->Imglong,mManager->Imgtall,Mdc,0,0,SRCCOPY);
  71. }
  72. void OutScreen::DesignCS(HWND dhwnd,int Imglong,int Imgtall)
  73. {//窗口全屏
  74. RECT rt={0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN)};
  75.     MoveWindow(dhwnd,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,TRUE);
  76.   }
  77. void OutScreen::Refresh()
  78. {  
  79. SelectObject(Mdc,GetStockObject(BLACK_BRUSH));
  80. Rectangle(Mdc,0,0,mManager->Imglong,mManager->Imgtall);
  81. }
  82. HDC OutScreen::GetCloseDDC()
  83. {
  84. return Mdc;
  85. }
  86. void OutScreen::beginsp(void)
  87. {
  88. int numsp;
  89. sp = (supan*)malloc(sizeof(supan)*bsupan);
  90. for(numsp=0; numsp<bsupan;numsp++)
  91. {
  92. sp[numsp].x = (rand() % bglong);//碎片宽
  93. sp[numsp].y = (rand() % bgtall);//碎片高
  94. sp[numsp].t = (rand() % 1);//间隔
  95. }
  96. }
  97. void OutScreen::freesp(void)
  98. {
  99. free(sp);
  100. }
  101. void OutScreen::paintsp(void)
  102. {
  103. int numsp, lightsp;
  104. for(numsp=0; numsp<bsupan; numsp++)
  105. {
  106. lightsp = 256 - sp[numsp].t;
  107. SetPixel(OSdc,sp[numsp].x,sp[numsp].y,RGB(200,255,255));
  108. SetPixel(OSdc,sp[numsp].x,sp[numsp].y+1,RGB(200,255,255));
  109. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y,RGB(200,255,255));
  110. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y+1,RGB(200,255,255));
  111. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y+2,RGB(200,255,255));
  112. SetPixel(OSdc,sp[numsp].x+2,sp[numsp].y+3,RGB(200,255,255));
  113. SetPixel(OSdc,sp[numsp].x+2,sp[numsp].y+4,RGB(200,255,255));
  114. sp[numsp].y+=2;
  115. if(sp[numsp].y >mManager->Imglong)
  116. {
  117. sp[numsp].x = (rand() % bglong);
  118. sp[numsp].y = (rand() % bglong);
  119. sp[numsp].t = (rand() % bgtall);
  120. }
  121. }
  122. }
  123. void OutScreen::leftsp()
  124. {
  125. int numsp, lightsp;
  126. for(numsp=0; numsp<bsupan; numsp++)
  127. {
  128. lightsp = 256 - sp[numsp].t;
  129. //碎片块X,Y用来放大像素
  130. SetPixel(OSdc,sp[numsp].x,sp[numsp].y,RGB((rand()%255),255,lightsp));
  131. SetPixel(OSdc,sp[numsp].x,sp[numsp].y+1,RGB((rand()%255),255,lightsp));
  132. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y,RGB(255,255,255));
  133. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y+1,RGB((rand()%255),255,lightsp));
  134. SetPixel(OSdc,sp[numsp].x+1,sp[numsp].y+2,RGB((rand()%255),255,255));
  135. sp[numsp].x-=3;
  136. if(sp[numsp].x < -200)
  137. {
  138. sp[numsp].x = (rand() % bglong);
  139. sp[numsp].y = (rand() % bgtall);
  140. sp[numsp].t = (rand() % bgtall);
  141. }
  142. }
  143. }
  144. void OutScreen::rightsp()
  145. {
  146. int numsp, lightsp;
  147. for(numsp=0; numsp<bsupan; numsp++)
  148. {
  149. lightsp = 256 - sp[numsp].t;
  150. sp[numsp].x+=7;
  151. SetPixel(OSdc,sp[numsp].x,sp[numsp].y,RGB((rand()%250),lightsp,lightsp));
  152. if(sp[numsp].x >bglong)
  153. {
  154. sp[numsp].x = (rand() % bgtall);
  155. sp[numsp].y = (rand() % bglong);
  156. sp[numsp].t =(rand() * (bglong));
  157. }
  158. }
  159. }
  160. //定义DOWN反方向
  161. void OutScreen::downsp()
  162. {
  163. int numsp, lightsp;
  164. for(numsp=0; numsp<bsupan; numsp++)
  165. {
  166. lightsp = 256 - sp[numsp].t;
  167. sp[numsp].y+=9;
  168. SetPixel(OSdc,sp[numsp].x,sp[numsp].y,RGB((rand()%250),lightsp,lightsp));
  169. if(sp[numsp].y >(mManager->Imgtall))
  170. {
  171. sp[numsp].x = (rand() % bglong);
  172. sp[numsp].y = (rand() % bgtall);
  173. sp[numsp].t = (rand() % bglong);
  174. }
  175. }
  176. }
  177. //================================================================
  178. //初始化DirectDraw环境
  179. BOOL OutScreen::InitDDraw()
  180. {
  181. /*
  182. ddsd是指向DDSRFACEDESC结构的一个指针。该结构存储了DirectDraw表面(Surface)的
  183. 当前描述。在这种情况下,我们需要注意的是:DDSURFACEDESC的成员描述这个表面
  184. (Surface)的高度和宽度,分别表示为:DDSD_HEIGHT和 DDSD_WIDTH。调用
  185. IDirectDrawSurface::GetSurfaceDesc方法,把适当的值来载入到这个结构。
  186. 对于DDEX2来说, 
  187.     DDCopyBitmap函数锁定表面(Surface)并将位图文件复制到后台缓冲区,
  188.     使用StretchBit函数延伸或压缩后台缓冲区到可适用的大小。
  189. */
  190. DWORD dwFlags;
  191. DDSURFACEDESC ddsd;//这个结构描述"页"的特徵. 
  192. //创建DirectDraw对象
  193. DirectDrawCreate(NULL, &lpDD, NULL);
  194. //设置协作级别为窗口模式
  195. dwFlags = DDSCL_NORMAL;
  196. lpDD->SetCooperativeLevel(mManager->MgrFace, dwFlags);
  197. //创建主页面
  198. ZeroMemory(&ddsd, sizeof(ddsd));
  199. ddsd.dwSize = sizeof(ddsd);
  200. ddsd.dwFlags = DDSD_CAPS;
  201. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;//指定我们用的是前页. 
  202. lpDD->CreateSurface(&ddsd, &lpDDSFront, NULL);
  203. //创建离屏页面
  204.     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;    
  205.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  206. RECT rect;
  207. GetClientRect(mManager->MgrFace, &rect);
  208. forewidth=mManager->Imglong;
  209. foreheight=mManager->Imgtall;
  210. GetRect(&backrect, 65, 65, forewidth, foreheight);
  211.     ddsd.dwWidth = backwidth=forewidth+130;
  212.     ddsd.dwHeight = backheight=foreheight+130;
  213.     lpDD->CreateSurface( &ddsd, &lpDDSBack, NULL );
  214. //创建地图页面
  215.     ddsd.dwWidth = 64;
  216.     ddsd.dwHeight = 64;
  217.     lpDD->CreateSurface( &ddsd, &lpDDSMap, NULL );
  218.     DDReLoadBitmap(lpDDSMap, "wmap.bmp");
  219. return TRUE;
  220. //*****************************************************
  221. //释放所有的DirectDraw对象。
  222. void OutScreen::FreeDDraw()
  223. {
  224.     if( lpDD != NULL )
  225.     {
  226.       
  227.         lpDD->Release();
  228.         lpDD = NULL;
  229.     }
  230. }
  231. //*****************************************************
  232. //换页
  233. void OutScreen::Flip()
  234. {
  235. RECT Window;
  236. POINT pt;
  237. GetClientRect(mManager->MgrFace, &Window);
  238. pt.x=pt.y=0;
  239. ClientToScreen(mManager->MgrFace, &pt);
  240. OffsetRect(&Window, pt.x, pt.y);
  241. HRESULT rval=lpDDSFront->Blt(&Window, lpDDSBack, &backrect, DDBLT_WAIT, NULL);
  242. if(rval == DDERR_SURFACELOST) lpDDSFront->Restore();
  243. return ;
  244. }
  245. //***************************************
  246. //绘制背景地图
  247. void OutScreen::DrawMap()
  248. {
  249. //背景贴图的偏移坐标
  250. static int mapposX=64, mapposY=64;
  251. mapposX--;
  252. if (mapposX<=0 ) mapposX=64;
  253. for (int x=0; x<=(int)backwidth/64; x++)
  254. for (int y=0; y<=(int)backheight/64; y++)
  255. {
  256. RECT rect;
  257. GetRect(&rect, 64*x-mapposY, 64*y-mapposX, 64, 64);
  258. HRESULT rval=lpDDSBack->Blt( &rect, lpDDSMap, NULL, DDBLT_WAIT, NULL);
  259. if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
  260. }
  261. }
  262. //更新屏幕
  263. void OutScreen::UpdateFrame()
  264. {
  265. DrawMap();
  266. Flip();
  267. }
  268. //填充一个RECT结构
  269. void OutScreen::GetRect(RECT* rect, long left, long top, long width, long height)
  270. {
  271. rect->left=left;
  272. rect->top=top;
  273. rect->right=left+width;
  274. rect->bottom=top+height;
  275. return;
  276. }