坦克大战源码分析

一、mytank07.java文件分析

注:至上而下将不懂的语句、结构体含义、代码作用等作出解释:

1、包的使用

package com.haiding.tank_7;

包语句的语法格式为:

package pkg1[.pkg2[.pkg3…]];

包的作用:

1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

2、import java.awt.*;

意义:导入awt包里的所有java类。java.awt包,即java抽象窗口工具包(Abstract Window Toolkit,AWT)提供了许多用来设计GUI(Graphics User Interface,图形用户界面)组件类。java早期进行用户界面设计时,主要是用java.awt包提供的类。如Button(按钮)、TextField(文本框)和List(列表)等。JDK1.2推出之后,增加了一个新的javax.swing包,该包提供了功能更为强大的用来设计GUI的类。还包括了事件侦听的一些借口方法。

import java.awt.event.ActionEvent;//活动事件

import java.awt.event.ActionListener;//活动监听

import java.awt.event.KeyEvent;//键盘事件

import java.awt.event.KeyListener;//键盘监听

3、import java.io.File;

意思是:导入java.io包中的file类;

作用是:java 处理文件的类 File,java提供了十分详细的文件处理方法。(目前初学没必要深究,知道是什么,作用是什么就行了。)

4、import javax.imageio.ImageIO;

作用是:javax.imageio.ImageIO类提供了一组静态方法进行最简单的图像I/O操作。

读取一个标准格式(GIF, PNG, or JPEG)的图片很简单:

File f = new File(“c:\images\myimage.gif”);

BufferedImage bi = ImageIO.read(f);

5、import java.util.*;

作用是:工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。

(总之,知道作用就行,先不深究)

6、import javax.swing.*;

作用是:提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。

java 8版本,swing被javafx所代替。

7、import javax.sound.sampled.*;

意思是:导入javax.sound.sampled包下的所有类。

作用是:实现简单的音频播放。

8、public class MyTank07 extends JFrame implements ActionListener

(1)public class mytank07  //自定义类,类名为mytank07。

(2)extends JFrame :继承Java的JFrame类,JFrame 是Java的窗体类,继承它可以重写它的一些方法达到更方便编程的作用。

(3)implements ActionListener : 是实现 ActionListener 接口,为动作监听接口,是Java swing 监听窗体动作的一个接口。

9、构造器的使用(第51行)

使用构造器时需要记住:

1.构造器必须与类同名(如果一个源文件中有多个类,则构造器必须与公共类同名)

2.每个类可以有一个以上的构造器

3.构造器可以有0个、1个或1个以上的参数

4.构造器没有返回值

5.构造器总是伴随着new操作一起调用

实例

1 public class A{

2    public A(){

3       System.out.println("调用了无参的构造函数");

4    }

5    public A(String mess){

6       System.out.println("调用了有参的构造函数\n"+

7          "参数内容为:"+mess);

8    }

9 }  //命名为a.java

1 public class Test{

2    public static void main(String [] args){

3        A a_1=new A();//调用无参的构造函数

4        A a_2=new A("Hello");//调用有参的构造函数

5    }

6 }  //命名为test.java

10、画一辆玩家坦克(下面以向上为例)471~511

//1.画出左边的矩形

g.fill3DRect(x, y, 5, 30,false);

//2.画出右边矩形

g.fill3DRect(x+15, y, 5, 30,false);

//3.画出中间矩形

g.fill3DRect(x+5, y+5, 10, 20,false);

//4.画出圆形

g.fillOval(x+5, y+10, 10, 10);

//5.画直线

g.drawLine(x+10, y+15, x+10, y);

在游戏中一辆坦克共有4中形态,分别是向上、下、左、右。

******************************************

/*实现KeyListener接口的方法*/

//键入某个键时调用此方法。

public void keyTyped(KeyEvent e) {

}

//释放某个键时调用此方法

public void keyReleased(KeyEvent e) {

}

******************************************

//利用键盘监听来确定坦克的方向

