潜艇大战 游戏的制作



prefix = o />

个小巧而又好玩游戏是每个软件Software爱好者梦想当然我们不可能下子做出像仙剑星际争霸这样游戏这些游戏开发需要非常专业知识也需要大量人力及物力目前主流游戏开发环境是Visual C和Directx技术开发要涉及到许多算法如:A*算法(寻找路径)等主要技术还有Alpha光影以及人工智能技术对于初学者来说这些技术都不是在短时间内可以完成单就是Visual C开发工具入门也需要花很大段时间学习“聪明员是学Delphi,真正员是学习VCDelphi是个好学易用开发工具,用VC来开发商业游戏和用Delphi来开发他们制作原理都是大同小异我们可以用它来实现个简单游戏引擎让您对游戏开发原理有个感性认识下面我将逐步介绍“潜艇大战”游戏制作过程等到您对开发过程熟悉了我们就可以用VC和Directx技术来开发更好游戏软件Software下面是游戏张截图有兴趣读者可以发信到我信箱索要或者讨论游戏制作方面问题e_mail: [email protected] 主页:http://creativesoft.home.shangdu.net

prefix = v /> lineDrawn pixelLineWidth 0 \">

图1

游戏工作原理

在具体制作的前我们先总介绍下游戏工作原理他是制作总纲懂得了原理我们就不会对具体编程迷惑不解了对于个游戏制作者来说游戏可以分为代码部分(游戏引擎)和游戏资源两部分代码部分其实是个控制中枢他是游戏大脑也是游戏灵魂它负责将游戏所需各种资源如图像资源声音资源等按要求例如本中各种潜艇运动实际上是控制各种潜艇图像文件在指定区域移动游戏资源包括图像资源声音资源等他是游戏对外表现像人外表例如在该游戏中各种潜艇图片当然这些图片在编译时我已经将他们包涵在可执行文件中(即exe文件)所以说我们在编程前要准备些游戏用到图片你可以从我做游戏截图获得这是游戏制作爱好者件法宝^-^由于是向朋友们介绍游戏制作基本知识我暂时没有在引擎中加入处理声音模块



2 游戏具体制作

1. 游戏主要模块

“潜艇大战”游戏主要分为运动模块战斗模块事件处理模块运动模块主要负责我方潜艇各种运动以及敌方各种潜艇和水母运动他像人们控制肢体运动神经战斗模块包括我方深水炸弹攻击敌方导弹攻击(包括跟踪导弹攻击)敌方中弹后爆炸场面显示事件处理模块包括我方军舰获得分数后游戏局数和游戏难度增加例如玩家在打过第 2局后启动跟踪导弹处理导弹开始跟踪军舰其实在各种RPG(角色扮演游戏)ARPG(即时战斗角色扮演游戏)和SLG(即时战略游戏)中运动模块战斗模块事件处理模块都起着极其重要作用

2.编写





数据字典:

Image1:游戏背景图片

Image8:跟踪导弹图像


Image2:我方军舰图像

Image9:大潜艇图像


Image3:对方潜艇图像

Image10:爆炸图像


Image4:导弹图像

Label1:用来显示游戏分数


Image5:水母图像

Label2:用来显示船数




Image6:水雷图像

label3:用来显示游戏轮数


Image7:深水炸弹图像







<1>.应用建立:运行Delphi选择主菜单File下New Application选项,创建个应用此时会看到Form1窗体,选择主菜单File下New选项在弹出New Items对话框New页面中选择Form按OK按键这时会出现Form2窗体,在该窗体中设计游戏版权等信息如图2



图2

<2>.主菜单建立:在Control控件栏Standard中按下MainMenu选项在Form1中单击鼠标左键,这时会在Form1中会看到个MainMenuControl控件双击该Control控件在Object Inspector 窗体中选择Caption选项输入菜单名称依此建立如图3图4所示菜单选项



3



4

<3>.游戏资源加入:中未用到声音文件这里所说游戏资源主要指是图像文件单击Control控件栏Addtional选项选择ImageControl控件在Form1上单击鼠标左键在Form1上出现个ImageControl控件双击该Control控件在弹出Picture Editor对话框中按下\"Load...\"按钮在Load Picture对话框中选择游戏背景图片将Object Inspector Image1AutoSize属性改为True调整Form1宽度和高度使游戏背景图片占满整个窗体如图5



5



然后按照上述思路方法加入各种潜艇和武器图像如图6



6

我们可以在以后编写中控制这些图像文件当然游戏中用到图象文件也可以直接存放在磁盘上由我们编写引擎来在各种大型商业游戏中大多采用这种思路方法该游戏用到图像文件较少所以我将它们包含在可执行文件中了

<4>.游戏参数显示:游戏中要显示游戏轮数游戏分数玩家拥有军舰数目等信息这写信息数值由游戏引擎计算和控制信息内容可以由Control控件栏Standard选项中LabelControl控件Caption属性值来显示添加该Control控件思路方法同上更改相应LabelControl控件Caption属性值即可即时显示相关信息见图7



图7

