VC++6.0中关于贴图和解决屏幕闪烁的问题。

作者在 2008-07-31 14:34:01 发布以下内容

基于VC++6.0,且使用MFC框架。VC++6.0集成了GDI,所以能导入的图片的格
式只能是bmp的,如果想直接导入其它格式图片,请参阅GDI+方面的书籍。
    首先建立一个单文档的工程test,这就不必多说了吧:-) ,
    
    下面开始贴图:
  1.导入图片(假设图片为map.bmp).
       在test resources那里单击右键,选择Insert...,在弹出的Insert Resource
       对话框左边选择Bitmap,然后点击右边的Import,打开文件map.bmp,这时候有可能弹出一
       个对话框说一长串话,管它的呢,确定吧。然后看到Resources里面就多了一个Bitmap,
       它下面就有一张图片了,ID为IDB_BITMAP1,这个ID可以自己修改。
      
      以下工作的CTestView类的OnDraw函数中进行.
    2.创建位图对象,并与要显示的图片(此处为IDB_BITMAP1标识的图片)关联. 
      
       CBitmap bmp;
     bmp.LoadBitmap(IDB_BITMAP1);

   3.创建兼容的DC,即内存DC.

       CDC memDC;
       memDC.CreateCompatibleDC(pDC);
    
    4.将位图对象选入兼容DC.
  
       memDC.SelectObject(&bmp);  
    
    5.将兼容DC中的位图贴到窗口.
  
      pDC->BitBlt(x,y,width,height,&memDC,0,0,SRCCOPY);
      其中(x,y)表示图片的左上角在窗口中的坐标,
      idth,height分别表示图片的宽度和高度.
      
      这样贴图就完成了.  
  
    但是在许多游戏编程中会出现画面不停的闪烁的情况,这是由于游戏中的物体是
      不停的运动的,那就要不断的贴图,但是贴图是需要一定的时间的,当贴图更不上的时候,那就会闪了

      要解决这个问题可以用DirectX,这里不做介绍.我要讲的是用缓冲机制解决:
  
   1.同上面的2,3,4:
    
        CBitmap bmp;
        bmp.LoadBitmap(ID);
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        memDC.SelectObject(&bmp);
      
     2.创建一个与你的窗口一样大的(如果是全屏的那就是整个屏幕的大小)兼容DC(及用于缓
       冲的DC)和兼容位图,并将兼容位图选入兼容DC。    
         
     CBitmap BkMap;
     BkMap.CreateCompatibleBitmap(pDC,w,h);//w,h表示窗口的宽和高
     CDC BkDC;
     BkDC.CreateCompatibleDC(pDC);
     BkDC.SelectObject(&BkMap); 

    3.在缓冲DC上贴图
 
     BkDC.BitBlt(x,y,width,height,&memDC,0,0,SRCCOPY);

     如果有多张图片要同时贴在屏幕上,如有背景图,前景图,还可能有许
       多小图片,那也要把这些图全部贴在这个缓冲DC上。

    4.把缓冲DC的图片贴到屏幕。
    
       pDC->BitBlt(0,0,w,h,&BkDC,0,0,SRCCOPY); 
    
     这就完成了缓冲,就是说贴每个图的过程全部都在缓冲DC上面完成,等所有的图
       都贴到了缓冲DC上后,就把缓冲DC上的图一次性的贴到屏幕上。    
     但是这样还会存在一个问题,假设一个运动的物体运动过一个轨迹的话,那么这
       个轨迹上面都会有这个物体,因为物体经过后,原来地方的图片并没有被搽除。
     要解决这个问题也很简单,只要在每次往缓冲DC上面贴图的时候把缓冲DC”搽“
       一下就可以了:怎么搽?往上面贴一张同样大小的白色图片不就把上面的内容搽?也可以用FillXXX函数进行填充。

学习 | 阅读 12562 次
文章评论,共0条
游客请输入验证码
文章分类
文章归档
最新评论