坦克大战java源码分析(上)

坦克大战源码分析

一、mytank07.java文件分析

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

1、包的使用

package com.haiding.tank_7;

包语句的语法格式为:

package pkg1[pkg2[pkg3]];

包的作用:

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

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

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

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


2import java.awt.*;

意义:导入awt包里的所有java类。java.awt包,即java抽象窗口工具包(Abstract Window Toolkit,AWT)提供了许多用来设计GUIGraphics 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;//键盘监听


3import java.io.File;

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

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


4import 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);


5import java.util.*;

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

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


6import javax.swing.*;

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

java 8版本,swingjavafx所代替。


7import javax.sound.sampled.*;

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

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


8public class MyTank07 extends JFrame implements ActionListener

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

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

 3implements 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、画一辆玩家坦克(下面以向上为例)471511

      //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()移动;updownleftright


11、游戏声音播放问题  

//我的面板Panel  178183

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

//定义一个我的坦克

Hero hero=null;

//定义声音播放

AePlayWave apw=null;

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

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

Recorder.getRecoring();

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

//播放开战声音

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

apw.start();


12、爆炸图片显示问题

//定义爆炸图片  194197

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窗体 9096

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文件分析

1import 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、游戏声音  712

//播放声音的类

class AePlayWave extends Thread {

private String filename;

public AePlayWave(String wavfile) {

filename = wavfile;

}

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


3、游戏记录保存&读取问题  67109

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

class Recorder{

//记录每关有多少敌人

private static int enNum=20;

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

private static int myLife=3;

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

private static int allEnNum=0;

//从文件中恢复记录点

private static Vector nodes=new Vector();

private static FileWriter fw=null;

private static BufferedWriter bw=null;

private static FileReader fr=null;

private static BufferedReader br=null;

private static Vector ets=new Vector();










三、其他问题


1、敌方坦克的绘画

2、敌方坦克的颜色

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

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

5、玩家坦克的颜色

6、玩家坦克的射击设置

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

8、其他画面的设计问题




四、用的知识体系

大的层面:javaUI设计

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

五、推荐参考的博客

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


你可能感兴趣的:(java)