游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1345|回复: 1

请问如何实现以下算法(directx7--ddraw)

[复制链接]

5

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2005-6-9 12:58:00 | 显示全部楼层 |阅读模式
Allocate all available local video memory by creating a set of DirectDraw surfaces that are the same pixel format and size as the display (which is Video Mode) and one surface with the same width but variable height.

或者给我一个例子,创建n个surface,然后在其间不停地翻。

6

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2005-6-9 17:11:00 | 显示全部楼层

Re:请问如何实现以下算法(directx7--ddraw)

  你所说的应该是创建n个离屏表面(通常用于硬件的blitter 加速)
并且与主表面(primary surface)有相同的format ,这里我写一个创建离屏表面的函数CreateOffScreenSurface(int width, int height) 用于在显存(video memory)中创建 width*height的surface ,

然后你可以如此生成 n 个表面 :
#define SCREENWIDTH  800
#define SCREENHEIGHT 600
const n = 100;
LPDIRECTDRAWSURFACE7  g_pOffSurface[n] ;
…………………………………
   for ( int I =0; i<n ; i++)
    { //当然,你可以把 height 设为变量  
      g_pOffSurface = CreateOffScreenSurface(SCREENWIDTH, SCREENHEIGHT);  
    }

方法:   过程跟创建主表面差不多,
1 .既然离屏表面也是表面,如果是DX7 的话,则定义为   LPDIRECTDRAWSURFACE7  g_pOffSurface  ; // 如果很多表面的话,就定义为数组。

  2. 因为要设定表面的大小 ,必须使“表面描述结构” DDSURFACEDESC2 中的dwWidth 和 dwHeight 有效,所以必须把DDSURFACEDESC2 中的成员 dwFlags 设为 : dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT (其中 DDSD_CAPS是为了使 dwCaps 有效)

3. 把 DDSURFACEDESC2 中的成员 dwWidth  ,dwHeight  设为你想要的宽和高。
4. 因为我们要的是离屏表面(off screen plane),并且在显存中创建,所以DDSURFACEDESC2.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN |VIDEOMEMEORY ;
5.        创建表面 : CreateSurface(&ddsd, g_pOffSurface ,NULL); //  ddsd为 DDSURFACEDESC2 结构
6.        设置颜色键 (color key) : 如果在blit时,你想让图形的某种颜色透明(一般为背景色)的话,如下设:
    DDCOLORKEY colorKey;   
colorKey.dwColorSpaceLowValue  = 0;  //黑色 ,
    colorKey.dwColorSpaceHighValue = 0;
   g_pOffSurface->SetColorKey(DDCKEY_SRCBLT, &colorKey);


函数大概为这样

LPDIRECTDRAWSURFACE7 CreateOffScreenSurface (int width, int height)
{
DDSURFACEDESC2 ddsd;         //用于描述表面
LPDIRECTDRAWSURFACE7 lpOffSurface;  //   离屏表面
   
//  初始化 ddsd 表明要创建什么样的表面
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize  = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;   
ddsd.dwWidth  =  width;
ddsd.dwHeight =  height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | VIDEOMEMEORY;  //离屏,并在显存中
// 创建表面
if (FAILED(g_pdd->CreateSurface(&ddsd,& lpOffSurface ,NULL)))  //g_pdd为 LPDIRECTDRAW7
   return  NULL;
return(lpdds);
}


应用 :
  比如你想让第num个表面显示在屏幕上,可以这样做:
1.        创建主表面 : g_pPrimarySurface  (通过 CreateSurface(…)函数) 和他的后备缓冲(back buffer) g_pBackBuffer ( 通过 g_pPrimarySurface->GetAttachedSurface(…) )
2.        创建离屏表面(n个)g_pOffSurface[n] , 并用图像填充(例如bitmap ) 。
3.        把第num表面blit 到backbuffer 中: g_pBackBuffer->Blt(&destRect, g_pOffSurface[num],
         &sourceRect,(DDBLT_WAIT),
                     NULL))) ;
它表示把表面g_pOffSurface[num] 中sourceRect 区域的象素(color)考到(不确切!not copy, it blit,仅为了便于说明)g_pBackBuffer 的 destRect 中。
4.        显示(flip,或者说为交换前后缓冲区):  g_pPrimarySurface->Flip(NULL, DDFLIP_WAIT)  
5.        ok , take a break!!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 23:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表