Tank大战0.1版

//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();
			}
		}
	}
	
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值