//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();
}
}
}
}
}
Tank大战0.1版
最新推荐文章于 2022-08-03 02:12:06 发布