后备缓冲

原创 2005年02月25日 19:53:00


int Game_Init(void *parms = NULL, int num_parms = 0)
{
 //创建IID_IDirectDraw7接口
 if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
    return(0);

 //设置协作级别
 if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
            DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
            DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
    return(0);

 //设置显示模块
 if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
    return(0);


 // clear ddsd and set size
 DDRAW_INIT_STRUCT(ddsd);

 // enable valid fields
 ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;

 //设置后备缓冲数目
 ddsd.dwBackBufferCount = 1;

 // request a complex, flippable
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

 // create the primary surface
 if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
    return(0);

 // now query for attached surface from the primary surface

 // this line is needed by the call
 ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;

 //获取后备缓冲
 if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
   return(0);

 // build up the palette data array
 for (int color=1; color < 255; color++)
 {
  // fill with random RGB values
  palette[color].peRed   = rand()%256;
  palette[color].peGreen = rand()%256;
  palette[color].peBlue  = rand()%256;

  // set flags field to PC_NOCOLLAPSE
  palette[color].peFlags = PC_NOCOLLAPSE;
 } // end for color

 // now fill in entry 0 and 255 with black and white
 palette[0].peRed     = 0;
 palette[0].peGreen   = 0;
 palette[0].peBlue    = 0;
 palette[0].peFlags   = PC_NOCOLLAPSE;

 palette[255].peRed   = 255;
 palette[255].peGreen = 255;
 palette[255].peBlue  = 255;
 palette[255].peFlags = PC_NOCOLLAPSE;

 // create the palette object
 if (FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 |
         DDPCAPS_INITIALIZE,
         palette,&lpddpal, NULL)))
 return(0);

 // finally attach the palette to the primary surface
 if (FAILED(lpddsprimary->SetPalette(lpddpal)))
    return(0);

 // return success or failure or your own return code here
 return(1);

} // end Game_Init

int Game_Main(void *parms = NULL, int num_parms = 0)
{
 if (window_closed)
    return(0);

 if (KEYDOWN(VK_ESCAPE))
   {
    PostMessage(main_window_handle,WM_CLOSE,0,0);
    window_closed = 1;
   } // end if

 // lock the back buffer
 DDRAW_INIT_STRUCT(ddsd);
 lpddsback->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);

 UCHAR *back_buffer = (UCHAR *)ddsd.lpSurface;

 if (ddsd.lPitch == SCREEN_WIDTH)
  memset(back_buffer,0,SCREEN_WIDTH*SCREEN_HEIGHT);
 else
   {
    // non-linear memory
  
    // make copy of video pointer
    UCHAR *dest_ptr = back_buffer;

    // clear out memory one line at a time
    for (int y=0; y<SCREEN_HEIGHT; y++)
    {
     // clear next line
     memset(dest_ptr,0,SCREEN_WIDTH);
      
     // advance pointer to next line
     dest_ptr+=ddsd.lPitch;
    } // end for y

   } // end else


 // you would perform game logic...
      
 // draw the next frame into the back buffer, notice that we
 // must use the lpitch since it's a surface and may not be linear

 // plot 5000 random pixels
 for (int index=0; index < 5000; index++)
 {
  int   x   = rand()%SCREEN_WIDTH;
  int   y   = rand()%SCREEN_HEIGHT;
  UCHAR col = rand()%256;
  back_buffer[x+y*ddsd.lPitch] = col;
 } // end for index

 // unlock the back buffer
 if (FAILED(lpddsback->Unlock(NULL)))
    return(0);

 // perform the flip
 while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));

 // wait a sec
 Sleep(500);

 // return success or failure or your own return code here
 return(1);

} // end Game_Main

相关文章推荐

创建一个关联有"后备缓冲"的"主表面"(即复杂表面,Complex Surface)

离屏表面有两类:第一种叫做后备缓冲(Back  Buffer)。 后备缓冲是指一些用在动画链中的表面,它们具有和主表面相同的尺寸和色深。后备缓冲表面比较独特,因为当你创建主表面时 也创建也它们(通...

防止图像闪烁之后备缓冲技术

  • 2009年03月07日 10:26
  • 2.05MB
  • 下载

codeReviw层级和意义,业务后备

1.很多人以为codeReview的意义是保障质量. 但更多的是      1.业务知识分享和反向check  2.组员互备,当有人忙于其他项目或者请假时,要顶上.  3.通过单测对输入输出来反向c...

东莞市重点培育上市后备科技企业名单(科技局)

东莞市重点培育上市后备科技企业名单(科技局)    东莞市科技局 公示时间 第二批重点培育上市后备科技企业 2008年 1、东莞市科威医疗器械有限公司(东城...

Postgresql后备服务器部署实战

数据库版本:postgresql 9.6.0 作者:JackGo 邮箱:jackgo73@outlook.com 日期:2017年4月9日 Postgresql后备服务器部署实战这...

为linux留一个后门,做后备

在这里要为大家提供的是 prism,这个在github里面有,编译安装后,执行很简单,只需要执行一条命令,发送一条icmp,这样一条反弹shell就成了。有几点需要注意: 1. 密码是在文件里面修改...

Oracle数据库的后备和恢复

Oracle数据库的后备和恢复 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的...

(转)从缓冲上看阻塞与非阻塞socket在发送接收上的区别

最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解。所以我想写一篇文章来纠正错误,并作为记...
  • hairetz
  • hairetz
  • 2014年01月07日 20:31
  • 13196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后备缓冲
举报原因:
原因补充:

(最多只允许输入30个字)