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

}

 项目压缩包:

 

猜你喜欢

转载自545283613.iteye.com/blog/2279089