Java多线程编写简易飞机大战(一)

**

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

最终实现的效果:

在这里插入图片描述
总结:

    看到这的小伙伴,可能要问了,这算哪门子的飞机大战,但是我们再反过来想一想,如果我们将这些黑色的圈圈全部用小飞机的图片代替,不就相当于飞机大战的场景吗,我们所玩的飞机大战的游戏就是基于这样的想法做出来的,只不过是他们那些控制飞机运动算法比这里的更加复杂一点而言,但是原理是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值