文档章节

新版坦克大战

伊诗塔
 伊诗塔
发布于 2014/04/10 20:52
字数 2548
阅读 4448
收藏 154

作者:陈伟         2011211927             0491101

          王延友      2011211834             0491102


一、总体设计

1.1 具体设计

游戏包括的范围:本游戏包括主类、坦克类、子弹类、爆炸类、墙类、血块类。

需求

模块

产生游戏的屏幕

主类模块

将坦克大战的过程呈现在屏幕上


画出坦克

坦克类模块

控制坦克的移动并让坦克可以攻击


让坦克不可以穿越墙或别的坦克


添加坦克的图片


画出子弹

子弹类模块

控制子弹的移动


各种子弹


让子弹不可以穿墙


添加子弹的图片


子弹打墙的爆炸

爆炸类模块

画出爆炸的过程


控制坦克的爆炸


添加爆炸的图片


画出墙

墙类模块

实现墙的功能


画出血块

血块类模块

让血块围绕着固定的轨迹移动


实现血块的功能


1.2 游戏特点

我们设计的这款坦克大战和以前的区别我感觉挺大的,主要区别如下:

1,在我们设计的游戏里面坦克的炮筒更接近现实,那就是炮筒可以旋转。炮筒会指向鼠标所指的方向。

2,我们不止是我一个坦克。我们有队友,队友都是由电脑控制的坦克。

3,加血道具我方任一坦克都能吃,不只是玩家控制的坦克可以吃。

4,不管是敌方还是我方都能发多种子弹。但是特殊子弹的数量有限。

5,我们新添加了导弹,只有玩家控制的坦克才可以吃导弹。


1.3 类的层次结构图

1.3.1 坦克类的层次结构图

1.3.2 道具类的层次结构图

1.3.3 子弹类层次结构图

1.3.4 爆炸类层次结构图

1.3.5 坦克客户端层次结构图

1.3.6 墙类层次结构图

1.4 系统流程图

二、程序描述

2.1  主类模块

主类是要画出屏幕,并且要将坦克之间打斗的全过程都呈现出来的,所以要先产生一个窗口,窗口产生之后应该要不停的刷新,否则屏幕会定格成画面,用多线程来控制刷新的频率,如果此时屏幕出现闪屏现象,应该用双缓冲机制来画出屏幕。双缓冲机制是通过虚拟出一张图片,将屏幕画在这张虚拟的图片上,再将这张虚拟的图片呈现在屏幕上。

   画面重画的类如下

class RepaintThread implements Runnable // 画面重画线程
{
    public void run() 
    {
        while (repaintFlag) 
        {
	    try {
		repaint();
		ut.move(); // Tank定时移动
		Shot tcShots = null;
		for (int i = 0; i < shotsList.size(); i++) // 界面上的子弹定时移动
		{
		    tcShots = shotsList.get(i);
		    tcShots.move();
		}
		    Thread.sleep(33);
		} catch (InterruptedException e) {
		    e.printStackTrace();
		    System.exit(-1);
		}
	    }
	}
}

2.2 坦克类模块

该类实现在屏幕上画出坦克,并控制坦克的移动,让坦克可以发射炮弹打对方等功能。

画出坦克的方法如下:

public void draw(Graphics g) {
    if (!init) // 读入炮筒图片
    {
        init = true;
	this.setTurretDir(new Point(turretDirx + 10, turretDiry + 10));
    }
    if (isLive) {
	if (this.camp) {
	    switch (tankDir) {
	    case U:
	    case D: {
	    g.drawImage(imgMap1.get(tankDir), x - 18, y - 19, null);
	 }
	break;
	case L:
	case R: {
	    g.drawImage(imgMap1.get(tankDir), x - 19, y - 18, null);
	}
	break;
	default: {
	}
	break;
	}
	} else {
	    switch (tankDir) {
	    case U:
	    case D: {
	    g.drawImage(imgMap2.get(tankDir), x - 18, y - 19, null);
	    }
	    break;
	    case L:
	    case R: {
	        g.drawImage(imgMap2.get(tankDir), x - 19, y - 18, null);
	    }
	    break;
	    default: {
	    }
	    break;
	    }
        }
            g.drawImage(bTurretImg, x - 32, y - 32, null); // 绘制大炮
            this.tankHitPoint.draw(g); // 绘制出Tank的血量
	} else {
	    if (tankBomb != null)
	    tankBomb.draw(g); // 绘出坦克爆炸
	}
}

