游戏

游戏设计,编程

导航

<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

文章分类

档案

随笔分类

登录

统计

读《Windows 游戏编程大师技巧》[续1]

上回已经讲了游戏编程需要一定的Windows编程基础,并且建议大家稍微了解并使用Windows编程。

一个空白的Game 控制台程序,需要的可发送Email给我 wyhw2002 AT hotmail.com 或者 wyhw2004 AT yahoo.com
此Game 程序主要有以下方法构成,你只需要把你的3D代码加入到下面的程序就能获得百元美元(哈哈,书上的原话)
int Game_Init(void *parms = NULL, int num_parms = 0) 初始化
int Game_Main(void *parms = NULL, int num_parms = 0) 主程序
int Game_Shutdown(void *parms = NULL, int num_parms = 0)  关闭

这回我们来继续 DirectX 编程。

DirectX编程第一次接触:DirectDraw 编程

DirectDraw 接口

IUnknow,所有COM接口
IDirectDraw,支持硬件,视频卡。必须创建的主COM对象
IDirectDrawSurface,创建实际显示画面,主画面
IDirectDrawPalette,处理更多色彩,调色板
IDirectDrawClipper DirectDraw 光栅和位图操作

DirectDraw 编程步骤:

一、创建 DirectDraw 对象
1) DirectDrawCreate() 函数:
HRESULT WINAPI DirectDrawCreate(GUID FAR * lpGUID,// 对象的 guid
                                                             LPDIRECTDRAW FAR *lplpDD,  //获得对象接口
                                                             Iunknown FAR *pUnkOuter);//高级特性,通常为NULL
2)、错误处理:1、FAILED() 对错误进行测试。 2、SUCCEEDED() 对成功进行测试。3、测试DirectDrawCreate返回的代码。
3)、接口的升级(随着COM升级):QueryInterface()

二、和Windows 协同工作,创建控制级别:
IDirectDraw4::SetCooperativeLevel()函数:
HRESULT SetCooperativeLevel(HWND  hWnd, // Windows 句柄
                                                    DWORD  dwFlage); //控制标志,控制级别定义。

三、设置视频模式。 SetDisplayMode
HRESULT SetDisplayMode( DWORD dwWidth, DWORD dwHeight, //新模式的宽度和高度
DWORD dwBPP, //新模式的每个像素所占字节数(bpp)
DWORD dwRefreshRate, //新模式的刷新率,参数0表示缺省值。
DWORD dwFlags );  //辅助项,一般设置为0,设置Mode 13时有变化(见DirectX SDK)。
成功:DD_OK.
使用方法:
Hr =lpDD->SetDisplayMode(640, 480, 8, 0, 0);
if (Hr != DD_OK)
{ SetDisplayMode FAILED}

四、创建调色板。
1、创建一个调色板数据结构 tagPALETTEENTRY
typedef struct tagPALETTEENTRY { // pe
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags; //应被置为PC_RESERVED 。
} PALETTEENTRY;//peRed、peGreen、peBlue分别表示逻辑调色板项的R、G、B颜色分量值。
2、创建调色板  CreatePalette()
HRESULT CreatePalette(
DWORD dwFlags,
LPPALETTEENTRY lpColorTable, //2、4、16或256个PALETTEENTRY结构序列的地址,用来初始化这个DirectDrawPalette对象。
LPDIRECTDRAWPALETTE FAR *lplpDDPalette,   //如果函数调用成功,这个参数将接收到指向新创建的DirectDrawPalette对象的指针的地址。
IUnknown FAR *pUnkOuter   //该参数将允许与今后的COM集合特性相兼容。目前,只要这个参数不是NULL,   IDirectDrawX::CreateSurface返回一个错误。
);
参数:
dwFlags   下列标志的单个或组合:
    DDPCAPS_1BIT        指定调色板索引为1比特。色彩表中只有两个入口。 
    DDPCAPS_2BIT      指定调色板索引为2比特。色彩表中有四个入口。 
    DDPCAPS_4BIT      指定调色板索引为4比特。色彩表中有16个入口。
   DDPCAPS_8BIT       指定调色板索引为8比特。色彩表中有256个入口。     DDPCAPS_8BITENTRIES       表明调色板的索引值是另外一个8位调色板的索引。这个标志只有和DDPCAPS_1BIT、DDPCAPS_2BIT、或DDPCAPS_4BIT标志一起使用才能生效,并且目标页面必须是8 bbp(8位色彩模式)。每一个色彩入口为1字节,并且指向目标页面的8 bbp调色板。    DDPCAPS_ALLOW256      表明用户可以定义调色板的所有256个入口。
返回值:如果函数调用成功,返回DD_OK。
如果函数调用失败,返回值可能是下列错误值之一:
DDERR_INVALIDOBJECT
DDERR_INVALIDPARAMS
DDERR_NOCOOPERATIVELEVELSET
DDERR_OUTOFMEMORY
DDERR_UNSUPPORTED

五、创建一个显示画面
1、填写DDSURFACEDESC2 数据结构,描述要创建的画面

typedef struct _DDSURFACEDESC2 {
    DWORD         dwSize;  //结构长度
    DWORD         dwFlags;  //结构标志
    DWORD         dwHeight;  //像素中的画面高度
    DWORD         dwWidth;  //像素中的画面宽度
    union
    {
        LONG      lPitch;  //演示模式的水平内存间距
        DWORD     dwLinearSize;
    } DUMMYUNIONNAMEN(1);
    DWORD         dwBackBufferCount;  //设定或读取后部缓冲器的数目
    union
    {
        DWORD     dwMipMapCount;
        DWORD     dwRefreshRate;
    } DUMMYUNIONNAMEN(2);
    DWORD         dwAlphaBitDepth;
    DWORD         dwReserved;
    LPVOID        lpSurface; //获取画面所在的内存指针
    union
    {
        DDCOLORKEY    ddckCKDestOverlay;
        DWORD         dwEmptyFaceColor;
    } DUMMYUNIONNAMEN(3);
    DDCOLORKEY    ddckCKDestBlt;  //控制目标颜色关键字
    DDCOLORKEY    ddckCKSrcOverlay;  //控制源颜色关键字
    DDCOLORKEY    ddckCKSrcBlt;
    DDPIXELFORMAT ddpfPixelFormat;  //重设画面的像素格式,请参考 DirectX SDK
    DDSCAPS2      ddsCaps;  //其他需要定义的画面的特性
    DWORD         dwTextureStage;
} DDSURFACEDESC2, FAR* LPDDSURFACEDESC2; 
3、选用调色板。SetPalette()
HRESULT SetPalette(
  LPDIRECTDRAWPALETTE lpDDPalette  
);
 
六、清除:清除创建的DirectDraw COM对象,别忘了:)
 
这回到此为止。下回将继续 高级DirectDraw等。谢谢观看。

2004年10月24日 11:46

评论

# 回复: 读《Windows 游戏编程大师技巧》[续1] 2005-5-8 16:52 dilier

很 好,继续,支持!

主题  
姓名  
主页
验证码  
内容   


吹响爱心集结号,传递爱心手拉手


请不要发表可能给我们带来伤害的政治言论,谢谢配合