这不是一篇关于DirectX的详细教程
而是讲解如何用DELPHI开发DirectX游戏
因为不管是网上或是书店
关于DirectX的书基本上是用C++或VC描述的
用DELPHI开发游戏的资料是少之又少
这篇文章的目的就是让读者能够学会如何利用已有的资料学习来开发游戏
这篇文章面向的是对DirectX有一定了解却不知道如何在DELPHI下开发DirectX游戏的读者 推荐参考资料:<<游戏编程指南>><<DirectX中文收册>>
一DELPHI能不能开发游戏?
回答是当然网上很多游戏论坛有不少人都认为开发游戏只能用C++或VC DELPHI只适合来做做桌面应用劝有这些观点的人先反汇编看看DELPHI和VC编释出来的代码或是看看奇迹时代这个游戏奇迹时代就是用DELPHI开发的速度和画面优于帝国时代DELPHI是完全面向对象并能内嵌汇编支持MMX指令(DELPHI中MMX寄存器为mmmm)完全适合游戏开发的需要其实不论VCDELPHI都只是工具只要内功好都能做出来好的程序或是游戏
二准备工作
目前用DELPHI开发DirectX游戏有二种选择一是使用jedi的DirectX声明(http://wwwdelphijediorg)另一种是使用DelphiX控件在这里我们准备使用jedi的DirectX声明包来开发DirectX游戏之所以选择DirectX声明包是因为这样是以SDK方式来开发游戏以后如果需要转到其它语言也不必重新学习DirectX至于DelphiX控件我没用过没发言权不过偶是不用日货的 ;)
先到以下地址下载DirectX的声明包(http://kuganet/download/files/directxrar)并解压到你自定的目录中再在DELPHI中选择Tools>Environment Options在打开的窗口中选择Library选项卡点击Library Path后面的按钮会弹出来一个Directories窗口再点击Greyed items denote invalid path右边的按钮选择DirectX声明解压到的目录再点击ADD按钮这样就把DirectX声明所在的目录添加到了DELPHI 的Library路径中就可以直接在uses中引用DirectX声明中的单元了这个声明包里自带了几个例子可以作为入门的参考
三调试经验
开发全屏游戏时最好把设计时的屏幕分辩率设为和游戏一样的分辩率以免调试时频繁切换分辩率而损伤屏幕
开发全屏游戏最好是在WIN/XP下不然在下调试时游戏进入死循环或产生异常时机子很容易就会当掉在/XP下全屏游戏进入死循环时可以按ALT+TAB切换到DELPHI中(但这时由于DirectX游戏是全屏独占了屏幕屏幕上不会有变化所以要多试几次)按CTRL+F就可以结束游戏如果是异常的话切换到DELPHI中先按下回车再按CTRL+F就可以结束调试游戏了注意:
如果你是使用DELPHI的话请把DirectDrawpas中的行{$IFDEF VER}改为{$IFDEFVER}才能正常编释
最好使用API的方式来建立游戏主窗口而不是使用VCL的TFORM类先让我们来看看用C++和DELPHI初始化DirectDraw对像的代码段
c++版:
BOOL InitDDraw( )
{
LPDIRECTDRAW lpDD; // DirectDraw对象的指针
if ( DirectDrawCreateEx (NULL (void **)&lpDD IID_IDirectDraw NULL) != DD_OK )
return FALSE; {创建DirectDraw对象}
{这里使用了 if ( xxx != DD_OK) 的方法进行错误检测这是最常用的方法}
if (lpDD>SetCooperativeLevel(hwndDDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK )
return FALSE; {设置DirectDraw控制级}
if ( lpDD>SetDisplayMode( DDSDM_STANDARDVGAMODE ) != DD_OK )
return FALSE; {置显示模式}
}
DELPHI版:
function TFormInitDirectDraw: Boolean;
var
lpDD: IDirectDraw;
begin
Result := False; {先假设初始化失败}
{建立DirectDraw对象}
if DirectDrawCreateEx(nil lpDD IID_IDIRECTDRAW nil) <> DD_OK then
exit;
{设定DirectDraw的控制级第一个参数为DirectDraw窗口的句柄这里把控级级设为全屏加独占模式}
if lpDDSetCooperativeLevel(Hwnd DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK then
exit;
{设定显示模式第一二个参数为分辩率大小第三个参数用来设置显示模式的颜色位数第四个参数设定屏幕的刷新率为默认值第四个参数唯一有效的值只有DDSDM_STANDARDVGAMODE}
if lpDDSetDisplayMode( DDSDM_STANDARDVGAMODE) <> DD_OK then
exit;
Result := True;
end;
可以看出来这二段代码除了语法和对象名外完全一样只要了解了这点我们完全可以参考VC或C++的资料然后用DELPHI做出自己的游戏了DELPHI中DirectX声明中的对象名结构名和VC不一样一般的对应关系如下:
DELPHI VC
DirectDraw对象 IDirectDrawLPDIRECTDRAW
页面对象 IDirectDrawSurface LPDIRECTDRAWSURFACE
DirectDraw的页面描述 TDDSurfaceDesc DDSURFACEDESC
基本上只是前缀不一样由于篇幅这儿就不一一列出所有对像和结构了