刚刚做完坦克大战的游戏,不能说做完,功能还很简单,还有一些Bug。花了两个下午,一个晚上,因为时间很紧张,(主要怪自己,在别人工作的时候,我在去杭州了,不过,玩得很开心,虽然来了"梅超风"
),这里只是简单的一些总结,整理一下自己的思路,Bug,以后会慢慢修复。
写一个游戏,首先要定义的自己的规则,搞清楚自己到底要实现的东西有哪些。然后,一点一点理清自己的思路。搞清楚,为了达到目的,我要做哪些事情,先后顺序是什么。
一开始突然要写坦克,作者也是一头蒙。后来,静下心来,慢慢分析,先学会玩坦克大战这个游戏,搞清楚了游戏规则,然后开始模仿。要写这个游戏,首先,要有一个JFrame。要有自己的坦克和敌方坦克。坦克要会发射子弹。坦克要能够在JFrame上运动。要判断输赢,那么还要自己定义输赢标准。 这些是主干,其他的可以一点一点的加。
一:界面,800*700的JFrame。
背景图片是我截取的一个游戏的,然后一小块,一小块拼起来的,足足拼了400多块(因为这个背景图片很有战场的感觉)。
然后,就是设计地图了。创建一个Map文件,用数字来表示地图上的事物。然后,读取文件,用到了前几天的文件的读取,将字符串转换成数组元素,用数组来存储。遍历数组,数组不同的元素,则绘制相对应的事物。
//根据数组,画出地图
public void createMap(int[][] array,Graphics g){
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
if(array[i][j]==1){
g.drawImage(Config.Wall.getImage(),35*(j),35*(i),null);
}
if(array[i][j]==2){
g.drawImage(Config.Stone.getImage(),35*(j),35*(i),null);
}
if(array[i][j]==3){
g.drawImage(Config.CantDie.getImage(),35*(j),35*(i),null);
}
}
}
}
JFrame双缓冲:借鉴了chang0501的blog,在这里附上地址:http://chang0501.iteye.com/blog/1027663
在这里就不多说了。真是牛人多多,要多多学习。
二:己方坦克
实现的功能:四个方向移动,发射子弹,判断障碍物,当被敌方坦克打中后,自动生成一个新的。游戏结束的标准是:敌方坦克被全部消灭或者己方坦克的基地被毁灭。己方坦克的作用就是保护基地不被毁,可以不断再生,直到游戏结束。
用键盘来控制坦克的方向,需要添加键盘监听器:addKeyListener,用四个boolean变量来记录键盘的按键情况,按下键,相对应的值变为true,那么此时前进的方向就确定了,释放为false。
/**
* 判断前进方向
*/
public void directionToHead() {
if (dir == e.VK_RIGHT) {
right = true;
currentDirection = "right";
}
if (dir == e.VK_LEFT) {
left = true;
currentDirection = "left";
}
if (dir == e.VK_UP) {
up = true;
currentDirection = "up";
}
if (dir == e.VK_DOWN) {
down = true;
currentDirection = "down";
}
}
三:敌方坦克
其实,敌方坦克类里有许多和己方坦克相同的方法,比如,判断是否被打中,是否碰到障碍物。敌方坦克不同的是,被打中后,消失,直到全部被打中消失,那么,游戏结束,己方胜利。敌方坦克的运动方向和位置是随机的。前,后,左,右,四个方向随机选择。
/**
* 随机选择前前进的方向
*/
public void initDirection() {
Random ran = new Random();
int dir = ran.nextInt(4);
if (dir == 0) {
up = true;
}
if (dir == 1) {
down = true;
}
if (dir == 2) {
left = true;
}
if (dir == 3) {
right = true;
}
}
四:子弹类
己方子弹,和敌方子弹,创建方法时相同的,里面实现的方法也有很多相同的地方,其实可以合并写在一个类里。但,一开始的时候,我为了理清自己的思路,把他们一一的分开了。
子弹的运动方向和位置的定义,是与坦克运动方向,位置相关的,因此可以用坦克的坐标来表示子弹的坐标,坦克的方向就是子弹的方向。子弹类里,会有一些方法,比如,子弹击中了墙,那么墙就要消失;子弹击中对方坦克,坦克消失,等等。
五:实现爆炸效果
爆炸的实现其实就是连续的绘制图片。将图片保存在数组里,然后遍历绘制。爆炸的产生是在子弹打中坦克的情况的产生的,因此,此时的子弹是setLive(false)的,调用爆炸方法即可。
六:Config类
因为要绘制很多图片,为了方便,可以将要用到的素材放到Config类里。
以上只是我暂时的结果。还有很多要完善的地方,比如,敌方坦克不可以重合,由于敌方坦克运动方向是随机的,坦克可能会原地打转的问题,等等,很多。我会继续完善的。