VC++game(三)使用双缓冲技术进行绘画.doc_第1页
VC++game(三)使用双缓冲技术进行绘画.doc_第2页
VC++game(三)使用双缓冲技术进行绘画.doc_第3页
VC++game(三)使用双缓冲技术进行绘画.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC+ game(三) 使用双缓冲技术进行绘画作者:孙广东VC+开发游戏不要使用VS2010,不然非常非常的慢,除非用引擎,因为VS2010的升级不是专门为游戏而做的,更加强大的.net功能使得VC+开发游戏非常吃力,用VS2008就好。首先什么是双缓冲呢?双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在模拟绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)一般直接的贴图是将 CDC设备中存的图片输出到dc中,多次执行该操作时会出现刷新闪屏的问题而双缓冲则是申请另外的 CDC设备,将原来本该输出到 dc中的多个图片定向输出到该缓冲 CDC中,合成一张图后,在拷贝到dc荧幕上去比如我们要画一个背景图,然后再背景图上绘制一个人物,用键盘控制人物的移动。而人物的绘制我们采用镂空技术,镂空技术就是去背景色,只显示要显示的对象,就像透明的png格式图片。镂空技术需要两张图片p1,p2,p1中人物角色内为黑色,背景是白色,p2人物是要显示的样子,背景色是白色。如图:右边一部分为p1,左边的一部分为p2,首先p1与背景做与运算,白色为0xFFFFFF黑色为0x000000,这样后小人区域全为0,小人周围还是背景色然后p2在相同的位置做或运算,这样后小人就显示出来,去掉了背景色。这就是图片镂空技术,alpha通道的实现,使得这种技术慢慢消隐了。如何实现双缓冲呢?我们需要准备以下工作:1:两个CDC :cDc 用于选择图片资源 bufferCDC 用于将要绘画的图片组合在一起,然后再显示到设备上。2:一个缓冲CBitmapok,代码如下,如果你看了第一个VC+ game(开场篇),那么只需改动里面的MyWnd.cpp文件以下代码的实现功能是通过键盘左右方向键控制小人移动,当超出屏幕,小人停止移动。通过定时器定时刷新屏幕,定时器的添加和绘画函数添加一样,在类视图界面选择MyWnd.cpp,点击右键选择属性,在消息中添加OnTimer.具体代码实现如下:MyWnd.cpp:cppview plaincopyprint?1. /MyWnd.cpp:实现文件2. /3. 4. #includestdafx.h5. #includeMyWnd.h6. #defineWIDTH8007. #defineHEIGHT6008. 9. /CMyWnd10. 11. IMPLEMENT_DYNCREATE(CMyWnd,CFrameWnd)12. 13. CMyWnd:CMyWnd()14. :cDc(NULL)15. ,bacBitmap(NULL)16. ,perBitmap(NULL)17. ,perX(720)18. ,bufferCDC(NULL)19. ,bufferBitmap(NULL)20. 21. Create(NULL,DoubleCash);22. CClientDCdc(this);23. intstartX=(dc.GetDeviceCaps(HORZRES)-WIDTH)/2;24. intstartY=(dc.GetDeviceCaps(VERTRES)-HEIGHT)/2;25. MoveWindow(startX,startY,WIDTH,HEIGHT);26. 27. 28. cDc=newCDC;29. cDc-CreateCompatibleDC(&dc);30. bufferCDC=newCDC;31. bufferCDC-CreateCompatibleDC(&dc);/兼容的DC32. 33. bufferBitmap=newCBitmap;34. bufferBitmap-CreateCompatibleBitmap(&dc,WIDTH,HEIGHT);/兼容的Bitmap35. bufferCDC-SelectObject(bufferBitmap);36. 37. bacBitmap=newCBitmap;38. perBitmap=newCBitmap;39. 40. bacBitmap-m_hObject=(HBITMAP):LoadImage(NULL,bac.bmp,IMAGE_BITMAP,800,582,LR_LOADFROMFILE);41. perBitmap-m_hObject=(HBITMAP):LoadImage(NULL,per.bmp,IMAGE_BITMAP,98,308,LR_LOADFROMFILE);42. SetTimer(1,100,NULL);43. 44. 45. 46. CMyWnd:CMyWnd()47. 48. 49. 50. 51. BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)52. ON_WM_TIMER()53. ON_WM_KEYDOWN()54. END_MESSAGE_MAP()55. 56. 57. /CMyWnd消息处理程序58. 59. voidCMyWnd:OnTimer(UINT_PTRnIDEvent)60. 61. /TODO:在此添加消息处理程序代码和/或调用默认值62. CClientDCdc(this);63. cDc-SelectObject(bacBitmap);64. bufferCDC-BitBlt(0,0,WIDTH,HEIGHT,cDc,0,0,SRCCOPY);/将背景画到缓冲区65. cDc-SelectObject(perBitmap);66. 67. if(perX%2=0)68. 69. bufferCDC-BitBlt(perX,0,49,154,cDc,49,0,SRCAND);70. bufferCDC-BitBlt(perX,0,49,154,cDc,0,0,SRCPAINT);71. 72. else73. 74. bufferCDC-BitBlt(perX,0,49,154,cDc,49,154,SRCAND);75. bufferCDC-BitBlt(perX,0,49,154,cDc,0,154,SRCPAINT);76. 77. 78. 79. dc.BitBlt(0,0,WIDTH,HEIGHT,bufferCDC,0,0,SRCCOPY);80. 81. CFrameWnd:OnTimer(nIDEvent);82. 83. 84. voidCMyWnd:OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)85. 86. /TODO:在此添加消息处理程序代码和/或调用默认值87. if(perX760|perX=0)88. 89. KillTimer(1);90. return;91. 92. switch(nChar)93. 94. caseVK_LEFT:95. perX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论