下面有图片,方便大家先看界面! package 飞机大战; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.LayoutManager; import java.awt.RenderingHints.Key; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JPanel; /** * 主类,线程,所有的事物重绘都在这个类 * @author yan * */ public class WarUI extends Frame{ public static final int WIDTH=410; public static final int HEIGHT=600; public ImageIcon img; public ImageIcon img2; public static WarUI warui; public boolean p=true; public static List<Panle> planes = new ArrayList<Panle>();// 敌人飞机容器 public static List<Bullet> bullets = new ArrayList<Bullet>();//子弹容器 public static List<Explode> explodes=new ArrayList<Explode>();//爆炸对象 public static int score=0;//计分 private Image offScreenImage = null;//用来实现使用双缓冲,画一个缓冲画布 public Panle myplane=new Panle(150,500,warui,60,true); private Random random=new Random(); public void lauchFrame() { setTitle("飞机大战"); setBounds(380, 100, WIDTH, HEIGHT); // 匿名内部类,短,不涉及将来的扩展 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); img=new ImageIcon("背景\\back.jpg");//接口,getImage方法返回一个Image对象,repaint方法会调用paint方法 img2=new ImageIcon("背景\\back2.jpg");//接口,getImage方法返回一个Image对象,repaint方法会调用paint方法 setResizable(false); setVisible(true); MyKeyListener mkl=new MyKeyListener(); this.addKeyListener(mkl); new Thread(new PaintThread()).start(); } public static void main(String[] args) { warui =new WarUI(); warui.lauchFrame(); } /** * 消除闪烁,使用双缓冲 * 线程重画更加均匀,更能控制重化的速度。按键重画不能解决子弹自动飞行的问题; * 每次重绘调用repaint方法时,必定会先调用update然后paint方法 */ public void update(Graphics g) { if (offScreenImage == null) { offScreenImage = this.createImage(WIDTH, HEIGHT); } // 拿到图片上的画笔 Graphics gOffScreen = offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.blue); gOffScreen.fillRect(0, 0, WIDTH,HEIGHT); gOffScreen.setColor(c); paint(gOffScreen);// 画在背后图片上 g.drawImage(offScreenImage, 0, 0, null);// 画在屏幕上 } /** * 根据线程里面的repaint方法,不断重画面板,飞机,子弹,爆炸效果,等待都是在里面画出来的 */ public void paint(Graphics g){ // 根据不同的分数层切换背景图片 if(score>5000){ g.drawImage(img2.getImage(), 0, 0, warui); }else{ g.drawImage(img.getImage(), 0, 0, warui); } if(!myplane.isLive()){ g.setColor(Color.red); Font f = g.getFont(); g.setFont(new Font("宋体",Font.BOLD,60)); g.drawString("GAME OVER!!!", 20, 300); g.setFont(f); g.drawString("复活按B,重新开始按C!!!", 22, 340); p=false; } myplane.draw(g); myplane.move(); /** * 添加 / 重绘敌人 */ if (planes.size()<3 ) { for (int j = 0; j < 3; j++) { Panle p = new Panle(false, warui); planes.add(p); } } if (planes.size() != 0) { for (int i = 0; i < planes.size(); i++) { Panle diren = planes.get(i); diren.draw(g); diren.dmove(); int r1=random.nextInt(200); if(r1==20) diren.dfire(); } } g.setColor(Color.BLUE); g.drawString("子 弹 个 数 :"+bullets.size(), 20,50); g.drawString("入侵敌机数:"+planes.size(), 20, 70); g.drawString("获得分数:"+score, 20, 90); g.drawString("A 开火,P 暂停", 20, 110); g.drawString("C重新开始,B 复活:", 20, 130); g.setColor(Color.BLACK); for(int i=0;i<bullets.size();i++){ Bullet b1=bullets.get(i); b1.draw(g); b1.hitplane(planes); b1.hitplane(myplane); b1.move(); } /** * 创建爆炸对象 */ for (int i = 0; i < explodes.size(); i++) { Explode e = explodes.get(i); e.draw(g); } /** * 血块添加 * 添加飞机吃血块的方法 */ if(myplane.life<30){ Blood b=new Blood(); b.draw(g); myplane.eat(b); } } /** * // 内部类,,方便的访问包装类的方法,不方便公开, * @author yan * */ private class PaintThread implements Runnable { public void run() { while (true) { if(p==true){ repaint(); } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 键盘事件,直接添加在面板上,然后对飞机的X,Y速度进行控制 * @author yan * */ class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case 37: // 左 myplane.left(); break; case 38:// 上 myplane.up(); break; case 39:// 右 myplane.right(); break; case 40:// 下 myplane.down(); break; case 65://A键 if(myplane.isLive()){ myplane.fire(); } break; case 66://B建复活,清空子弹 p=true; myplane=new Panle(150,500,warui,60,true); bullets.removeAll(bullets); break; case 67://C建重新开始 p=true; myplane=new Panle(150,500,warui,60,true); bullets.removeAll(bullets); planes.removeAll(planes); break; case 80://P键,暂停 if(p==false){ p=true; }else{ p=false; } break; } } /** * 抬起键时,把速度为0 */ public void keyReleased(KeyEvent e) { if (e.getKeyCode() == 37 || e.getKeyCode() == 39) { myplane.initXc(); } else if (e.getKeyCode() == 38 || e.getKeyCode() == 40) { myplane.initYc(); } } } }
这只是一个主类,其他完整代码和图片在压缩包里面,需要的话,请下载!
相关推荐
Java飞机大战小游戏,通过Java swing和awt技术实现了飞机大战功能,包括击落敌机,计分,死亡,游戏暂停,重写开始,游戏背景等功能。下载导入eclipse即可运行。
* 重构了move,方法实现播放销毁动画功能 */ public void move(){ if(state == ACTIVE){ y += step; return ; } if(state == DEAD){ //从子类对象中获取下一张照片 BufferedImage img = nextImage(); if...
10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法的重写.zip10.java方法...
1、游戏窗口标题为“飞机大战” 2、游戏窗口大小为800px、600px 3、游戏窗口不能改变大小 4、游戏窗口居中显示 5、创建“MainWindow”,继承至“JFrame” 6、通过构造方法对游戏窗口进行初始化 7、重写“MainWindow...
主要介绍了Java方法覆盖重写实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
基于阿里网盘api二次开发,得益于阿里网盘的不限速容量大,灵感来自于onedrive...使用JAVA重写项目,基于阿里云盘实现,实现秒传,支持本地更新文件同步到网盘,支持记住登录,扫描登录,支持文件加密和解密 安全性更高
Java 继承知识点的相关学习。
用Cpp语言 + STL容器 + 面向对象(继承,虚函数)实现的 飞机大战的完整版。 本资源的特色: 1. 代码量充足:足足有1500多行代码,实现了基本上飞机大战所有的基本功能。 2. 利用面向对象的思想,使用纯粹C++语言,...
java用sax实现修改xml文件内容,util工具包中,包含所需jar文件、测试xml文件、startup.bat文件以及使用说明文档
java代码-使用java解决重写void paint( Graphics g )方法的源代码 ——学习参考资料:仅用于个人学习使用!
在很多情况下,WEB中进行URL重写一般是使用WEB服务器自身提供的组件。开源项目Url Rewrite Filter ,使用Filter来完成这项工作,从而不依赖于WEB服务器组件。
主要介绍了Java继承方法重写实现原理及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
URL重写,其实就是把带一大堆参数的url,变成一个看上去很规矩的url。本例是URL重写的Java WEB实现。
Java --- 方法参数为接口(子类实现接口中重写后的方法流程图)
JAVA重写和重载.pdf
JAVA中的方法重写与方法重载的区别,还算挺详细的
java 重载,重写以及继承,多态的区别
主要介绍了Java中equals()方法重写实现代码的相关资料,需要的朋友可以参考下