游戏程序设计教学案例
计算机游戏程序设计,在许多的大学本科的教学中,并未正式纳入教学内容。由于市场对游戏设计人员的需求较大,薪水又高,出现了专业的游戏程序设计培训班。但收费偏高。我院根据这种状况,在学生创新实验室和第二课堂培训班,开设了游戏程序设计项目。
其中最重要的一环就是完成一个完整的游戏开发设计。我们精心挑选项目,选择了既有一定代表性、又有娱乐性、也带有一些人工智能的中小游戏——坦克大战。也使学生感受到了面向对象编程的强大功能,所学知识得到了真正的应用。
2相关知识学习
编写游戏程序,技术上需要具备两个条件。首先需要一个多媒体驱动开发包,如微软的DirectX;图像、动画、声音的快速、实时响应,是游戏逼真的前提条件。我们选择了日本的Hiroyuki Hori编写的免费开发包DelphiX,它较好的封装了微软的DirectX。里面有些错误,我们已经更正。其次,需要一个游戏引擎。游戏角的碰撞是技术上较难的,对角的生死管理也很重要。好的游戏引擎必须能快速高效的解决这些问题。DelphiX包中有一个简单的游戏引
擎,我们稍加改造,足够我们编写简单的二维游戏程序。对这些知识加以介绍后,就可以进入正式的开发设计阶段。
3坦克大战游戏功能简介
(1) 关卡地图为三层地图,比较形象,可设计多样的地图式样。有专门的地图编辑器
(2) 游戏有低、中、高三级。难度随时可调。
每关20辆基本敌方坦克。每过一关,敌方增加1()2()3()辆坦克。难度加大时,敌我双方的坦克速度、炮弹威力、炮弹速度、坦克生命力都有所增加。
(3) 每关地图有一个敌方Boss,它能爬山涉水,并自动朝我方推进,炮弹也朝我方射击。
(4) 宝物有16种,持续时间约15秒。如没有被敌我坦克拣到,自动爆炸消失:
散弹1:一次只能发一发炮弹;
散弹3:一次能发三发炮弹;
散弹5:一次能发射5颗炮弹;
增加子弹速度:一次加50
减少子弹速度:一次减50
增加炮弹威力:一次加50
炮弹的半径大小有81624三种。炮弹半径越大,越容易打中物体或坦克;
增加坦克生命力:一次加100
坦克隐形宝物:坦克不可见,炮弹无法打中它;
坦克无敌模式:带防护罩,炮弹打中不掉血;只有20秒保护期;
定时器:对方坦克不能动弹和发射;
爬山涉水:坦克能过河上山。该特性只在本关有效;
呼唤飞机帮助:拣宝方大批飞机出现,并且狂轰烂炸,对方难逃厄运;
脑黄金:只对敌方有效。被我方炮弹打中后,自动掉头向我方移动并射击。
每关的第十分钟,大批敌方帮助飞机呼啸而来,请你在此之前消灭敌人,否则大难临头。逃过此劫,坚持到第15分钟,我方飞机呼啸而来......
(5) 每过一关,我方生命力增加200
(6) 关卡地图文件名为Map???.map,最多999关。地图文件名编号为001999,中途不能断号,否则,会从头开始玩起。
(7) 操作:
F1:帮助;F11音乐;F12:炮声;F3:暂停/继续;鼠标右键:游戏难度选择。
玩家一: 玩家二:暂无
空格:开炮, ←↑↓→移动方向
4素材库程序编写
2D平面游戏中,地图画面由小块图片拼写出来。游戏角也一样,动画效果只不过是不断改变图形罢了。所以第一个任务就是要建立地图素材库。对每种地形设置它的图片、生命力、是否阻碍坦克或炮弹通过等。图1是图库编辑器的一个运行界面。
为方便管理,我们分类建立地形,如云层、土地、房屋、树林等等。每类含有多个不同形状的地藐对象TTiles;如水域类,可以包含海洋湖泊等。而每个地藐可以由数量不等的小图片组合而成。最小的小图片单元就是TTile对象(以后简称贴图)。这两个对象我们用Object Pascal语言(Delphi)实现。 素材管理程序代码2900多行(自编源代码)
图库(素材库)编辑器是游戏程序开发的第一步,许多商业游戏并不提供图库编辑器。使玩家感到有所失望。提供图库编辑器无疑增加了游戏的吸引力,因为玩家可以重新设计整个游戏,也许坦克大战变成了潜艇大战。
5游戏地图编辑程序编写
一些商业游戏提供了地图编辑器,如星际争霸英雄无敌等。图2是教程中设计的三层地
图编辑器运行界面。
地图设计是决定游戏可玩性的重要因素之一。当今2D游戏,普遍采用多层地图,这样可以产生比较逼真的画面。游戏程序显示画面时,首先显示最低层的图层,再依次显示高层画面;这样就有立体感了。
地图由层(TLayer)组成,每层地图又由许多基本的单元格(TCell)组成,单元格的图像来源于素材库。首先要完成这两个基本对象的编写。最后编写地图编辑程序,它实现地图数据的载入、显示、修改、保存等基本功能。总代码约3400多行。
6游戏主程序编写
准备工作一切就序!开始编写游戏主程序。设计的思路是:先把游戏关卡对应地图装入画面,再按游戏规则产生敌我双方坦克。敌方坦克随机移动和发射炮弹,除非它吃了脑黄金。我方坦克受玩家控制运动方向和发射炮弹。运动速度和发射炮弹的数量受游戏参数限制。当我方坦克全部死亡,游戏结束。敌方每隔一定时间产生新坦克,直到规定的坦克数量。敌方坦克全部被消灭后,游戏结束,进入下一关。
学生难以理解的是,这么许多的游戏角(也称精灵”),程序如何管理它们,而这些精灵在不断的产生、不断地碰撞、不断地消亡。所以,必须有一个统一的管理机制。必须建立一个最基本的学编程的游戏app精灵TSprite。该对象是系统中的一个核心类。看它的定义:
TSpriteEngine = class; //==预先声明精灵引擎
TSprite = class
private
FEngine: TSpriteEngine;    //==精灵引擎管理
FParent: TSprite;        //==用来判断其父类(产生者:如坦克死                    亡,对应子弹也消失)
FList: TList;            //==角列表(被精灵引擎管理:保存的                    是地址!)
FDeaded: Boolean;            //== 是否死亡
FDrawList: TList;            //== 需要绘制的角列表
FCollisioned: Boolean;        //== 是否需要碰撞检测
FMoved: Boolean;            //== 能否移动
FVisible: Boolean;        //== 是否可见
FX: Double;            //== 平面坐标位置