对编写坦克游戏的认识
一.了解坦克游戏里面的图片元素。
1.1 坦克
我方坦克(一人操作,两人操作) 只考虑一人操作。 有四个方向的图片。
敌方坦克(不同种类的敌方坦克)。不同种类坦克的四个方向图片。
1.2 子弹
2.1 敌方子弹
2.2 我方子弹
1.3 钢板 (全块的与半块的)
1.4 草地
1.5 海洋
1.6 砖头(全,半)
1.7 爆炸(一系列爆炸图片)
1.8 指挥部
1.9 强化物品 ( 加攻击,加指挥部防御,隐身,爆炸,定,加生命)
二 了解各个元素的共性与特性
2.1这些元素都那些相同的性状和行为
相同的性质 :在整个地图上,它们都有自己的坐标。
相同的行为 :它们都可以在地图上画出来。
这是它们都有的性质和属性。
2.2 它们的个性。
一个个的看:
(1)坦克:无论敌方坦克还是我方坦克。
它们具有的属性: 坐标,速度,方向,生命。
它们具有的行为:
它们都可以动【 Move】
可以发子弹【Fire】。
可以被打爆炸【dead】
(2)子弹:无论敌方子弹还是我方子弹
它们具有的属性:坐标,速度,方向,生命,威力
它们具有的行为:
它们都可以动【 Move】
它们都会消失【dead】(不论是出界还是达到坦克)
(3)钢板,海洋
死物而已,不会消亡,只有坐标这个属性。
(4)草地
装饰品,只有坐标这个属性。
(5)砖头
砖头的处理有点复杂。 除了坐标这个基本属性外。
当被子弹打到的时候,外形会发生变化。
(6)强化物品
根据以上分析,显而易见,我们可以将上面的元素分为两大类。
会动的 坦克,子弹
不会动的 钢板,海洋,草地,砖头,强化物品,指挥部
三 将程序大体类结构归纳出来
由于坦克中含有玩家操作的角色,而子弹只是坦克的“附属品”,所以我们最好将坦克和子弹分为两
部分。
而坦克必须区分为我方和敌方。 所以我们可以确定最终类P1tank 和 Enemy类。
子弹也要区分我方和敌方,所以我们可以确定最终类MyMissle 和EnemyMissile。
我们也可以确定所以元素的基类:Element类。(只有坐标属性和画图方法)
然后根据会动和不会动的又分为 Member 类 和Module 类。Blast类(相当于静态元素)
Member类下又继承了 Roles类和 Missile 类。
Module 类下就是那些静态的元素。(暂时不管)。
Roles类下又继承了 Player 类和 Enemy 类。
我们在只考虑一个人游戏的时候。在Player 下又继承了 P1tank类。
Missile 类下又继承了敌方子弹类和我方子弹类。
四 设计类的属性和方法。
Element : 所以成员最基础的类。
属性:二维坐标
方法:画图显示(抽象方法)
Member:可以动的成员的基础类。
属性:二维坐标(基础基类),生命,速度,方向,宽度和高度(就是图片的长高)。
方法:构造函数,继承基类。
移动(由于没有实际对象,定义为抽象方法)
获取矩形大小(用于判断是否碰撞)
判断方向(更具dir 来改变坐标)
Roles:所有坦克的基础类
属性:继承Member
方法:重写了Move方法(调用基类的判断方向方法)。
Fire方法(由于没有实际对象,定义为抽象方法)
IsDead();(由于没有实际对象,定义为抽象方法)
Player:
属性 :除了继承Roles类外,还增添了图片,判断是否移动,以及四个方向的变量。
方法 :重写了移动方法。 给dir方向赋值。重写了move方法,在判断是否move然后调用move。
重写了Draw方法。【【【移动后】】】】 ,将图像画出来。
重写了Fire方法。
P1tank :继承Player类。
属性:添加了图像数组。
方法:构造函数()
KeyDown事件,KeyUp事件。
Missle 继承自Member 类
属性: 添加的子弹的威力,子弹的敌我区分
方法:子弹的构造函数,重写子弹的移动函数。 由于子弹没有Move属性(只有方向和速度)。
只要调用判断方向的函数就可以了。
MyMissle:Missle类
方法:重写画子弹的方法(先移动,然后画出)
EnemyMissle:继承Missle类
与MyMillse类类似。
Blast类:继承Element
只具有坐标属性,由一系列的图片合成。
Born类:继承Element
只具有坐标属性,由一系列的图片合成。
其他静态的元素:
只有坐标属性。
五 元素及对象的管理
想象一下:
出场时,我方在原地闪烁出场。然后敌方几辆坦克同时闪烁出场,反正出场都要闪烁,就不管了。
然后User在键盘的上按下ASDW键。 坦克出动。按下J键。开始发出子弹。当子弹打到敌方时,敌
方爆炸消失。子弹也消失。
从实质看 ,其实是一个个的对象创建,行动,消失。
那么我们可以定义一个类来管理这些对象。
Singleton 类。
private static Singleton instance; 定义管理这些实例。
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
方便的添加对象:
public void AddElement(Element e)
{
if (e is P1tank)
{
p1tank = e as P1tank;
}
//...
}
添加对象存放的位置
private List<Enemy> enemy = new List<Enemy>();//用List存放坦克的类型
private List<MyMissile> myMissile = new List<MyMissile>(); //实例化出我的
子弹的对象
private List<EnemyMissile> enemyMissile = new List<EnemyMissile>(); //实例化
敌人的子弹的对象
将全部对象画出来
public void Draw(Graphics e)
{
p1tank.Draw(e);
for (int i = 0; i < enemy.Count; i++) //将敌人的坦克画出来
{
enemy[i].Draw(e);
}
//...
}
移除对象的方法
public void RemoveElement(Element e)
{
if (e is Blast)
{
blast.Remove(e as Blast);
return;
}
//...
}
程序的核心:算法和思路