APP下载

游戏程序设计教学案例

2009-05-22吴志辉

计算机教育 2009年6期
关键词:编辑器敌方炮弹

吴志辉

文章编号:1672-5913(2009)06-0074-03

摘要:游戏编写是游戏程序设计教程中很重要的内容。本文介绍了一个完整的2D游戏—坦克大战的开发过程,对游戏素材编辑、地图编辑和游戏主程序的设计做作了完整介绍和代码实现,使学生能完全掌握并应用到实际其它游戏的开发过程中。

关键词:计算机游戏;程序设计;地图;游戏引擎

中图分类号:G642

文献标识码:B

1游戏程序设计教程中的关键一环

计算机游戏程序设计,在许多的大学本科的教学中,并未正式纳入教学内容。由于市场对游戏设计人员的需求较大,薪水又高,出现了专业的游戏程序设计培训班。但收费偏高。我院根据这种状况,在学生创新实验室和第二课堂培训班,开设了游戏程序设计项目。

其中最重要的一环就是完成一个完整的游戏开发设计。我们精心挑选项目,选择了既有一定代表性、又有娱乐性、也带有一些人工智能的中小游戏——坦克大战。也使学生感受到了面向对象编程的强大功能,所学知识得到了真正的应用。

2相关知识学习

编写游戏程序,技术上需要具备两个条件。首先需要一个多媒体驱动开发包,如微软的DirectX;图像、动画、声音的快速、实时响应,是游戏逼真的前提条件。我们选择了日本的Hiroyuki Hori编写的免费开发包DelphiX,它较好的封装了微软的DirectX。里面有些错误,我们已经更正。其次,需要一个游戏引擎。游戏角色的碰撞是技术上较难的,对角色的生死管理也很重要。好的游戏引擎必须能快速高效的解决这些问题。DelphiX包中有一个简单的游戏引擎,我们稍加改造,足够我们编写简单的二维游戏程序。对这些知识加以介绍后,就可以进入正式的开发设计阶段。

3坦克大战游戏功能简介

(1) 关卡地图为三层地图,比较形象,可设计多样的地图式样。有专门的地图编辑器MapEdit.exe。

(2) 游戏有低、中、高三级。难度随时可调。

每关20辆基本敌方坦克。每过一关,敌方增加1(低)、2(中)或3(高)辆坦克。难度加大时,敌我双方的坦克速度、炮弹威力、炮弹速度、坦克生命力都有所增加。

(3) 每关地图有一个敌方Boss,它能爬山涉水,并自动朝我方推进,炮弹也朝我方射击。

(4) 宝物有16种,持续时间约15秒。如没有被敌我坦克拣到,自动爆炸消失:

散弹1:一次只能发一发炮弹;

散弹3:一次能发三发炮弹;

散弹5:一次能发射5颗炮弹;

增加子弹速度:一次加50;

减少子弹速度:一次减50;

增加炮弹威力:一次加50;

炮弹的半径大小有8、16、24三种。炮弹半径越大,越容易打中物体或坦克;

增加坦克生命力:一次加100;

坦克隐形宝物:坦克不可见,炮弹无法打中它;

坦克无敌模式:带防护罩,炮弹打中不“掉血”;只有20秒保护期;

定时器:对方坦克不能动弹和发射;

爬山涉水:坦克能过河上山。该特性只在本关有效;

呼唤飞机帮助:拣宝方大批飞机出现,并且狂轰烂炸,对方难逃厄运;

脑黄金:只对敌方有效。被我方炮弹打中后,自动掉头向我方移动并射击。

每关的第十分钟,大批敌方帮助飞机呼啸而来,请你在此之前消灭敌人,否则大难临头。逃过此劫,坚持到第15分钟,我方飞机呼啸而来......

(5) 每过一关,我方生命力增加200。

(6) 关卡地图文件名为Map???.map,最多999关。地图文件名编号为001~999,中途不能断号,否则,会从头开始玩起。

(7) 操作:

F1:帮助;F11音乐;F12:炮声;F3:暂停/继续;鼠标右键:游戏难度选择。

玩家一: 玩家二:暂无

空格:开炮, ←↑↓→移动方向

4素材库程序编写

