人气 379

[游戏程序] 用Delphi编写OpenGL导学——上 [复制链接]

九艺网 2017-3-10 17:02:20

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
      写教学文章我还没有什么经验,而且我的时间不是很充足,肯定有考虑不到的地方。所以目前所写的并不是最终稿,希望大家看后,多提意见和建议,我会采纳合理的提议,在日后陆续把这篇教学补充完整。

                               
登录/注册后可看大图


      开始正式教学之前,我要提醒读者注意。我写的导学不是Delphi语言教学,也不是OpenGL教学,因为这两方面的教学你可以很容易地找到。我写的导学是让大家知道如何用Delphi编写OpenGL,而且只能帮大家入门,以后的路要靠大家自己的努力了。
      我将分两篇讲解相关内容。上篇讲的是大家容易忽略的一些有关Delphi的问题。下篇讲的是如何用Delphi编写OpenGL程序。
      言归正传。我以Delphi2006为例,讲解如何用Delphi编写OpenGL程序。
注:Turbo Delphi 就是Delphi2006,减少了一些功能,不过不影响OpenGL编程
      Delphi的安装和使用我不用讲了吧。(什么,你不会?!……,……,……如果你不会安装和使用,可以到网上下载中文版的 Delphi 7 从入门到精通 看看)
我给个地址,大家要用迅雷下载
http://www.delphifans.com/dl.asp?no=2&id=1227&size=38093

                               
登录/注册后可看大图

      好了,先解释一下Delphi的文件结构吧。
      以前一个完整的Delphi程序是由一个 dpr 文件,一个 res文件,数个 dfm 和 pas 文件组成的。新的Delphi又多了 bdsproj 文件。当然,还有其它的文件。不过,我说的是最重要的文件。你在保存源代码时需要保存的,只有 dpr res dfm 和 pas 文件。
这四种文件里,
dpr 是项目文件,也是一个Delphi程序开始的地方。如果你要写纯API程序(不太大的),只需要一个 dpr 文件就行了。
res 文件是资源文件,用于保存程序的图标,字串等资源。你不用太在意它,写OpenGL程序用不到的。
dfm 文件是窗体文件,你在IDE(集成开发环境)环境里对窗体进行的修改,就保存在此文件里。它比 res 文件重要多了,不过你也不用费力学习,dfm 的使用只是在IDE里设置一些参数而已,十分简单。
pas 文件就是你以后要经常打交道的文件。你写的源代码都保存在这种文件里。
Delphi(也就是面向对象的Pascal)语言的具体细节书里都有,我只讲需要注意的一些情况。
每一个语句都需要用 分号 ; 结尾。一定要注意这一点!

                               
登录/注册后可看大图

不过有例外,如果 if 语句用了else,那么else前一行语句不用 分号 结尾,如
if i = 10 then
  j := 100   

                               
登录/注册后可看大图

else
  j := 1000;
if i = 10 then
  j := 100     

                               
登录/注册后可看大图

else
if i = 100 then
  j := 10;
其实无论几行,else前面的语句都不加分号。如
if i = 10 then
begin
  x := 123;
  y := 456;
end   

                               
登录/注册后可看大图

else
begin
  x := 456;
  y := 123;
end;
赋值语句要用 冒号加等号 :=   如 i := 10;
循环语句和赋值语句一样        如 for i := 1 to 10 do
注意:如果从大到小,循环语句要这样写 for i := 10 downto 1 do
判断是否相等只用   等号 =     如 if i = 10 then  while i = 10 then
如果你需要最高效灵活地使用数组,应该使用指针数组。下面是使用举例。
MyArray : PByteArray;  //先声名指针数组类型
......
GetMem(MyArray, SizeOf(Byte) * 16384);  //使用前分配内存,数组类型*数组大小
......
MyArray[x] := n;                       //使用时和一维数组一样。注意,x 不要大于分配内存时定义的数组大小,n 不要超出数组类型的定义范围(Byte 是 0~255)
......
FreeMem(MyArray, SizeOf(Byte) * 16384); //使用后释放内存,必须和分配的大小一样
只要你的内存够大,数组的大小是没有限制的。
Delphi有两类指针数组,一个是Byte型的PByteArray,还有一个是Word型的PWordArray;不够用吗?那么看看两种指针数组的声明,你应该知道如何自己定义指针数组了。
  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;
  PWordArray = ^TWordArray;
  TWordArray = array[0..16383] of Word;
还有一个问题,指针数组是一维的,如何实现多维数组呢?
假设你声明了一个二维数组 MyArray : array[1..X,1..Y] of Integer; (X行 Y列)
数组的 i,j 位置是 MyArray[i,j]
如果用指针数组,要找到 i,j 的位置,用下面的公式 MyPointerArray[(i - 1) * Y + j]
注意,这是从 1 开始的数组,如果是从 0 开始的数组,上面的公式得到的结果要减去 1 。
下面是三维数组的情况
假设你声明了一个三维数组 MyArray : array[1..X,1..Y,1..Z] of Integer;
数组的 i,j,k 位置是 MyArray[i,j,k]
如果用指针数组,要找到 i,j,k 的位置,用下面的公式 MyPointerArray[(i - 1) * Y * Z + (j - 1) * Z + k]
同样,这是从 1 开始的数组,如果是从 0 开始的数组,上面的公式得到的结果要减去 1 。
这回就不容易理解了,不过不用担心,不妨碍使用。
更多维的数组可以以此类推,我就不多说了。
如果想了解更多,你可以看看有关数据结构的教材,那里讲的更详细。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-20 04:29 , Processed in 0.126001 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.