坦克大战源码分析
一、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
private static FileWriter fw=null;
private static BufferedWriter bw=null;
private static FileReader fr=null;
private static BufferedReader br=null;
private static Vector
三、其他问题
1、敌方坦克的绘画
2、敌方坦克的颜色
3、敌方坦克的移动与移动速度(随机移动?)
4、敌方坦克大战的射击速度、射击频率
5、玩家坦克的颜色
6、玩家坦克的射击设置
7、玩家坦克被射中后的重生问题
8、其他画面的设计问题
四、用的知识体系
大的层面:java和UI设计
细分:用到java中的线程、类、继承、构造函数(器)、函数、接口和类似c++指针一样的模块;用到UI中的面板、形状、color类、font类、事件驱动编程(主要是:键盘事件和键盘监听)、音频和动画等
五、推荐参考的博客
http://m.blog.csdn.net/lxjstudyIT,打开网页后,点击“原创文章”即可查阅博主对坦克大战的源码分析及动画演示。