DirectX5.0最新游戏编程指南 DirectDraw教程篇 二、第一个DirectDraw实例

这篇博客介绍了DirectX5游戏编程的基础,包括如何创建DirectDraw对象、设置显示模式、创建主表面和后台缓冲区,以及如何在DirectDrawSurface上着色和翻转表面。通过实例讲解了如何使用DirectDrawCreate、SetCooperativeLevel、SetDisplayMode等方法,以及如何处理DirectDrawSurface的DC和释放DirectDraw对象。
摘要由CSDN通过智能技术生成

二、第一个DirectDraw实例
    要使用DirectDraw,首先必须创建DirectDraw对象的一个实例来表征计算机上的显示适配卡,然后使用接口方法来处理对象。另外还需要创建一个或多个DirectDrawSurface对象的实例来显示游戏。DDEX1首先创建一个DirectDraw对象,再创建一个主表面(primary surface)和一个后台缓冲区(back buffer),然后在表面之间转换。DDEXx例子都是用C++写成的,如果你使用的是C编译器,必须将代码做适当改动,至少要加入虚表和指向接口方法的指针。

1、首先初始化DirectDraw对象
DDEX1 程序在doInit函数包含了DirectDraw 的初始化代码:
// 创建主DirectDraw 对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )   
    {
    // 获取独占模式
    ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
    if(ddrval == DD_OK )  
 {
        ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
        if( ddrval == DD_OK )       
  {
              //创建带有一个后台缓冲区的主表面
            ddsd.dwSize = sizeof( ddsd );
            ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
            ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                                  DDSCAPS_FLIP |
                                  DDSCAPS_COMPLEX;
            ddsd.dwBackBufferCount = 1;
            ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
            if( ddrval == DD_OK )          
   {
                //获取后台缓冲区的指针
                ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval=lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
                if( ddrval == DD_OK )  
              {
                    // 画出一些文本
                    if (lpDDSPrimary->GetDC(&hdc) == DD_OK)     {
                        SetBkColor( hdc, RGB( 0, 0, 255 ) );
                        SetTextColor( hdc, RGB( 255, 255, 0 ) );
                        TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg) );
                        lpDDSPrimary->ReleaseDC(hdc);
                    }
                    if (lpDDSBack->GetDC(&hdc) == DD_OK)    {
                        SetBkColor( hdc, RGB( 0, 0, 255 ) );
                        SetTextColor( hdc, RGB( 255, 255, 0 ) );
                        TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) );
                        lpDDSBack->ReleaseDC(hdc);
                    }
                    // 创建翻转页面的计时器
                    if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
      {
                         return TRUE;
                     }
                 }
             }
        }
    }
}
wsprintf(buf, "Direct Draw Init Failed (%08lx)/n", ddrval );
............
下面详细说明初始化DirectDraw 对象的创建和准备表面的每一步骤。

2、创建DirectDraw 对象
    创建DirectDraw 对象的一个实例,应该用DirectDrawCreate API 函数,也可以用COM中的CoCreateInstance函数。DirectDrawCreate用一个全局统一标志符GUID(Globally Unique IDentifier)来表征显示设备,在大多数情况下GUID为NULL(使用系统的缺省显示设备,既“空设备”);指针指向DirectDraw对象的地址;第三个参数总是NULL(供将来扩展使用)。下述代码表明了如何创建一个DirectDraw对象,并且检验是否成功。
 ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
 if( ddrval == DD_OK )
       {
  // lpDD is是合法的DirectDraw 对象
 }
 else
 {
  // DirectDraw对象不能被创建
 }

3、设置显示模式
    设置DirectDraw 应用程序的显示模式需要两步:首先调用IDirectDraw::SetCooperativeLevel方法来设定该模式下的要求,一旦确定了要求,再用IDirectDraw::SetDisplayMode 方法来选择显示分辨率。
    在改变显示分辨率之前,还必须通

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值