2.3 子弹类模块

该类实现在屏幕上画出子弹和子弹的移动轨迹以及实现了坦克攻击墙壁与攻击敌方坦克的功能,而且我们设计的是各种各样的子弹,比如我方就有闪弹,敌方除了普通的子弹外还有能够穿墙的子弹。由于代码较长,我就不贴出来了。

2.4 爆炸类模块

该类实现了在屏幕上画出了坦克爆炸的情景,我们采用了连续播放图片的效果来体现爆炸,我们的爆炸效果如下:


2.5 墙类模块

游戏里面我们的墙比较单一,这也可以说是我们游戏的一点不足。我们画出的墙的效果如下:

2.6 血类模块

血主要有两种,一种是加血的道具,二是坦克本身的血量。加血道具我们的设计就是,我方任一坦克吃了之后能回复一点血量。而不同于以前的是不是只有玩家操作的坦克才能吃加血道具。实现后效果如下:


三,功能演示

3.1 开始画面:

游戏的开始画面我们展示了玩家将要进入第一关,具体效果如下:

3.2 游戏菜单

我们的游戏菜单有:开始游戏,暂停游戏,继续游戏,以及对游戏的一些设置。效果如下:

3.3 游戏画面

具体的游戏画面如下:

屏幕左下方的60代表玩家坦克闪弹的剩余数量,上面的五个小圆是导弹的剩余数量。而右下角的爱心是加血道具,下面就是玩家可以吃的两枚导弹。


当我们胜出后会提示是否进入下一关,效果如下:


四、实现时遇到的问题

在这个程序实现中我们遇到的困难其实很多,因为程序过大,所以长期是一小点错误就会出现很奇怪的行为。在这其中我列举一下遇到的最大困难。

1:炮筒如何360度旋转,这个问题开始我们想了很久,到底该如何旋转。转到鼠标所指的方向,可能是由于数学功底太差。我们没有想到用数学的方式解决。最后我们的解决办法是用三角函数解决的,算出当前的角度就OK了。

2:就是开始菜单的使用,我们这个开始游戏开始一直不成功。开始时不成功主要是点了没反应,我们是加了监听的。没点开始游戏就已经开始了。这个问题解决了之后又遇到了新的问题就是一点开始游它就给你弹出一个新的窗口,不是在原来的窗口基础之上开始游戏。之所以出现这样的问题是由于我的界面不是一个panel类,而是一个方法。所以就添加了一个MyStartPanel extends JPanel类。并且实现Runnable接口,实现一闪一闪的界面效果。然后在开始游戏监听函数里面,创建一个坦克客服端对象。调用启动界面函数。就开始游戏了。 这样问题就解决了。

3:坦克之间的碰撞检测。其实这个问题想起来这个问题蛮简单,因为实际的坦克图片是一个矩形框。只要两个矩形框之间不要有交叉就可以了。想法虽好,实现不易啊。开始我们的方法很繁琐,没有写一个统一的方法来判别。

其实困难重重,经常遇到很奇怪的问题。比如说子弹的发射问题之类的。所以我就列举了主要的问题。

五、心得体会

陈伟心得体会:之所以想做坦克大战是由于我对坦克大战有种感情吧,从小就是这个游戏陪我度过我的童年。以前我都很好奇这个游戏是怎么做的,现在自己学了编程语言。所以有种很强烈的愿望实现一下,并且加进自己的思想。一开始做的时候还很兴奋。可是后来遇到各种问题我的兴趣就会被打击到。但是在这其中我得到了一个对于我来说很重要的经验。那就是遇到问题是要淡定,不要浮躁。只要你一直坚持研究这个问题的解决方法,到最后它一定会被解决的。其次,我也发现自己做这种大的项目还有很多不足。欠缺编程能力。所以编程能力确实有待提高。在这其中我觉得软件工程的思想是很重要的,软件工程学了还是有很大用处,现在我对软件工程的理解还不够深入,需要进一步的学习才行。