public void keyPressed(KeyEvent e) {//按下键事件a向左s向下d向右w向上

if(e.getKeyCode()==KeyEvent.VK_W||e.getKeyCode()==KeyEvent.VK_UP){

//向上

this.hero.setDirect(0);

this.hero.moveUp();

}else if(e.getKeyCode()==KeyEvent.VK_S||e.getKeyCode()==KeyEvent.VK_DOWN){

//设置我的坦克的方向,向下

this.hero.setDirect(1);

this.hero.moveDown();

}else if(e.getKeyCode()==KeyEvent.VK_A||e.getKeyCode()==KeyEvent.VK_LEFT){

//向左

this.hero.setDirect(2);

this.hero.moveLeft();

}else if(e.getKeyCode()==KeyEvent.VK_D||e.getKeyCode()==KeyEvent.VK_RIGHT){

//向右

this.hero.setDirect(3);

this.hero.moveRight();

}

//先用this.hero.setdirect()确定方向,在用this.hero.move()移动;up、down、left、right

11、游戏声音播放问题

//我的面板Panel  178~183

class MyPanel extends JPanel implements KeyListener,Runnable{//MyPanel继承Jpanel面板,创建KeyListener键盘接口和Runnable线程接口

//定义一个我的坦克

Hero hero=null;

//定义声音播放

AePlayWave apw=null;

************************************************

import javax.sound.sampled.*;(导入的音频播放的类)  203~207

Recorder.getRecoring();

if(flag.equals("newgame")){

//播放开战声音

apw=new AePlayWave(“/Users/a1/eclipse-workspace/MyTank07/Monody.wav”);   //自定义的音频,只要路径正确、音频存在,原则上可以实现播放

apw.start();

12、爆炸图片显示问题

//定义爆炸图片  194~197

Image image1=null;

Image image2=null;

Image image3=null;

************************************************

//初始化爆炸图片

try {

image1=ImageIO.read(new File("bomb1.gif"));

image2=ImageIO.read(new File("bomb2.gif"));

image3=ImageIO.read(new File(“bomb3.gif”));//自定义boom的动图,未知路径

} catch (Exception e) {

e.printStackTrace();

13、玩家坦克移动与移动速度问题

//定义坦克类 在members.java文件中hero类是tank类的子类

class Tank{

//表示坦克的X横坐标Y纵坐标

int x=0,y=0;

//direct坦克方向,0向上、1向下、2向左、3向右

int direct=0;

//坦克的速度

int speed=1;

//坦克颜色

int color;

再调用的是members.java文件里的class Hero extends Tank 类进行移动

//坦克向上移动

public void moveUp(){

y-=speed*10;

}

//坦克向右移动

public void moveRight(){

x+=speed*10;

}

//坦克向下移动

public void moveDown(){

y+=speed*10;

}

//坦克向左移动

public void moveLeft(){

x-=speed*10;

}

}

//可以通过改变speed*?类改变移动速度

14、同时移动和操纵问题

从实践操作来看,在移动的同时无法进行射击操纵,这点很无奈,有待提升!

15、设计坦克大战活动窗口

//设置JFrame窗体 90~96

this.setTitle("坦克大战");//JFrame标题

this.setSize(600, 500);//JFrame窗体大小

this.setLocationRelativeTo(null);//在屏幕中心显示

this.setVisible(true);//显示

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭JFrame

//开始面板—起提示作用  145~176

class MyStartPanel extends JPanel implements Runnable{

int times=0;

public void paint(Graphics g){

super.paint(g);

g.setColor(Color.black);

g.fillRect(0, 0, 400, 300);

//提示信息

if(times%2==0){

g.setColor(Color.yellow);

//开关信息的字体

Font myFont=new Font("华文新魏", Font.BOLD, 30);

g.setFont(myFont);

g.drawString("Stage: 1", 150, 150);

}

}

public void run() {

while(true){

//休眠

try {

Thread.sleep(500);

} catch (Exception e) {

e.printStackTrace();

}

times++;

//重画

this.repaint();

}

}

}

二、Members.java文件分析

1、import java.util.Vector

意思是:导入util包中的Vector类,Vector 可实现自动增长的对象数组。

解释:

java.util.vector提供了向量类(vector)以实现类似动态数组的功能。在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量。比如在c,c++中所谓的“动态数组”一般都由指针来实现。为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一。

向量类提供了三种构造方法:

public vector()

public vector(int initialcapacity,int capacityIncrement)

public vector(int initialcapacity)

2、游戏声音  7~12

//播放声音的类

class AePlayWave extends Thread {

private String filename;

public AePlayWave(String wavfile) {

filename = wavfile;

}

File soundFile = new File(filename);//导入音频文件

3、游戏记录保存&读取问题  67~109

//记录类,同时也可以保存玩家的设置

class Recorder{

//记录每关有多少敌人

private static int enNum=20;

//设置我有多少可用的人

private static int myLife=3;

//记录总共消灭了多少敌人的坦克

private static int allEnNum=0;

//从文件中恢复记录点

private static Vector<Node> nodes=new Vector<Node>();

private static FileWriter fw=null;

private static BufferedWriter bw=null;

private static FileReader fr=null;

private static BufferedReader br=null;

private static Vector<EnemyTank> ets=new Vector<EnemyTank>();

三、其他问题

1、敌方坦克的绘画

2、敌方坦克的颜色

3、敌方坦克的移动与移动速度(随机移动?)

4、敌方坦克大战的射击速度、射击频率

5、玩家坦克的颜色

6、玩家坦克的射击设置

7、玩家坦克被射中后的重生问题

8、其他画面的设计问题

四、用的知识体系

大的层面:java和UI设计

细分:用到java中的线程、类、继承、构造函数(器)、函数、接口和类似c++指针一样的模块;用到UI中的面板、形状、color类、font类、事件驱动编程(主要是:键盘事件和键盘监听)、音频和动画等

五、推荐参考的博客

http://m.blog.csdn.net/lxjstudyIT,打开网页后,点击“原创文章”即可查阅博主对坦克大战的源码分析及动画演示。

坦克大战java源码分析(上)相关推荐

  1. 坦克大战java源码

    mytank07.java文件 /*** 功能:坦克游戏的2.01* 1.画出我的坦克* 2.让我的坦克动起来* 3.让我的坦克按下空格(space)键发射子弹* 4.让我的坦克可以连发子弹(最多连发 ...

  2. Java坦克大战游戏源码(java坦克大战)

    Java坦克大战游戏源码(java坦克大战) public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(null ...

  3. 3D坦克大战游戏源码

    3D坦克大战游戏源码,该游戏是基于xcode 4.3,ios sdk 5.1开发.在xcode4.3.3上完美无报错.兼容ios4.3-ios6.0 ,一款ios平台上难得的3D坦克大战游戏源码,有2 ...

  4. 【180927】坦克大战游戏源码

    一.源码特点     采用winform进行开发,实现了坦克大战的游戏功能,非常简单,欢迎下载 二.功能介绍     本源码是一个坦克大战游戏源码,运行后,用键盘进行操作,击败对方坦克会随机出现武器加 ...

  5. 射击小游戏源码《90坦克大战》源码H5+安卓+IOS三端源码

    cocos creator2.2.2射击小游戏源码<90坦克大战>源码H5+安卓+IOS三端源码,开发脚本为javaScript方便扩展和阅读,支持cocos creator2.X版本,完 ...

  6. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

  7. Linux驱动修炼之道-SPI驱动框架源码分析(上)

    Linux驱动修炼之道-SPI驱动框架源码分析(上)   SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设 ...

  8. 【Java源码分析】LinkedHashSet和HashSet源码分析

    类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  9. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

最新文章

  1. 该如何对「半监督学习算法」实际性应用进行评估?Google给出了新答案
  2. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
  3. mysql 修改数据 where_MySQL笔记之修改数据的解决方法
  4. Java系列(1) JavaEE架构
  5. vue项目实现列表页-详情页返回不刷新,再点其他菜单项返回刷新的需求
  6. python方差分析模型的预测结果怎么看_statsmodels中方差分析表结果解析
  7. IT培训班到底有没有必要参加?
  8. C#串口通信工作笔记0002---上位机开发_嵌入式_串口助手_控制下位机的开关
  9. [ExtJS 6]Grid分页工具栏无效问题解决
  10. 深度剖析Java数据结构之表(四)——LinkedList泛型类的实现
  11. 纺织名词术语(针织品部分)---疵点
  12. 38个MySQL数据库的小技巧
  13. 【保姆级】-spotfire服务端、客户端安装部署(V7.8)
  14. ESD 静电保护原理和设计
  15. 51单片机之232串口实现-任务要求Fosc为6MHz,定时器T1为工作模式2
  16. Linux 下 va_start、va_end 学习及使用
  17. 行业缩减他却增加!海尔智家研发投入创新高
  18. jQuery 的表单验证之提交验证
  19. 基于51单片机控制的篮球比赛计时、计分系统设计与仿真(含设计图和C语言程序源码)
  20. Selenium自动化测试Python三:WebDriver进阶

热门文章

  1. (面经总结)一篇文章带你整理面试过程中关于 二叉树、二叉搜索树、平衡二叉树、B 树和 B+树的相关知识
  2. Kettle配置MySQL的SSL加密连接
  3. MyShop-优雅的微信小程序商店
  4. 1700. 无法吃午餐的学生数量(难度:简单)
  5. IC验证学习笔记(MCDF)实验0-MCDT
  6. python 收银系统_python 编程练习——根据一张单据设计点单收银系统
  7. Linux pipe详解
  8. 如何在苹果Mac上进行分屏,多任务处理?
  9. 处理org.apache.hadoop.hbase.client.ScannerTimeoutException
  10. 动态分配二维数组,且能如数组一样访问