用DELPHI开发DirectX游戏

 我来答
faker1718
2022-10-09 · TA获得超过981个赞
知道小有建树答主
回答量:272
采纳率:100%
帮助的人:51.8万
展开全部
这不是一篇关于DirectX的详细教程 而是讲解如何用DELPHI开发DirectX游戏 因为不管是网上或是书店 关于DirectX的书基本上是用C++或VC描述的 用DELPHI开发游戏的资料是少之又少 这篇文章的目的就是让读者能够学会如何利用已有的资料学习来开发游戏    这篇文章面向的是对DirectX有一定了解 却不知道如何在DELPHI下开发DirectX游戏的读者 推荐参考资料:<<游戏编程指南>> <<DirectX中文收册>> 一 DELPHI能不能开发游戏?   回答是当然 网上很多游戏论坛有不少人都认为开发游戏只能用C++或VC DELPHI只适合来做做桌面应用 劝有这些观点的人先反汇编看看DELPHI和VC编释出来的代码 或是看看 奇迹时代 这个游戏 奇迹时代 就是用DELPHI开发的 速度和画面优于帝国时代 DELPHI是完全面向对象 并能内嵌汇编 支持MMX指令(DELPHI中MMX寄存器为mm mm ) 完全适合游戏开发的需要 其实不论VC DELPHI都只是工具 只要内功好都能做出来好的程序或是游戏 二 准备工作   目前用DELPHI开发DirectX游戏有二种选择 一是使用jedi的DirectX声明(// delphi jedi ) 另一种是使用DelphiX控件 在这里我们准备使用jedi的DirectX声明包来开发DirectX游戏 之所以选择DirectX声明包 是因为这样是以SDK方式来开发游戏 以后如果需要转到其它语言也不必重新学习DirectX 至于DelphiX控件我没用过 没发言权 不过偶是不用日货的 ; )  先到以下地址下载DirectX的声明包(//kuga net/download/files/directx rar) 并解压到你自定的目录中 再在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 的话 请把DirectDraw pas中的 行{$IFDEF VER }改为{$IFDEF VER }才能正常编释   最好使用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(hwnd DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK ) return FALSE; {设置DirectDraw控制级}if ( lpDD >SetDisplayMode( DDSDM_STANDARDVGAMODE ) != DD_OK ) return FALSE; {置显示模式}}DELPHI版:function TForm InitDirectDraw: Boolean;varlpDD: IDirectDraw ;beginResult := False; {先假设初始化失败}{建立DirectDraw对象}if DirectDrawCreateEx(nil lpDD IID_IDIRECTDRAW nil) <> DD_OK thenexit;{设定DirectDraw的控制级 第一个参数为DirectDraw窗口的句柄 这里把控级级设为全屏加独占模式}if lpDD SetCooperativeLevel(Hwnd DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK thenexit;{设定显示模式 第一 二个参数为分辩率大小 第三个参数用来设置显示模式的颜色位数 第四个参数设定屏幕的刷新率 为默认值 第四个参数唯一有效的值只有DDSDM_STANDARDVGAMODE}if lpDD SetDisplayMode( DDSDM_STANDARDVGAMODE) <> DD_OK thenexit;Result := True;end;  可以看出来 这二段代码除了语法和对象名外完全一样 只要了解了这点 我们完全可以参考VC或C++的资料 然后用DELPHI做出自己的游戏了 DELPHI中DirectX声明中的对象名 结构名和VC不一样 一般的对应关系如下:             DELPHI          VCDirectDraw对象     IDirectDraw        LPDIRECTDRAW 页面对象        IDirectDrawSurface    LPDIRECTDRAWSURFACE DirectDraw的页面描述  TDDSurfaceDesc      DDSURFACEDESC 基本上只是前缀不一样 由于篇幅 这儿就不一一列出所有对像和结构了 lishixinzhi/Article/program/Delphi/201311/25022

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式