在2D平面游戏中,地图画面由小块图片拼写出来。游戏角色也一样,动画效果只不过是不断改变图形罢了。所以第一个任务就是要建立地图素材库。对每种地形设置它的图片、生命力、是否阻碍坦克或炮弹通过等。图1是图库编辑器TileEdit.exe的一个运行界面。

为方便管理,我们分类建立地形,如云层、土地、房屋、树林等等。每类含有多个不同形状的地藐对象TTiles;如“水域”类,可以包含“海洋”、“湖泊”等。而每个地藐可以由数量不等的小图片组合而成。最小的小图片单元就是TTile对象(以后简称贴图)。这两个对象我们用Object Pascal语言(Delphi)实现。 素材管理程序代码2900多行(自编源代码)。

图库(素材库)编辑器是游戏程序开发的第一步,许多商业游戏并不提供图库编辑器。使玩家感到有所失望。提供图库编辑器无疑增加了游戏的吸引力,因为玩家可以重新设计整个游戏,也许坦克大战变成了潜艇大战。

5游戏地图编辑程序编写

一些商业游戏提供了地图编辑器,如“星际争霸”、“英雄无敌”等。图2是教程中设计的三层地图编辑器运行界面。

地图设计是决定游戏可玩性的重要因素之一。当今2D游戏,普遍采用多层地图,这样可以产生比较逼真的画面。游戏程序显示画面时,首先显示最低层的图层,再依次显示高层画面;这样就有立体感了。

地图由层(TLayer)组成,每层地图又由许多基本的单元格(TCell)组成,单元格的图像来源于素材库。首先要完成这两个基本对象的编写。最后编写地图编辑程序,它实现地图数据的载入、显示、修改、保存等基本功能。总代码约3400多行。

6游戏主程序编写

准备工作一切就序!开始编写游戏主程序。设计的思路是:先把游戏关卡对应地图装入画面,再按游戏规则产生敌我双方坦克。敌方坦克随机移动和发射炮弹,除非它吃了“脑黄金”。我方坦克受玩家控制运动方向和发射炮弹。运动速度和发射炮弹的数量受游戏参数限制。当我方坦克全部死亡,游戏结束。敌方每隔一定时间产生新坦克,直到规定的坦克数量。敌方坦克全部被消灭后,游戏结束,进入下一关。

学生难以理解的是,这么许多的游戏角色(也称“精灵”),程序如何管理它们,而这些精灵在不断的产生、不断地碰撞、不断地消亡。所以,必须有一个统一的管理机制。必须建立一个最基本的“精灵”类TSprite。该对象是系统中的一个核心类。看它的定义:

TSpriteEngine = class; //==预先声明“精灵引擎”类

TSprite = class

private

FEngine: TSpriteEngine; //==被“精灵引擎”管理

FParent: TSprite; //==用来判断其父类(产生者:如坦克死 亡,对应子弹也消失)

FList: TList; //==角色列表(被精灵引擎管理:保存的 是地址!)

FDeaded: Boolean; //== 是否死亡

FDrawList: TList; //== 需要绘制的角色列表

FCollisioned: Boolean; //== 是否需要碰撞检测

FMoved: Boolean; //== 能否移动

FVisible: Boolean; //== 是否可见

FX: Double; //== 平面坐标位置

FY: Double;

FZ: Integer; //==深度坐标,越小越在低层

FWidth: Integer; //==角色尺寸:宽和高

FHeight: Integer;

procedure Add(Sprite: TSprite); //==增加角色到列表FList中

procedure Remove(Sprite: TSprite); //==移走角色

procedure AddDrawList(Sprite: TSprite); //==增加角色到绘制角色列 表FDrawList中

procedure Collision2; //==碰撞检测

procedure Draw; //==绘制角色

function GetClientRect: TRect; //==得到角色大小

function GetCount: Integer; //==角色列表中角色数量

function GetItem(Index: Integer): TSprite; //==用索引取得角色

function GetWorldX: Double; //==获取角色在地图世界中的位置

function GetWorldY: Double;

procedure SetZ(Value: Integer); //==设置角色在地图层中的“深度”

protected

//==注意:所有virtual方法必须在子类中实现==//

procedure DoCollision(Sprite: TSprite; var Done: Boolean); virtual;

//==碰撞事件处理

procedure DoDraw; virtual; //==显示事件处理

