DirectDraw关于blt的一些注意事项

         blt函数是位块传输的意思,一般用作从一个页面拷贝到另外一个页面。还有的用法就是使用单色填充页面。 只要将ddbltfx的 fillcolor使其有效。

        使用这个函数的时候注意三点:

       使用函数前,最好要将页面初始化。假设你编写一个动画程序的时候,如果你不在每次的blt之前将页面初始化,你的动画角色,将在页面上一直存在,就是要擦出动画的前一步的blt。

       使用这个函数时一定不能在lock与unlock 之间 调用,否则报错。返回值信息是 DDERR_SURFACEBUSY ,意味着调用blt的函数的页面,已经被锁定。 只有在解锁之后,才能调用该函数。

       LPDIRECTDRAWSURFACE7 lpDDBitmap;
   if(!CreateBitmapSurface(&lpDDBitmap,"monster.bmp",640,480))
   {
    ErrorAndClear("load bitmap error");
    return 0;
   }
   DDCOLORKEY srcckey;
   srcckey.dwColorSpaceHighValue=0;
   srcckey.dwColorSpaceLowValue=0;
   lpDDBitmap->SetColorKey(DDCKEY_SRCBLT,&srcckey);
   RECT src_rect[6]={{2,2,70,80},
       {2+75,2,140,80},
       {2+145,2,215,80},
       {2+220,2,290,80},
       {2, 82,70,160},
       {2+75,82,145,160}
       };
   static int  num_rect=0,num_speed=0;
   RECT dest_rect;
   dest_rect.left=num_speed*30;
   dest_rect.top=0;
   dest_rect.right=dest_rect.left+200;
   dest_rect.bottom=400;
   if (dest_rect.left >= SCREEN_WIDTH)
   {
    num_speed=0;
   }
   HRESULT h=lpDDBuffer->Blt(&dest_rect,lpDDBitmap,&src_rect[num_rect],DDBLT_WAIT | DDBLT_KEYSRC,NULL);
   if(FAILED(h))
   {
    ErrorAndClear(GetErrorInfo(h));
    return 0;
   }

 while(FAILED(lpDDPrimary->Flip(0,DDFLIP_WAIT)));

// 上面的代码就是装载位图文件,将位图blt到后备缓冲,然后在调用flip() 函数实现换页。

   当你没有指定关键色 (color- key)的时候不能在blt的函数第四个参数中指定DDBLT_KEYSRC |或者DDBLT_KEYDEST 标志, 否则函数调用会返回错误信息 DDERR_INVALIDPARAMS.

   当你传给blt函数的源矩形,目标矩形不正确的情况下,也回返回。DDERR_INVALIDPARAMS。  假设你的矩形left与 right交叉了。就会出现这种错误。

 

  blt函数调用, 记住不能在lock与 unlock之间调用。 参数信息一定仔细检查是不是正确的。  

你可能感兴趣的:(Directx)