模拟飞机大战中子弹发射
模拟实现飞机大战一共需要哪几个类?
1. 界面类 2. 游戏监听器 3. 游戏主线程 4. 自动化线程
单线程实现
界面类
顾名思义,Game 是用于创建游戏界面,继承JFrame类,包括设置界面属性,添加游戏中涉及到的监听器。一般需要在最开始就写出来。
package FeiJiDaZhan2_1;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
//单个线程
//用一个内存队列,来保存要画的对象
//一个线程,来画
public class Game extends JFrame {
//队列对象
private ArrayList<Shape> al=new ArrayList();
public void initUI(){
this.setSize(500,600);
this.setDefaultCloseOperation(3);
FlowLayout fl=new FlowLayout();
this.setLayout(fl);
JButton buSend=new JButton("发射");//按钮监听器
this.add(buSend);
this.setVisible(true);
Graphics g=this.getGraphics();
BuAction ba=new BuAction(g,al);
buSend.addActionListener(ba);
//启动绘制线程:
ThreadDraw td=new ThreadDraw(g,al);
td.start();
}
public static void main(String args[]) {
Game wu=new Game();
wu.initUI();
}
}
游戏监听器
在这个类中需要把飞机大战中涉及到的监听器方法重写。
首先,我们可以尝试添加一个鼠标监听器,当我们按下鼠标的时候就可以发射一颗子弹。
代码如下(示例):
package FeiJiDaZhan2_1;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
public class BuAction implements ActionListener {
private Graphics g=null;
private ArrayList<Shape> al; //存放形状的队列
public BuAction(Graphics g, ArrayList<Shape> al){
this.g=g;
this.al=al;
}
public void actionPerformed(ActionEvent e){
Random ran=new Random();
int x=ran.nextInt(800);
int y=ran.nextInt(800);
Shape sp=new Shape();
sp.x=x; sp.y=y;
//将这个位置数据,存入队列
this.al.add(sp);
}
}
游戏主线程
1.画子弹 2.子弹的移动
在游戏中,点击按钮会发射子弹,所以我们首先需要定义一个队列,把产生的子弹存到这个队列里面。然后从这个队列里面一个一个的取出来我们的子弹并画出来然后让子弹自己移动。
完整代码如下:
package FeiJiDaZhan2_1;
import java.awt.*;
import java.util.ArrayList;
//定义一个画动画的线程类
//1.定义一个线程类,要继承Thread类
//2.线程做作的代码,写在run方法内工
public class ThreadDraw extends Thread{
private Graphics g;
private ArrayList<Shape> al ; //存放形状的队列
public ThreadDraw(Graphics g,ArrayList<Shape> al){
this.g=g;
this.al=al;
}
//重写的
public void run(){
while (true) {
for (int i=0;i<this.al.size();i++){
Shape sp=this.al.get(i);
sp.y++;
g.fillOval(sp.x,sp.y,30,30);
}
try {
Thread.sleep(30); //2ghz, 3ghz
} catch (Exception ef) {
}
}
}
}
实现如下:
上面这几步就实现了单线程的模拟子弹发射功能。
将此程序添加双缓冲需要怎么实现?只需在线程类中重写run方法里添加一个内存画布,使每次绘制的子弹画到内存画布中。
线程类ThreadDraw中run方法部分代码:
//重写的
public void run(){
while (true) {
//建一个内存画布:
BufferedImage bi=new BufferedImage(600,800,BufferedImage.TYPE_INT_RGB);
Graphics gb=bi.getGraphics();
for (int i=0;i<this.al.size();i++){
Shape sp=this.al.get(i);
sp.y++;
gb.fillOval(sp.x,sp.y,30,30);
}
//将内存画布画到界面上
g.drawImage(bi,0,70,null);
//设置特定睡眠时间 每隔几秒执行一次
try {
Thread.sleep(30); //2ghz, 3ghz
} catch (Exception ef) {
}
}
}
添加画布后,就可以实现图案在画布中的移动效果。因为在run方法中设置图案的y++,所以圆形图案会在下一次绘制时y轴移动,实现了由上到下的移动效果。
完整效果待补充。。。