procedure DoMove(MoveCount: Integer); virtual;//==移动事件处理

functionGetBoundsRect: TRect; virtual;

functionTestCollision(Sprite: TSprite): Boolean; virtual;

//==碰撞测试

public//==公布方法

constructor Create(AParent: TSprite); virtual;

destructor Destroy; override;

procedure Clear; //== 释放列表资源

function Collision: Integer; //==获取发生的碰撞次数

procedure Dead; //==死亡登记

procedure Move(MoveCount: Integer); //==移动所有角色

function GetSpriteAt(X, Y: Integer): TSprite; //==取得某位置处的 角色

property Death:Boolean Read FDeaded;//== 我们自己新发布的数 据,方便编程判断

end;

Tsprite实现了角色的移动和碰撞检测,并指定被哪个引擎管理。游戏中所有的角色都是从TSprite类继承下来的! 游戏中共有13个类,要一一实现,不要怕麻烦。它们是:

TTank = class(TImageSprite) //==坦克基类,TimageSprite继承自Tsprite

TEnemyBoss = class(TTank) //===敌方BOSS==//

TEnemyTank = class(TTank) //===敌方坦克

TMyTank = class(TTank) //===我方坦克

THelpPlane = class(TTank)//===支援飞机==//

TExplosion = class(TImageSprite) //===爆炸==//

TExplosionBig = class(TImageSprite) //===大爆炸==//

TExplosionRed = class(TImageSprite) //===红色爆炸==//

TGemSprite = class(TImageSprite) //===宝物对象===//

TScrollBackground = class(TBackgroundSprite) //背景1

TScrollBackground2 = class(TBackgroundSprite) //背景2

TTerrSprite = class(TImageSprite) //===地图对象===//

TBullet = class(TImageSprite) //子弹基类

还有一个非常重要的对象就是精灵引擎TspriteEngine;看它的功能定义:

TSpriteEngine = class(TSprite) //==注意:从Tsprite继承!

private

FAllCount: Integer; //==角色数量

FCollisionCount: Integer; //==碰撞次数

FCollisionDone: Boolean; //==碰撞检测完毕标志

FCollisionRect: TRect; //==碰撞区域

FCollisionSprite: TSprite; //==碰撞角色

FDeadList: TList; //==死亡角色列表

FDrawCount: Integer; //==绘制角色列表

FSurface: TDirectDrawSurface; //==绘制表面

FSurfaceRect: TRect;

procedure SetSurface(Value: TDirectDrawSurface);

public

constructor Create(AParent: TSprite); override;

destructor Destroy; override;

procedure Dead;

procedure Draw;

property AllCount: Integer read FAllCount;

property DrawCount: Integer read FDrawCount;

property Surface: TDirectDrawSurface read FSurface write SetSurface;

property SurfaceRect: TRect read FSurfaceRect;

end;

TSpriteEngine很简单,主要提供了一个死亡管理。角色死亡后,把自己加入到TspriteEngine的死亡列表即可;游戏程序中,必须不断调用TspriteEngine的Dead方法来释放死亡角色占用的资源。

Tsprite的子类根据游戏规则,都增加了一些功能。真正有意思的代码在炮弹类Tbullet的碰撞处理代码中。坦克得分、生命力变化都在代码中处理。

准备就绪,剩下的任务就是编写主控制程序了:根据当前关卡,装入相应地图(产生地图精灵),并建立敌我双方的坦克;由游戏定时器驱动游戏运行;由游戏“精灵引擎”驱动角色运动和死亡管理。整个主程序约5200多行。

整个系统除出部分公用代码,大约有1万多行自编源代码,比较适合培训设计。当学生弄清原理后,就完全可以随心所欲的修改程序,感到非常满足和自信。

参考文献:

[1] 陈宽达. Delphi深度历险[M]. 北京:科学出版社,2001.7.

[2] 耿卫东,陈为. 计算机游戏程序设计[M]. 北京:电子工业出版社,2005-3.

猜你喜欢

编辑器敌方炮弹
树上长“炮弹”
司空见惯感觉烦 锁屏画面快走开
装填炮弹
编辑精选APP
你距离微信创作达人还有多远?
“炮弹”表妹
水果大作战
积木炮弹
小罗汉拳技击术(上)
罗汉神打 (下)