游戏引擎的工作原理与应用
游戏引擎的工作原理与应用
附件:
游戏引擎的工作原理与应用
--“潜艇大战”游戏的制作
郑州 赵旺
下载地址:
做一个小巧而又好玩的游戏是每一个软件爱好者的梦想,当然我们不可能一下子做出像《仙剑》和《星际争霸》这样的游戏,因为这些游戏的开发需要非常专业的知识,也需要大量的人力及物力。目前主流游戏开发环境是 C++和技术,开发要涉及到许多算法如:A*算法(寻找路径)等,主要技术还有Alpha光影以及人工智能技术。对于初学者来说,这些技术都不是在短时间内可以完成的。单就是 C++开发工具的入门也需要花很大一段时间学习,“聪明的程序员是学,真正的程序员是学习VC++的”,是一个好学易用的开发工具,用VC来开发商业游戏和用来开发,他们的制作原理都是大同小异的,我们可以用它来实现一个简单的游戏引擎,让您对游戏开发原理有一个感性认识。下面我将逐步介绍“潜艇大战”游戏的制作过程,等到您对开发过程熟悉了我们就可以用VC++和技术来开发更好的游戏软件。下面是游戏的一张截图。有兴趣的读者可以发信到我的信箱索要程序或者讨论游戏制作方面的问题,我的: 主页:
一 游戏的工作原理
在具体制作程序之前,我们先总的介绍一下游戏的工作原理,他是制作的总纲。懂得了原理,我们就不会对具体的编程迷惑不解了。对于一个游戏制作者来说,游戏可以分为代码部分(游戏引擎)和游戏资源两部分,代码部分其实是一个控制中枢,他是游戏的大脑,也是游戏的灵魂,它负责将游戏所需的各种资源如图像资源,声音资源等按要求调用,例如本程序中各种潜艇的运动,实际上是程序控制各种潜艇图像文件在指定区域移动。游戏资源包括图像资源,声音资源等,他是游戏的对外表现,像人的外表一样。例如在该游戏中各种潜艇的图片。当然,这些图片在编译时我已经将他们包涵在可执行文件中(即exe文件)。所以说,我们在编程前要准备一些游戏用到的图片,你可以从我做的游戏截图获得,这是游戏制作爱好者的一件法宝^-^。由于是向朋友们介绍游戏制作的基本知识,我暂时没有在引擎中加入处理声音的程序模块。
二 游戏的具体制作
1. 游戏的主要模块
“潜艇大战”游戏主要分为运动模块,战斗模块,事件处理模块。运动模块主要负责我方潜艇的各种运动以及敌方各种潜艇和水母的运动。他像人们控制肢体运动的神经。战斗模块包括我方深水炸弹的攻击,敌方导弹的攻击(包括跟踪导弹的攻击),敌方中弹后的爆炸场面的显示。事件处理模块包括我方军舰获得一定的分数后游戏局数和游戏的难度的增加,例如,玩家在打过第二局后,程序启动跟踪导弹的处理程序,导弹开始跟踪军舰。其实在各种RPG(角色扮演游戏),ARPG(即时战斗角色扮演游戏)和SLG(即时战略游戏)中,运动模块,战斗模块,事件处理模块都起着极其重要的作用。
2.编写程序
数据字典:
:游戏背景图片
:跟踪导弹图像
:我方军舰图像
:大潜艇图像
:对方潜艇的图像
:爆炸图像
:导弹图像
:用来显示游戏的分数
:水母图像
:用来显示船数
:水雷图像
:用来显示游戏的轮数
:深水炸弹图像
.应用程序的建立:运行,选择主菜单的File下的New 选项,创建一个应用程序。此时会看到Form1窗体,选择主菜单的File下的New选项,在弹出的New Items对话框的New页面中选择Form,按OK按键。这时会出现Form2窗体,在该窗体中设计游戏版权等信息,如图2。
.主菜单的建立:在控件栏的中按下选项,在Form1中单击鼠标左键,这时会在Form1中会看到一个控件,双击该控件,在 窗体中选择选项,输入菜单的名称,依此建立如图3,图4所示的菜单选项。
图3
图4
.游戏资源的加入:因为程序中未用到声音文件,这里所说的游戏资源主要指的是图像文件。单击控件栏的选项,选择Image控件,在Form1上单击鼠标左键,在Form1上出现一个Image控件,双击该控件,在弹出的 对话框中按下"Load..."按钮,在Load 对话框中选择游戏的背景图片,将 的的属性改为True,调整Form1的宽度和高度,使游戏背景图片占满整个窗体,如图5。
图5
然后按照上述方法加入各种潜艇和武器的图像。如图6。
图6
我们可以在以后编写的程序中控制这些图像文件。当然,游戏中用到的图象文件也可以直接存放在磁盘上,由我们编写的引擎来调用,在各种大型商业游戏中大多采用这种方法,因为该游戏用到的图像文件较少,所以我将它们包含在可执行文件中了。
.游戏参数的显示:游戏中要显示游戏轮数,游戏分数,玩家拥有的军舰数目等信息,这写信息的数值由游戏引擎计算和控制。信息的内容可以由控件栏选项中的Label控件的属性值来显示。添加该控件的方法同上。更改相应Label控件的属性值即可即时显示相关信息。见图7。
图7
.运动模块的编程
游戏中的物体应是运动的,对此我们需要一个连续控制物体运动的监测和控制器。在中,我们可以用Timer控件来实现。对于每一个图片,它都有Left和Top属性,在Timer控件的每一个时间间隔内根据引擎或用户按键来更改图片的Left和Top属性就可以调整图像在显示区域的位置,从而实现物体的运动。
(1)对方潜艇的控制:首先选择控件栏页面下的Timer控件,在Form1上单击鼠标左键,建立一个Timer控件,在 窗体中将Timer控件的的值改为10,双击Timer控件,在弹出的代码窗体中输入如下代码:
if . )then
.Left:=.Left-20;
if (chr(Key)in [’L’,’l’])and(.Left
.Left:=.Left+20;
其中是我方军舰图像控件的名称,chr(Key) in [’J’,’j’]用于判断用户是否按下键盘的’J’,’j’按键,当用户按下’J’,’j’按键后当的位置不在窗体最左边时向左移动20个单位,chr(Key) in [’L’,’l’]用于判断用户是否按下键盘的’L’,’l’按键,当用户按下’L’,’l’按键后当的位置不在窗体最右边时向右移动20个单位。
(3)导弹的控制:由于导弹从水下向水面上方运动,只要改动相应图像的Top属性即可,代码如下:
if >=50 then //控制导弹不浮出水面
begin
:=-6; //导弹徐徐上升
.:=True //显示导弹
end
else
.:=False; //隐藏导弹
是导弹图像控件的名称,当导弹浮出水面时,导弹应消失,所以
第二局开始后会出现跟踪导弹,这时只需在一定时间间隔内调整导弹位置,使导弹竖直方位和军舰竖直方 位一致即可。
if .=True then //是跟踪导弹图像控件的名称
.Left:=.Left; //导弹自动跟踪船体
当然我们还可以设计一个调整导弹位置的程序模块,逐渐调整导弹位置,这样程序运行起来会更好看。
(4)水母的控制:水母从水面向上运动的程序原理同上,代码如下:
if >=50 then
begin
:=-10;
.:=True
end
else if 10)and (.Left
.Left:=.Left+10;
end;
是水母图像控件的名称,当水母浮出水面时,水母会向左方或右方移动,因此当=50 then
begin
:=-6;
.:=True
end
else
.:=False;
程序原理同上。
(6)深水炸弹的控制:是深水炸弹图像控件的名称
//当用户按下’K’,’k’按键后,显示深水炸弹
if (Key in [’K’,’k’]) and (.=False) then
begin
.:=True; //显示深水炸弹
.Top:=56; //显示深水炸弹的位置
.Left:=.left+20;
end;
//由程序控制深水炸弹的运动
if =320 then
.:=False;
.战斗模块的编程
战斗模块可以概括为两大类,一是我方军舰发射的深水炸弹击中敌方潜艇或水母,另外是敌方潜艇发射的导弹或水雷击中军舰。如何判断深水炸弹或导弹是否击中目标呢?我们可以通过判断深水炸弹或导弹的位置是否在要攻击目标图像控件的矩型区域即可。
击中的条件如下:
要攻击目标图像控件的Left属性的数值