Java窗体实现飞机躲子弹游戏

2023-12-17 19:38

本文主要是介绍Java窗体实现飞机躲子弹游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前几天做了Java窗体实现飞机躲子弹游戏,我觉得很有必要做个笔记方便以后自己和他人查阅。

主要功能是:在一个窗体里面,用方向键盘控制飞机图片移动来躲避满屏的子弹。

由于篇幅的关系,这里主要做一个整体的文字介绍,代码在连接里,有详细注释。

http://download.csdn.net/detail/sinadrew/9657817

Java飞机躲子弹游戏

 


定义工具类在cn.util包下面

1.Constant  用来存放常量的类 :窗体的宽度、高度、坐标x,y。

public static final int Game_With =500;

public static final int Game_High =500;   

public static final int Location_X =50;

public static final int Location_Y =50;

 


GameUtil是一个通用的读取图片的类,它的构造器私有化,即不能被

实例化,但是提供了一个静态方法:

public static Image getImage(String path)

public class GameUtil {private GameUtil(){}  //工具类将构造器私有化public static Image getImage(String path){URL u = GameUtil.class.getClassLoader().getResource(path);BufferedImage  img = null;try {img = ImageIO.read(u);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return img;}
}

           

3.Myframe extends Frame 是一个通用的窗体类

runGame() 设置窗体参数,启动线程画窗体

update() 利用双缓存技术消除窗口闪烁,就是在内存里再建一个窗口

class paintThread extends Thread 这一个画窗口的线程类,是一个内部类

 

class paintThread extends Thread  //定义一个画窗口的线程类,是一个内部类{Image img=null;Graphics g = null;public void run(){while(true){repaint();//Graphics g=getGraphics();//paint(g);try {Thread.sleep(50); //休息50ms} catch (InterruptedException e) {					e.printStackTrace();} }}//		


具体实现类在包:cn.plane下面

Plane类:设置飞机的图片,坐标,移动方向,移动速度,是否活着的标志

  Plane()构造器获取飞机图片,并设置宽度和高度,还有坐标。

  draw()方法为画飞机,调用Graphics类的 g.drawImage方法

并且调用move()方法控制移动。

  move()用键盘控制飞机沿8个方向移动。

if(left && x>0 )x -= speed; //表示向左标志为真而且x坐标大于0的话,飞机每次向左移动通过将坐标x =x - speed;减去一个常数speed,就让飞机图片的位置左移speed单位。

if(down && y<Constant.Game_High-h)  y += speed; //表示飞机向下移动,注意的是:飞机的坐标(x,y)是指飞机图片左上角的相对于窗口左上角的坐标,所以当飞机移动到下边框时,要减去飞机本身的高度。

因为当飞机下边到达窗口下边上,飞机的上边位置在Constant.Game_High-h。

  Adddirection()和Mindirection()是监听键盘事件的函数,封装好后在类class KeyMonitor extends KeyAdapter     keyPressed()keyReleased()里面调用。键盘方向键的键值:左37,上38,右39,下40。也可以用定义的常量KeyEvent.VK_LEFT ,VK_UP, VK_RIGHT ,VK_DOWN。当按下上键就设置left = true; 向左上移动就同时设置left 、up为true。相反的,释放键盘就置false。

  getRect()函数将飞机图片设置为一个矩形。用来和子弹的矩形判断是否相交,相交为碰撞。


Bullet类设置子弹的坐标,速度,角度,宽度和高度。

  Bullet()构造器设置子弹从窗口正中间发出,并且设置一个随机角度。因为子弹是自动的从中心发现,并验证移动的曲线移动,所以就要用到正选和余弦函数以及角度来计算每个子弹按照不同角度的曲线移动

  draw(Graphics g)画子弹其实是由画笔g画出一个实心圆,而不是读取一个图片,只需要设置实心圆的大小,颜色等。x += speed*Math.cos(degree);

他每次移动就是X坐标移动移动(直角三角形x,y,z) x=z.cos(Θ) y=z.sin(Θ) 

还有让子弹遇到边框就弹回:

if(x<0 || x>Constant.Game_With-with) //左右边框,也就是子弹以某个角degree = Math.PI -degree;  //度Θ射入y轴,那么反射回去的角度应该是互补的,反射角关于x对称

if(y<30 || y>Constant.Game_High-heigh)  //上下边框,也就是子弹以某

degree = -degree;  //个角Θ射入x轴,反射回去是角度相反,反射角关于y对称。Θ的范围[0-2π]

  Rectangle getRect() //构造矩形,用来和图片的矩形判断是否相交,相交为碰撞。


Explode爆炸效果类:快速读取16张图片轮播就形成了动态的爆炸效果。

for(int i=0;i<16;i++)

  imgs[i] = GameUtil.getImage("pic/e"+(i+1)+".gif");

Explode(double x, double y)构造器设置坐标

draw(Graphics g)在窗口里画出图片

 

PlaneFrame extends Myframe 除了继承Myframe 已有的方法和字段,还要根据自己的特点来重写方法,新增字段。

  paint(Graphics g)画出图像。先画背景,再画飞机和子弹。还要检测每一颗子弹矩形与飞机矩形是否相交。boolean f = b.getRect().intersects(p.getRect());

  printInfo()打印飞机死亡信息

  Main()  new PlaneFrame().runGame();

  runGame()重写父类新增键盘监听,画出一堆子弹,设置游戏计时

  class KeyMonitor extends KeyAdapter 内部类的好处是可以直接使用外部类的所有属性,也方便调用。

  重写keyPressed() 和keyReleased()键盘监听函数

           


希望和大家一起每天进步一点点!刚刚开始在公众号同步博客,请大家多多支持,如有不足之处多多包含,最后多多关注哈哈哈。



这篇关于Java窗体实现飞机躲子弹游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/505592

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有