Tank大战0.1版

原创 2012年07月02日 09:19:48
//In this version, I want this tank can shoot bullet.
//I have done this.
//*******I WANT TWO KEY CAN BE PRESS AT THE SAMETIME.******
//1.在这儿我的思路是,写两个线程分别来监听space键和上下左右键....但是没能成功. 还是不能实现一边走一边打... 在这个版本中....坦克的移动使用了
//2.键盘上下左右的监听,然后子弹使用了线程...因为需要让他自动飞...用ArrayList来装产生的子弹,每次按space键就生成一发子弹. 产生一个线程,但是
//3.使用过程中用Iterator遍历一直出问题,不知道什么原因,现在改成了直接用ArrayList自带方法实现.
//4.在实现窗口关闭的简单功能中使用了匿名类.
//5.利用tankDir来识别坦克的方向,根据方向来确定子弹的行驶路径.同时子弹中也加入了方向的属性.
//6.BulletThread中传入Bullet的引用根据子弹的方向属性来改变子弹的参数.
//7.使用Adapter.
//8.这个版本将解决闪烁问题.使用update 双缓冲机制. 重写update方法.

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TankClient extends Frame {

	int i=100;
	int j=100;
	int k=i+30;
	int m=j+5;
	int tankDir=2;
	ArrayList<Bullet> BTA;
	Image offScreen;             //定义一张图片,先将图画在图片上.
	
	public void paint(Graphics g) {
		g.setColor(Color.green);
		g.fillRect(i, j, 30, 20);
		g.fillRect(k,m, 10, 10); 
		g.setColor(Color.red);
		int k=BTA.size();
		Bullet tp;
		while(k!=0) {			
			tp=BTA.get(k-1);
			g.fillOval(tp.x,tp.y, 5, 5);
			k--;
		}	
	}
	
	public void update(Graphics g) {  //可以看出画笔功能肯定都是用的这个方法....保留痕迹没有擦出之前的.
		if(offScreen==null) {
	//		offScreen =g.createImage(700,550);  //用Frame的画笔画一张图. 不是这样画...
			offScreen =this.createImage(700, 550);  //是用Frame的方法创建一张图片.
		}
		Graphics osg= offScreen.getGraphics();  //要在offScreen上画图,需要得到offScreen的画笔.
		osg.setColor(Color.yellow);
		osg.fillRect(0, 0, 700, 550);  //把以前画的用一个矩形刷掉.
		paint(osg);  //将所有要画的内容先画在offScreen上面. 这里可以重写上面代码...当然直接调用paint()方法更好.
		g.drawImage(offScreen, 0, 0, null);  //将offScreen图片中的内容再画到Frame中去.
	}

	
	public static void main(String[] args) {
		new TankClient().launchTank();
	}
	
	public void launchTank() {
		BTA=new ArrayList<Bullet>();
		setLocation(500,150);
		setSize(700,550);
		setBackground(Color.yellow);
		this.setResizable(false);
		setTitle("TankWar");
		setVisible(true);
		new KeyThread(this,new KeyMonitor1()).start();
		new KeyThread(this,new KeyMonitor2()).start();
		addWindowListener(new WindowAdapter(){          //USE ADAPTER-----||匿名类
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
	
private class Bullet extends Point {
	int dir;
	Bullet(int x,int y,int dir) {
		this.x=x;
		this.y=y;
		this.dir=dir;
		
	}
}

private class KeyThread extends Thread {
	TankClient x;
	KeyAdapter ka;
	KeyThread(TankClient x,KeyAdapter ka) {
		this.x=x;
		this.ka=ka;
	}
	public void run() {
		x.addKeyListener(ka);
	}
}

private class BulletThread extends Thread{
	Bullet BT;
	BulletThread(Bullet x) {
		BT=x;
	}
	public void run() {
		while((BT.x!=0)&&(BT.x!=700)&&(BT.y!=0)&&(BT.y!=550)) {
			if(BT.dir==1) {
			BT.x=BT.x-5;
			try {
				BulletThread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			repaint();
			}
			if(BT.dir==2) {
				BT.x=BT.x+5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
			if(BT.dir==3) {
				BT.y=BT.y-5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
			if(BT.dir==4) {
				BT.y=BT.y+5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
		}
		
		BTA.remove(BT);	
	}
	
}

class KeyMonitor1 extends KeyAdapter {

	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==e.VK_LEFT) {
			i=i-5;
			k=i-10;
			m=j+5;
			tankDir=1;
			repaint();
		}
		if(e.getKeyCode()==e.VK_RIGHT) {
			i=i+5;
			k=i+30;
			m=j+5;
			tankDir=2;
			repaint();
		}
		if(e.getKeyCode()==e.VK_UP) {
			j=j-5;
			k=i+10;
			m=j-10;
			tankDir=3;
			repaint();
		}
		if(e.getKeyCode()==e.VK_DOWN) {
			j=j+5;
			k=i+10;
			m=j+20;
			tankDir=4;
			repaint();
		}
		
	}			
}

class KeyMonitor2 extends KeyAdapter {

	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==e.VK_SPACE) {
			if(tankDir==1) {
				Bullet tep=new Bullet(k,m+2,1);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==2) {
				Bullet tep=new Bullet(k+10,m+2,2);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==3) {
				Bullet tep=new Bullet(k+2,m,3);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==4) {
				Bullet tep=new Bullet(k+2,m+10,4);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
		}
	}
	
}
}


相关文章推荐

Java实现Tank大战联机版

前言                 在前面对于Java初学者开发简单的桌面游戏的碰撞检测的总结中,笔者特意去翻了翻U盘里面           的东西。发现以前用Java做的Tank大战游戏还静...
  • kiritor
  • kiritor
  • 2013年05月20日 08:43
  • 4724

坦克大战java版tank

  • 2014年05月22日 17:11
  • 29KB
  • 下载

JavaSE版Tank大战源码

  • 2015年12月15日 15:25
  • 578KB
  • 下载

跟着韩老师学HTML5的tank大战一些问题和代码

坦克大战

java Tank大战联机版

  • 2013年05月20日 17:09
  • 5.25MB
  • 下载

tank大战图片版

  • 2011年12月21日 19:13
  • 428KB
  • 下载

《火球——UML大战需求分析》(0.1)——开篇废话

10多年前第一次接触UML,终于知道这是“神马”东西了!UML,Unified Modeling Language(统一建模语言)的简称呗!当时我那十分之一桶水都不到的UML知识,除了可以在一些不明U...

坦克大战Tank

  • 2012年09月20日 16:02
  • 2.43MB
  • 下载

tank大战练习程序

  • 2008年12月27日 22:20
  • 113KB
  • 下载

从零开始Android游戏编程(第二版) 第二章 创建第一个程序Hello Tank

第二章 创建第一个程序Hello Tank 难度:容易 现在开始,我们要真正写作Android程序了。虽然前面安装过程那么复杂,但是写起程序来却是非常简单。而且为了让大家有一个直观的认识,本文不会...
  • yexing
  • yexing
  • 2011年01月14日 16:11
  • 7074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tank大战0.1版
举报原因:
原因补充:

(最多只允许输入30个字)