程序实现了缓冲图片消除闪烁,飞机碰撞,血块和血条的添加,,等等,功能不是很多,但是适合新手,欢迎下载其他类文件, 这里只是一个主类,下面有图片可以先看看界面! 压缩包在下面 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.io.File; 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<Plane> planes = new ArrayList<Plane>();// 敌人飞机容器 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 Plane myplane=new Plane(150,500,warui,40,true); private Random random=new Random(); private Blood b=new Blood();//创建血块对象 public void lauchFrame() { setTitle("飞机大战"); setBounds(380, 100, WIDTH, HEIGHT); // 匿名内部类,短,不涉及将来的扩展 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //设置界面图标 Image a=this.getToolkit().getImage("背景\\Icon.png"); this.setIconImage(a); 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(); myplane.pengplane(planes); myplane.eat(b); /** * 添加 / 重绘敌人 */ if (planes.size()<3 ) { for (int j = 0; j < 3; j++) { Plane p = new Plane(false, warui); planes.add(p); } } if (planes.size() != 0) { for (int i = 0; i < planes.size(); i++) { Plane 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.hitmyplane(myplane); b1.move(); } /** * 创建爆炸对象 */ for (int i = 0; i < explodes.size(); i++) { Explode e = explodes.get(i); e.draw(g); } /** * 血块添加 * 添加飞机吃血块的方法 */ if(myplane.life<30){ b.draw(g); } } /** * // 内部类,,方便的访问包装类的方法,不方便公开, * @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 Plane(150,500,warui,40,true); bullets.removeAll(bullets); break; case 67://C建重新开始 p=true; myplane=new Plane(150,500,warui,40,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(); } } } }
相关推荐
《雷电游戏 飞机大战 MFC版》是一款基于微软基础类库(MFC,Microsoft Foundation Classes)开发的经典飞行射击游戏,具有丰富的视觉效果和流畅的游戏体验。在这个项目中,开发者利用MFC的强大功能,构建了一个具备...
本篇将详细讲解如何利用cocos2d来制作类似雷电游戏中飞机的激光子弹效果,并且这种效果能够呈现出动态的弯曲轨迹。 首先,我们要理解cocos2d的核心概念。cocos2d基于场景(Scene)、节点(Node)和动作(Action)的...
Python飞机大战,有点像雷电游戏的界面风格,飞机躲闪另外发炮弹炸掉敌机和障碍,玩的时候还是挺刺激的,不过本游戏玩的时候,没发现有声音。源代码中的注释还是相当多的,Python初学者可学习研究下游戏的相关编写...
js实现飞机大战源代码,雷电经典游戏,web高分大作业,小白必看! js实现飞机大战源代码,雷电经典游戏,web高分大作业,小白必看! js实现飞机大战源代码,雷电经典游戏,web高分大作业,小白必看! js实现飞机大战...
通过阅读和分析代码,我们可以学习到如何组织游戏对象的结构(如使用继承和组合),如何编写事件处理函数,以及如何实现游戏规则(如敌机生成、子弹发射、碰撞检测)等。 总之,基于Java的雷电飞机游戏GUI设计与...
java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大...
【作品名称】:基于 C++实现的MFC-海战小游戏,类似雷电游戏,飞机大战 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】...
"Android 雷电 飞机 游戏图片资源"这个主题聚焦于为Android平台上的飞行射击类游戏提供高质量的图像素材,比如雷电风格的飞机游戏。这些资源通常包括各种飞机模型、子弹效果、敌人形象以及关卡背景等,旨在提升游戏...
本游戏基于Eclipse或IDEA开发工具,以java作为编程语言,整个项目开发旨在模拟雷电游戏的飞机射击游戏。游戏界面的下部是玩家的飞机,可以根据按键控制子弹的发射,上部为敌方飞机,在界面中随机出现。在游戏过程...
通过深入理解这些代码,开发者不仅可以学习到如何用Java实现游戏,还能掌握面向对象编程、多线程、图形处理等多个方面的知识。对于想要提升Java编程技能或对游戏开发感兴趣的开发者来说,这是一个非常有价值的实践...
玩家角色、敌机、子弹等游戏元素都可以抽象为类,每个类都有其特定的功能和属性,通过继承和组合来实现游戏逻辑。 其次,GUI(图形用户界面)的创建是游戏的展示层。Java提供了Swing或JavaFX库来创建窗口和组件。在...
《雷电战机/飞机大战的设计与实现》这篇毕业论文及源码主要涵盖了移动游戏开发的多个关键领域,特别是在Android平台上。下面将详细阐述其中涉及的知识点。 首先,论文的主题是基于Android平台的游戏开发,这意味着...
《Cocos2d-x 实现雷电游戏:深入解析飞机大战框架》 Cocos2d-x 是一个跨平台的游戏开发框架,广泛应用于2D游戏的制作,尤其在移动设备上表现卓越。它提供了丰富的功能,如图形渲染、动画处理、物理引擎支持、音效...
4. **动画与帧率控制**:通过requestAnimationFrame来实现游戏的动画效果,控制每一帧的更新,确保流畅度。 5. **碰撞检测**:检测游戏中不同元素间的碰撞,如子弹与敌机的碰撞,通常采用矩形碰撞检测或者像素级...
在游戏的核心部分,程序员需要设计和实现游戏对象,如玩家飞机、敌人、子弹和障碍物等。这些对象通常定义为Java类,包含它们的属性(如位置、速度、生命值等)和行为(如移动、发射子弹、碰撞处理等)。通过继承和多...
在Java编程语言中,"雷电打飞机"通常是指一个基于经典的街机游戏"雷电"(Raiden)开发的飞行射击游戏项目。这个项目主要用于教学目的,帮助初学者理解游戏开发的基本概念,如对象的创建、碰撞检测、动画处理、游戏...
5. 物理系统:虽然简单雷电游戏可能没有复杂的物理模拟,但至少包含基本的碰撞检测。当飞机、子弹与敌人相撞时,需要判断并处理相应的事件,如扣除生命值、消除敌人等。 6. 关卡设计:游戏分为多个关卡,每个关卡有...
开发者可以定义和触发自定义事件,实现游戏逻辑的解耦。 5. **碰撞检测**:游戏中的碰撞检测是关键,Lua中可以实现简单的几何碰撞检测算法,例如轴对齐边界框(AABB)或者更复杂的碰撞模型,以判断不同游戏对象是否...
开发者通常会利用JavaScript的时间间隔函数(如`setInterval`或`requestAnimationFrame`)来实现游戏循环,使得游戏画面能连续更新。此外,JavaScript还可以实现用户输入的响应,比如键盘控制飞机移动,点击按钮发射...