Java版打飞机小游戏
放假写的一个Java端打飞机小游戏。
复习到的知识点有:java图形界面,多线程,集合框架等。
主要的收获是知道了处理图层的方式,即JLayeredPane层次面板,主要思路
如下:
1. 创建一个JLayeredPanel对象实例layeredPane,声明大小
2. 将背景图片的JPanel 放到图层layeredPane最底层
3. 将飞机,子弹的JPanel放到背景图片之上的图层
4. 调用JFrame的setLayeredPane()方法加入图层面板
可改进方向:
1.排行榜
2.计时计分系统
3.敌机子弹
= =感觉都有思路了就没搞了2333
游戏截图:
游戏实现类(含注释):
public class GameFrame extends JFrame implements KeyListener {
// 我的飞机
private MyPlane myplane = null;
//控制子弹线程
private boolean flagBullet = true;
//控制敌方飞机线程
private boolean flagPlane = true;
// 创建一个JLayeredPane用于分层的。
JLayeredPane layeredPane;
// 创建一个Panel和一个Label用于存放图片,作为背景。
JPanel backgroundJp;
JLabel backgroundJLabel;
ImageIcon image;
public static GameFrame game;
//子弹作业
ArrayList<Bullet> bullets ;
private static int x;
private static int y;
public GameFrame() {
game = this;
//实例化子弹队列
bullets = new ArrayList<>();
myplane = new MyPlane();
myplane.setLocation(633, 550);
//创建一个用来分层的
layeredPane = new JLayeredPane();
image = new ImageIcon("images/background2.jpg");// 随便找一张图就可以看到效果。
// 创建背景的那些东西
backgroundJp = new JPanel();
backgroundJp.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
backgroundJLabel = new JLabel(image);
backgroundJp.add(backgroundJLabel);
// 将jp放到最底层。
layeredPane.add(backgroundJp, JLayeredPane.DEFAULT_LAYER);
// 将jb放到高一层的地方
layeredPane.add(myplane, JLayeredPane.MODAL_LAYER);
this.setLayeredPane(layeredPane);
this.setBounds(33, 0, 1300, 700);
this.addKeyListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//图标
this.setIconImage(new ImageIcon("images/bfire.png").getImage());
//不可放大或缩小
this.setResizable(false);
this.setVisible(true);
//子弹线程
launch();
// 敌机线程
otherPlane();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//获得飞机位置
if (myplane!= null) {
x = myplane.getX();
y = myplane.getY();
}
//每次移动大小
int speed = 20;
//根据不同指令执行命令
if (e.getKeyChar() == 'W' || e.getKeyChar() == 'w') { // 上移
y -= speed;
} else if (e.getKeyChar() == 'S' || e.getKeyChar() == 's') { // 下移
y += speed;
} else if (e.getKeyChar() == 'A' || e.getKeyChar() == 'a') { // 左移
x -= speed;
} else if (e.getKeyChar() == 'D' || e.getKeyChar() == 'd') { // 右移
x += speed;
}
//设置活动范围
if (x > -5 && x < Constant.windowx*2 - 165 && y > 0
&& y < Constant.windowy*2 - 175) {
if (myplane!=null) {
myplane.setLocation(x, y);
}
}
// repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
// 开启子弹线程
private void launch() {
new Thread() {
@Override
public void run() {
//如果为true,则启动线程,否则关闭
while (flagBullet) {
// 给出现时的坐标加上一个值,调整位置
//以飞机坐标为参数,生成一个子弹对象
Bullet bullet = new Bullet(myplane.getX() + 52,
myplane.getY() + 30, game);
// 将子弹加入面板
layeredPane.add(bullet, JLayeredPane.MODAL_LAYER);
// 添加进子弹列表
GameList.bulletList.add(bullet);
/*// 开始行动
弄个子弹队列
然后开个线程遍历队列
然后每个子弹的x 和 y都相加
每次重设每个子弹的位置
bullets.add(bullet);
for (int i = 0; i < bullets.size(); i++) {
int by = bullets.get(i).getY();
int bx = bullets.get(i).getX();
System.out.println("第"+i+"个子弹" + x +"and" + y);
bullets.get(i).setY(by-60);
bullets.get(i).setLocation(bx, by);
//判断这颗子弹是否打到某个敌机
GameList.intersectsBullet(bullets.get(i),game);
// 将子弹加入面板
layeredPane.add(bullet, JLayeredPane.POPUP_LAYER);
// 如果出了界面,就跳出循环,不再执行
if (by < 0) {
//该颗子弹已出了可见面板,从面板中移除,跳出循环
layeredPane.remove(bullet);
//将子弹从列表中移除
GameList.bulletList.remove(this);
break;
}
}
*/
new Thread(bullet).start();
// 每隔500毫秒发射一颗子弹
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
}
/*
* 启动敌机线程
*/
private void otherPlane() {
new Thread() {
@Override
public void run() {
//获得第一次出现敌机的时间
long firstTime = System.currentTimeMillis();
//一次最多存在number数量的敌机
int number = 5;
while (flagPlane) {
//获得当前时间
long currentTime = System.currentTimeMillis();
//每10秒多增加一架可以在界面上显示的敌机
if(currentTime - firstTime > 10000){
number ++;
//交换数据
firstTime = currentTime;
}
int size = GameList.planeList.size();
//如果list中的敌机数量小于总共可以在界面上显示的,则创建对象
if (size <= number) {
OtherPlane otherPlane = new OtherPlane(GameFrame.this);
//需要把该对象放到面板中去显示
layeredPane.add(otherPlane, JLayeredPane.MODAL_LAYER);
//加入list
GameList.planeList.add(otherPlane);
//启动,可以活动
new Thread(otherPlane).start();
//没500毫秒生成一个
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}.start();
}
// 返回MyPlane对象
public MyPlane getMyPlane() {
return myplane;
}
//将我方飞机的数据清除
public void setMyPlane(MyPlane myplane){
this.myplane = myplane;
}
// 将子弹或者敌机从面板移除
public void remove(Component c) {
layeredPane.remove(c);
}
//停止子弹线程
public void setFlagBullet(boolean b) {
this.flagBullet = b;
}
//停止敌机线程
public void setFlagPlane(boolean b) {
this.flagPlane = b;
}
}
项目压缩包: