用DELPHI开发DirectX游戏 (转)
这不是一篇关于DirectX的祥细教程,而是讲解如何用Delphi开发DirectX游戏.因为不管是网上或是书店,关于DirectX的书基本上是用C++或VC描述的.用DELPHI开发游戏的资料是少之又少,这篇文章的目的就是让读者能够学会如何利用已有的资料学习来开发游戏.
这篇文章面向的是对DirectX有一定了解,却不知道如何在DELPHI下开发DirectX游戏的读者.
推荐参考资料:
<编程指南>>,<>
DELPHI能不能开发游戏?
回答是当然,网上很多游戏论坛有不少人都认为开发游戏只能用C++或VC. DELPHI只适合来做做桌面应用,劝有这些观点的人先反汇编看看DELPHI和VC编释出来的代码,或是看看"奇迹时代"这个游戏,"奇迹时代"就是用DELPHI开发的,速度和画面优于帝国时代.DELPHI是完全面向对象,并能内嵌汇编,支持MMX指今(DELPHI中MMX寄存器为mm0-mm7).完全适合游戏开发的需要.其实不论VC,DELPHI都只是工具,只要内功好都能做出来好的程序或是游戏.
准备工作:
目前用DELPHI开发DirectX游戏有二种选择.一是使用jedi的DirectX声明(http://www.delphi-jedi.org).另一种是使用DelphiX控件.在这里我们准备使用jedi的DirectX声明包来开发DirectX游戏,之所以选择DirectX声明包是因为这样是以SDK方式来开发游戏,以后如果需要转到其它语言也不必重新学习DirectX.至于DelphiX控件我没用过,没发言权,不过偶是不用日货的 ;-)
先到以下地址下载DirectX的声明包(.NET/DOWNLOAD/files/directx7.rar">http://kuga.51.net/download/files/directx7.rar),并解压到你自定的目录中.再在DELPHI中选择Tools->Environment Options,在打开的窗口中选择Library选项卡,点击Library Path后面的按钮.会弹出来一个Directories窗口,再点击Greyed items denote invalid path右边的按钮.选择DirectX声明解压到的目录.再点击ADD按钮,这样就把DirectX声明所在的目录添加到了DELPHI 的Library路径中.就可以直接在uses中引用DirectX声明中的单元了.这个声明包里自带了几个例子,可以作为入门的参考.
调试经验:
开发全屏游戏时最好把设计时的屏幕分辩率设为和游戏一样的分辩率,以免调试时频繁切换分辩率而损伤屏幕.
开发全屏游戏最好是在win2000/XP下,不然在98下调试时游戏进入死循环或产生异常时.机子很容易就会当掉.在2000/XP下全屏游戏进入死循环时可以按ALT+TAB切换到DELPHI中(但这时由于DirectX游戏是全屏,独占了屏幕,屏幕上不会有变化,所以要多试几次),按CTRL+F2就可以结束游戏.如果是异常的话,切换到DELPHI中先按下回车再按CTRL+F2就可以结束调试游戏了.
注意:
如果你是使用DELPHI7的话,请把DirectDraw.pas中的145行{$IFDEF VER140}改为{$IFDEF VER150}才能正常编释.
最好使用api的方式来建立游戏主窗口而不是使用VCL的TFORM类.
先让我们来看看用C++和DELPHI初始化DirectDraw对像的代码段.
c++版:
BOOL InitDDraw( )
{
LPDIRECTDRAW7 lpDD; // DirectDraw对象的指针
if ( DirectDrawCreateEx (NULL, (void **)&lpDD, IID_IDirectDraw7, 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( 640, 480, 32, 0, DDSDM_STANDARDVGAMODE ) != DD_OK )
return FALSE; {置显示模式}
}
DELPHI版:
function TForm1.InitDirectDraw: Boolean;
var
lpDD: IDirectDraw7;
begin
Result := False; {先假设初始化失败}
{建立DirectDraw对象}
if DirectDrawCreateEx(nil, lpDD, IID_IDIRECTDRAW7, nil) <> DD_OK then
exit;
{设定DirectDraw的控制级,第一个参数为DirectDraw窗口的句柄,这里把控级级设为的全屏加独占模式}
if lpDD.SetCooperativeLevel(Hwnd, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK then
exit;
{设定显示模式,第一,二个参数为分辩率大小,第三个参数用来设置显示模式的颜色位数,
第四个参数设定屏幕的刷新率,0为默认值,第四个参数唯一有效的值只有DDSDM_STANDARDVGAMODE}
if lpDD.SetDisplayMode(640, 480, 32, 0, DDSDM_STANDARDVGAMODE) <> DD_OK then
exit;
Result := True;
end;
可以看出来,这二段代码除了语法和对象名外完全一样,只要了解了这点,我们完全可以参考VC或C++的资料,然后用DELPHI做出自己的游戏了.DELPHI中DirectX声明中的对象名,结构名和VC不一样,一般的对应关系如下:
DELPHI VC
DirectDraw对象 IDirectDraw7 LPDIRECTDRAW7
页面对象 IDirectDrawSurface7 LPDIRECTDRAWSURFACE7
DirectDraw的页面描述 TDDSurfaceDesc2 DDSURFACEDESC2
基本上只是前缀不一样,由于篇幅,这儿就不一一列出所有对像和结构了.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-963791/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10752043/viewspace-963791/
用DELPHI开发DirectX游戏 (转)相关推荐
- DirectX游戏开发之代码的框架简析
DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...
- DirectX游戏开发之一个API玩转音乐
DirectX游戏开发之一个API玩转音乐 当你闭上眼睛,打开一款游戏,如刺客信条,英雄联盟,DNF,或者是当有一个人坐在你背后玩一款新游戏,第一时间吸引你的是什么? 没错,就是各种游戏的音效,包括背 ...
- 075_《Delphi图形和游戏编程突破》
<Delphi图形和游戏编程突破> Delphi 教程 系列书籍 (075) <Delphi图形和游戏编程突破> 网友(邦)整理 EMail: shuaihj@163.com ...
- DirectX游戏开发之2D文字的实现
DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...
- 关于用DELPHI开发服务器软件中的一些经验
保存 评价 游戏规则 免费注册 资料下载 关于本站 问题分类 编程问题 非技术题 富翁列表 我的信息 提出问题 在线富翁 富翁日历 笔记列表 我的笔记 写作笔记 全文检索 <专家门诊> / ...
- c#垂直投影法_【游戏开发】游戏后期特效#3:垂直雾(Vertical Fog)
原标题:[游戏开发]游戏后期特效#3:垂直雾(Vertical Fog) 关注"indienova",挖掘独立游戏的更多乐趣 1开始之前 在之前的文章中有前辈提到大萌喵的写作风格的 ...
- 用Delphi开发的名程序有哪些
我所知道DELPHI开发的程序,有少部份可能是BCB开发的,反正都是VCL: 比特精灵 金山毒霸 酷狗 SKYPE 速达ERP/有人说是BCB开发的 天心ERP 鼎新ERP WORKFLOW 神州数码 ...
- java游戏开发(java游戏开发教程)
Java游戏开发绘图器是什么呢? 众所周知,Java GUI以paint进行绘图,以repaint进行图像刷新,而完成repaint及paint这一连贯过程中所用到绘图组件,我将其称为绘图器.就我个人 ...
- [推荐]C#快速开发3d游戏工具--Unity3d
最近有幸接触了一点Unity3d的东西,和大家分享一下. Unity3d 简介 是一款可视化的,3d游戏开发软件.可以进行手动绘制3d场景,自己添加摄像机角度,3d模型设计,事件触发,对于园子里大家很 ...
最新文章
- LeetCode OJ:Pascal's TriangleII(帕斯卡三角II)
- [linux基础学习]文件和目录属性
- JS转换HTML转义符
- linux——系统排错之引导恢复shell
- pymysql建表_Python数据库操作,针对pymysql 和 MYSQL数据库
- 关于access数据库打不开
- java 算法 数组_常见算法总结 - 数组篇
- 《史记》记载的喝粥延命内容
- python爬取下载有妖气漫画网站免费漫画
- 【opencv】凹点切分,种子计数,细胞计数前提 17/7/25更新
- android终端模拟器 apt,借贵吧问个安卓终端模拟器的问题
- 小说作者推荐:漫漫何其多合集
- Win10邮件应用怎么添加网易邮箱
- 1. HTML5+CSS3
- windowsmobile软件_经验:CSPJ/S初赛知识点整理(NOIP硬件与软件基础)
- Tez的web UI简单体验
- 约瑟夫问题(丢手绢问题)
- 模型的偏差、方差分析
- 1:Android Studio开发蓝牙上位机--环境搭建
- 黑苹果OC引导AX201网卡教程,小新Pro13不换网卡也能上网
热门文章
- 席八,迭代创建链表就是个坑货
- 6.27王者荣耀说服务器在维护,2019.6.27 王者荣耀更新内容 6月27日王者荣耀更新内容...
- MFC--关于NOTIFYICONDATA的一些新特性
- 计算机领域核心期刊 国际,计算机国际核心期刊
- java调用shell脚本_Java 执行Shell脚本指令
- JavaScript高级(详细总结)
- 【软件工程基础实验】使用CheckStyle工具对生命游戏代码进行代码审查和修改
- 阻焊层solder mask助焊层paste mask
- Segment Anything Model (SAM)——分割一切,具有预测提示输入的图像分割实践
- Unity3D赛车游戏+脚本基础