<5>.运动模块编程

游戏中物体应是运动对此我们需要个连续控制物体运动监测和控制器在Delphi中我们可以用TimerControl控件来实现对于每个图片它都有Left和Top属性在TimerControl控件个时间间隔内根据引擎或用户按键来更改图片Left和Top属性就可以调整图像在显示区域位置从而实现物体运动



(1)对方潜艇控制:首先选择Control控件栏页面下TimerControl控件在Form1上单击鼠标左键建立个TimerControl控件在Object Inspector 窗体中将TimerControl控件Interval值改为10双击TimerControl控件在弹出代码窗体中输入如下代码:



image3.Left<=2 then //到图片最左边后潜艇停下来并消失

image3.Left:=430 //到图片最左边后潜艇到最右边



image3.Left:=image3.Left-3; //不到最左边则潜艇向左移



image3是对方潜艇图像Control控件名称其它各种潜艇运动部分代码同上



(2)我方军舰控制:主要代码如下:



(chr(Key) in [\'J\',\'j\']) and (image2.Left>10 )then

image2.Left:=image2.Left-20;

(chr(Key)in [\'L\',\'l\'])and(image2.Left<420) then



image2.Left:=image2.Left+20;



其中image2是我方军舰图像Control控件名称chr(Key) in [\'J\',\'j\']用于判断用户是否按下键盘\'J\',\'j\'按键当用户按下\'J\',\'j\'按键后当image2位置不在窗体最左边时image2向左移动20个单位chr(Key) in [\'L\',\'l\']用于判断用户是否按下键盘\'L\',\'l\'按键当用户按下\'L\',\'l\'按键后当image2位置不在窗体最右边时image2向右移动20个单位



(3)导弹控制:由于导弹从水下向水面上方运动只要改动相应图像Top属性即可代码如下:



image4.top>=50 then //控制导弹不浮出水面

begin

image4.top:=image4.top-6; //导弹徐徐上升

image4.Visible:=True //显示导弹

end



image4.Visible:=False; //隐藏导弹



image4是导弹图像Control控件名称当导弹浮出水面时导弹应消失所以image4.top<50时隐藏导弹



第 2局开始后会出现跟踪导弹这时只需在定时间间隔内调整导弹位置使导弹竖直方位和军舰竖直方 位致即可

image8.Visible=True then //image8是跟踪导弹图像Control控件名称

image8.Left:=image2.Left; //导弹自动跟踪船体



当然我们还可以设计个调整导弹位置模块逐渐调整导弹位置这样运行起来会更好看



(4)水母控制:水母从水面向上运动原理同上代码如下:



image5.top>=50 then

begin

image5.top:=image5.top-10;



image5.Visible:=True

end

image5.top<=48 then

begin

image5.top:=48;

//控制水母向右运动

(image5.left>10)and (image5.Left<460) then

image5.Left:=image5.Left+10;

end;

image5是水母图像Control控件名称当水母浮出水面时水母会向左方或右方移动因此当image5.top<=48即水母已经浮出水面我们可以更改其图像Control控件Left属性来控制它向右运动



(5)水雷控制:



image6.top>=50 then

begin

image6.top:=image6.top-6;

image6.Visible:=True

end



image6.Visible:=False;



原理同上



(6)深水炸弹控制:image7是深水炸弹图像Control控件名称



//当用户按下\'K\',\'k\'按键后显示深水炸弹

(Key in [\'K\',\'k\']) and (image7.Visible=False) then

begin

image7.Visible:=True; //显示深水炸弹

image7.Top:=56; //显示深水炸弹位置

image7.Left:=image2.left+20;



end;

//由控制深水炸弹运动

image7.top<=320 then

image7.top:=image7.top+10;

image7.top>=320 then

image7.Visible:=False;



<6>.战斗模块编程

战斗模块可以概括为两大类是我方军舰发射深水炸弹击中敌方潜艇或水母另外是敌方潜艇发射导弹或水雷击中军舰如何判断深水炸弹或导弹是否击中目标呢?我们可以通过判断深水炸弹或导弹位置是否在要攻击目标图像Control控件矩型区域即可

击中条件如下:

要攻击目标图像Control控件Left属性数值<=深水炸弹或导弹Left属性数值<=要攻击目标图像Control控件Left属性数值+要攻击目标图像Control控件Width属性数值

并且

要攻击目标图像Control控件Top属性数值<=深水炸弹或导弹Top属性数值<=要攻击目标图像Control控件Top属性数值+要攻击目标图像Control控件Height属性数值

(1)我方军舰发射深水炸弹击中敌方潜艇或水母



//判断敌方潜艇是否被深水炸弹击中

(image7.visible=True)and(90<=image7.Top)and(image7.Top<=120)and (image7.Left>=image3.Left)and(image7.left<=(image3.left+image3.Width)) then

begin

image3.visible:=False; //显示敌方潜艇被击中后情景

image10.Left:=image3.Left; //显示敌方潜艇被击中后爆炸图像

image10.Top:=image3.Top; //使敌方潜艇高度和爆炸体高度

image10.visible:=True;

label1.Caption:=IntToStr(StrToInt(label1.Caption)+10); //分数加十

image3.Left:=435; //敌方潜艇被击中后敌方潜艇从最右边出现



image7.visible:=False; //第枚深水炸弹爆炸掉了

end;



其中image3是对方潜艇图像Control控件名称image7是深水炸弹图像Control控件名称其它潜艇和水母被深水炸弹击中模块同上



(2)敌方潜艇发射导弹或水雷击中军舰



//判断船是否被导弹击中

(image4.visible=True)and(45<=image4.Top)and(image4.Top<=50)and (image2.Left<=image4.Left)and(image4.left<=(image2.left+image2.Width)) then

begin

image2.visible:=False; //显示船被击中后情景

image10.visible:=True; //显示敌方潜艇被击中后爆炸图像

image10.Left:=image2.Left; //确定爆炸图像显示位置

image10.Top:=image2.Top;

end;



其中image2是我方军舰图像Control控件名称image4是导弹图像Control控件名称判断船是否被水雷击中只要将导弹图像换为水雷图像即可



<7>事件处理模块编程

游戏中事件处理主要有:游戏开始及结束控制游戏分数记录游戏局数和轮数增加游戏难易程度控制等下面我将这些事件处理编程窍门技巧和思路方法逐介绍给大家



(1)游戏开始及结束控制:

游戏开始般要对游戏各种参数进行初试化即对游戏各种参数赋予开始值代码如下:



timer1.Enabled:=True; //开始控制船及各种潜艇运动

image2.Visible:=True; //显示船体

image7.visible:=False; //隐藏深水炸弹image7是深水炸弹图像Control控件名称



label2.Caption:=tostr(2); //船数置2label2用于显示船数

label1.Caption:=\'0\'; //从0从新开始记分label1用于显示分数

//隐藏水母

image5.Visible:=False; //image5是水母图像Control控件名称

label3.Caption:=\'0\'; //游戏从第轮开始



(2)游戏分数记录:

游戏分数记录只需更改相应labelControl控件Caption值即可当我方发射深水炸弹击中对方潜艇时以下即可读者朋友可看战斗模块编程(1)我方军舰发射深水炸弹击中敌方潜艇或水母部分



//label1用于显示分数

label1.Caption:=IntToStr(StrToInt(label1.Caption)+10);//分数加十

(3)游戏局数和轮数增加:

游戏局数和轮数是随着用户获得分值增加或运行游戏时间来增加在该我主要根据用户获得分值来改变游戏局数和轮数代码如下:



score:=StrToInt(label1.Caption); //score是用户获得分值

(score>=150)and(score<=170)and(image2.Visible=True) then //第 2局开始

begin

label3.Caption:=\'第 2局开始\';

image8.Visible:=True; //image8是跟踪导弹图像Control控件名称

end;

(score>=270)and(score<=290)and(image2.Visible=True) then //第 3局开始

begin //出现水母

image5.Visible:=True; //image5是水母图像Control控件名称

label3.Caption:=\'第 3局开始\';

end;



(score>=380)and(score<=400)and(image2.Visible=True) then //第 4局开始

begin

image9.Left:=110; //image9是大潜艇图像Control控件名称

image9.Visible:=True; //出现大潜艇

label1.Caption:=\'第 4局开始\';

end;

score>=550 then //下轮第局开始

begin

label1.Caption:=\'0\'; //从0从新开始记分

//隐藏水母

image5.Visible:=False;

image9.Visible:=False; //隐藏大潜艇

//label3用来显示游戏轮数

label3.Caption:=IntToStr(StrToInt(label3.Caption)+1); //游戏轮数加

label2.Caption:=IntToStr(StrToInt(label2.Caption)+3); //奖船 3艘

end;

(4)游戏难易程度控制:

游戏难易程度控制可以通过变动敌方潜艇数量和敌方潜艇发射导弹和水雷数量和快慢来控制在该随着游戏局数增加会出现水母大潜艇来增加游戏难度实现见上面“游戏局数和轮数增加”部分代码当然也可以改动敌方潜艇属性来增加游戏难度



<8>游戏中其它部分

游戏主菜单各选项代码可参考以上对应部分代码比如游戏重新开始可以参考“事件处理模块编程”“游戏开始及结束控制”部分这里不在叙述

最后将游戏成绩存储在磁盘上只需将用户输入名称和用来显示游戏分数label1Caption属性值用来显示游戏轮数label3Caption属性值及游戏运行日期存储到文件中即可

通过上述介绍我想大家会对游戏开发有个完整认识其实用VC或Delphi开发游戏本质上都是用VC和Directx技术来开发游戏需要对Windows操作系统有更深入了解要用到大量系统数据结构和算法但是只要您对设计原理理解了用VC和Directx技术来开发游戏也会容易许多由于本人水平有限文章中或不当的处还请读者朋友们指正欢迎朋友们来信讨论游戏制作方面问题





Tags: 

延伸阅读

最新评论

发表评论