王延友的心得体会:这次的作业是要求完成一个游戏的改进或者修改成3D的。由于我平时不怎么玩大型游戏,多3D游戏了解得不多,在拿到这个题目时,的确不知道怎么入手,刚好最近在观看韩顺平老师的java视频。他里面有一个案例是编写坦克游戏,于是想到不如我模仿这个游戏吧,没想到我的组员和我想到一起去了。他也是计划写这方面的游戏。我们算是不谋而合。然后就是开始观看视频,按照那些方法开始编写。但是每每都是看着简单,要自己动手的时候就不是那么简单了。由于我们花了很多时间去设计和编写元素类,所以界面不是很漂亮,而且还有些功能还不能实现。也说明我的能力还欠缺,还得好好努力。同时我也从队友哪里学到了思想的重要性,刚开始的时候不能太注意细节,先要考虑到整体的框架,不然就无法开展工作了。后面才是完善细节的时候。

© 著作权归作者所有

共有 人打赏支持
伊诗塔
粉丝 8
博文 2
码字总数 3270
作品 0
云阳
私信 提问
加载中

评论(22)

小薇
小薇
建议学一些游戏引擎,开发游戏去吧
水牛叔叔
水牛叔叔
能静下这份心来写这玩意,太猛了,佩服
cnkens
cnkens
不错,想法和思路都不错。
J
Josephwoo
膜拜一下
狮子的魂
狮子的魂

引用来自“狮子的魂”的评论

Nice work, 我和你写了个类似的,不过我加入一些AI坦克。。。http://www.oschina.net/p/tankwar

引用来自“伊诗塔”的评论

你做的好多了。

首先就觉得你的界面很不错,设计也很好。。。我的素材就是网络上东下一个西下一个,自己不怎么会处理。。。

taojinhuo
taojinhuo
看起来还不错
杨同学
杨同学
牛逼啊
南湖船老大
南湖船老大
好厉害
一叶知秋0
一叶知秋0
赞一个
xxlv
xxlv
能联网么?
《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面GameMgr.cs最终代码预览,后面我们逐个讲解. usi...

杜增强
10/22
0
0
《杜增强讲Unity之Tanks坦克大战》1-准备工作

0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转,enter键开...

杜增强
10/22
0
0
《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览 image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里面找到DustTra...

杜增强
10/22
0
0
《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力

9 发射子弹时蓄力 实现效果如下 image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射。如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射。...

杜增强
10/22
0
0
11月1日HTML5公开课之经典坦克大战从入门到放弃讲解

今天扣丁学堂HTML5培训直播公开课给大家介绍一下关于一个H5经典坦克大战从入门到放弃的详细介绍,希望对同学们学习HTML5开发有所帮助,下面我们一起来看一下吧。 腾讯课堂直播地址:https:/...

扣丁学堂
11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js和OC交互

0.html+js 0.1html 代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> #colordv{ width: 100px;......

walking_yxf
1分钟前
0
0
点播转码相关常见问题及排查方式

概述: 点播转码目前涉及用户上传自动触发转码、通过SubmitTranscodeJobs接口触发转码等方式,会出现用户转码失败的情况,这当中有用户源片的问题、也有用户设置转码参数的原因以及相关资源性...

阿里云官方博客
3分钟前
0
0
工作笔记

Oracle锁表 查找被锁的表 select l.session_id,o.owner,o.object_namefrom v$locked_object l,dba_objects owhere l.object_id=o.object_id; 查找引发锁表的会话 select s.username,s.si......

呼呼南风
6分钟前
0
0
并发工具优于wati、notify(69)

现在几乎没有理由在使用wait 和 notify,使用高级工具代替 java.util.concurrent 包并发工具分三类: Executor 框架 并发集合(concurrent Collection) 同步器(synchronizer) 并发集合 对...

Java搬砖工程师
13分钟前
0
0
AutoCAD_系统变量

https://baike.sogou.com/v53561514.htm?fromTitle=cad%E5%8F%98%E9%87%8F lunits 设置线性单位。1 科学 2 小数 3 工程 4 建筑 5 分数 6 windesk...

一个小妞
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部