作者:Clayton Walnum
有很多类型的游戏适合用VB来编程。一切对VB怀有疑惑的程序员将从本书知道VB的魅力。
本书适合有一定VB基础的程序员。所以,当你阅读本书之前,稍稍阅读一本也许在图书馆借来的书,并用 Visual Basic IDE 编译和改造一些实例。
第一天:了解游戏编程的一些要素。
为什么要用VB来做游戏开发工作:
- VB 是最容易学的语言之一。
- 是开发工具。能迅速创建用户界面。
- 功能强大。能处理所有复杂的应用程序。
- 有专业水准的绘图功能。
- 轻松管理位图图片
- BASIC语言扩展借口能自定义数据类型和类
- 能调用 Windows API。
- 最后一条理由,你可能会喜欢它。
适合用VB开发的游戏类型:VB能做所有需要的事情的游戏。调用Windows API 的游戏。
游戏编程要素:
- 游戏设计:决定游戏好坏的因素。设计一个令玩家喜欢的游戏非常重要。
- 图形设计:游戏包含了大量图形。动人的插图和迷人的场景将能吸引玩家。
- 声音制作:任何时候都需要声音,游戏的虚拟世界也需要。
- 控制和界面:直接和玩家互动。
- 图象处理:处理大量的游戏中的图像。需要很多技巧和技术。
- 动画:用某种方式进行移动或改变游戏图像对象的过程。
- 算法:解决游戏中的计算问题。
- 人工智能:一种让电脑显得“聪明”的算法。
- 游戏测试:玩,找出Bug。
上回已经讲了游戏编程需要一定的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等。谢谢观看。