**
Java多线程编写简易飞机大战(一)
**
利用多线程编写飞机大战,主要有3个关键:
①继承Thread类,重写run方法;
②线程工作代码在run方法中写;
③启动时,调用线程对象的start()方法。
现在来编写一个简易飞机大战程序,实现在界面上能够发射一系列的子弹的功能。
代码如下:
主类,其主要的功能:创建界面,并将界面画出来。
package com.yf1117;
import javax.swing.JButton;
import javax.swing.JFrame;
//编译格式,语法错
//运行时错误
public class Fly extends JFrame{
public void initUI(){
this.setTitle("飞机大战v0.1");
this.setSize(500, 600);
this.setVisible(true);
this.setDefaultCloseOperation(3);
//创建一个队列对象(鼠标监听器中,用来存坐标)
java.util.ArrayList<FlyPoint> fps = new java.util.ArrayList();
java.awt.Graphics g=this.getGraphics();
//把界面上的队列对象,传入监听器中
MouseDraw md=new MouseDraw(fps);
this.addMouseListener(md);
//创建那个线程对象
ThreadDrawList td=new ThreadDrawList(g,fps);
td.start();
}
/**
* @param args
*/
public static void main(String[] args) {
Fly fly=new Fly();
fly.initUI();
}
}
FlyPoint类,其主要的功能:通过构造函数,进行参数的传递(主要传递的是子弹的坐标值)。
package com.yf1117;
public class FlyPoint {
public int x,y;
//构造方法,实现传参
public FlyPoint(int x,int y){
this.x=x;
this.y=y;
}
}
MouseDraw类,其主要功能为:创建一个监听类,接收界面上的创建的队列对象,然后将鼠标松开点的坐标存入队列中。
package com.yf1117;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
//变量的作用域
public class MouseDraw implements java.awt.event.MouseListener {
//用来接收界面上创建的队列对象
private java.util.ArrayList<FlyPoint> fps;
//构造器,传过来了画布
public MouseDraw(ArrayList<FlyPoint> fps){
this.fps=fps;
}
public void mouseClicked(MouseEvent e){
}
public void mousePressed(MouseEvent e){ }
/**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e){
int x=e.getX();
int y=e.getY();
//创建一个点对象,保存点击坐标
FlyPoint fp=new FlyPoint(x, y);
//将这个对象,存入队列
this.fps.add(fp);
System.out.println("mouse放开了 向队列中存入了一个点对象 "+fp.x+" y "+fp.y);
}
/**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e){
}
/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e){
}
}
ThreadDrawList类,其功能:实现多线程编程,将存入队列中的坐标点取出来,每隔一段时间画一次,这里是每隔10ms。
package com.yf1117;
import java.awt.Graphics;
import java.util.ArrayList;
//从队列中取出点,每过10ms移动一下,再画一下
public class ThreadDrawList extends Thread {
//1.画布,2。界面上的队列
private Graphics g;
private java.util.ArrayList<FlyPoint> fps;
//要传入界面上的画布,和队列对象
public ThreadDrawList(Graphics g,ArrayList<FlyPoint> fps){
this.g=g;
this.fps=fps;
}
public void run(){
while(true){
//遍历队列,画
for(int i=0;i<this.fps.size();i++){
FlyPoint fp=this.fps.get(i);
fp.x+=3;
fp.y+=5;
g.fillOval(fp.x, fp.y, 30,30);
}
//停一下:
try{
Thread.sleep(30);
}catch(Exception ef){
ef.printStackTrace();
}
}
}
}
最终实现的效果:
总结:
看到这的小伙伴,可能要问了,这算哪门子的飞机大战,但是我们再反过来想一想,如果我们将这些黑色的圈圈全部用小飞机的图片代替,不就相当于飞机大战的场景吗,我们所玩的飞机大战的游戏就是基于这样的想法做出来的,只不过是他们那些控制飞机运动算法比这里的更加复杂一点而言,但是原理是一样的。