[Java基础揉碎]坦克大战 java事件处理机制

2024-06-04 15:52

本文主要是介绍[Java基础揉碎]坦克大战 java事件处理机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

坦克大战游戏演示

​编辑

为什么要写这个项目 

java绘图坐标体系

java绘图技术

Graphics的常用方法

// 画直线 

​编辑

// 画矩形边框 

// 画填充矩形 

// 画填充椭圆

// 获取图片资源 

// 写字 

绘出坦克 

新建一个tankgame包, 新建一个类Tank, 里面包含横坐标和纵坐标

 新建一个Hero, 自己的坦克类, 去继承Tank

新建一个绘图区域类, 继承JPanel 

新建一个窗口类 

​编辑

 运行现在就拥有了一个窗口

在MyPanel里面写一个坦克的封装方法, 将坦克的坐标, 画笔, 方向, 类型传进去, 并根据不同类型坦克设置不同颜色

根据坦克方向, 来绘制坦克 

 将封装的坦克放到绘制类里面去

这一步运行看到已经有一个矩形了 

MyPanel的坦克方法里面继续添加 右边的轮子

 此时运行能看到两个轮子了

 MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

​编辑

  MyPanel的坦克方法里面继续添加

​编辑

更改以下颜色我方为黄色

继续画出向右的坦克

继续画出向下的坦克 

​编辑

继续画出向左的坦克  

java事件处理机制

具体实现是面板绘制类实现KeyListener接口, 监听键盘事件 

重写监听接口的三个方法 

假如在这里实现一些操作 

让窗口可以监听到键盘事件

运行就可以发现方法a里面的操作就打印出来了 

当向下的箭头触发的时候, 就坐标y++ , 然后重绘面板, 就可以实现向下移动了 

我们将上下左右都加进去 

Java的事件处理机制系统说明

 Java的事件处理机制深入理解

让坦克动起来

​编辑

实现keyListener 

重写接口的方法 

处理按下的时候的操作 

因为坦克那里的方向目前是写死的, 要在按下的时候能够改变它的方向, 需要把方向作为成员变量

绘制类里面将方向改为hero.getDirect() 

 处理按下wdsa就改变它的方向

在窗口类将事件加进去 

此时按下对应的键就可以改变它的方向了 

在Tank类里面增加移动的方法 

在绘制类增加移动 , 此时坦克就可以移动了

可不可以控制坦克移动的速度呢, 关键点就在移动的方法里面加的多少, 我们增加一个speed来控制它的速度 

同时加入speed的get, set

在绘制类初始化坦克的时候就可以直接set它的速度, 此时面向对象的感觉就上来了 

绘制敌人的坦克

新建一个敌人的坦克类, 继承坦克 

在绘制类里面将敌人的坦克放在线程安全的Vector里面, 并初始化三个坦克 

画出敌人的坦克

此时运行效果

更改以下方向默认为0 

坦克大战游戏(1.0版)

新建一个子弹类

增加子弹的属性 

增加一个构造器 

run方法里面相当于射击动作

子弹触碰到面板边界就销毁 

设计一个变量表示子弹是否还存活

 当子弹销毁时, 改变子弹的存活状态

在我们自己的坦克创建射击

​编辑

向右子弹的坐标 

 向下子弹的坐标 

​编辑

 向左子弹的坐标 

启动线程 

回到面板类, 按下j 就调用发射这个子弹 

画出自己坦克射击的子弹

绘制敌人坦克的子弹

​编辑

使用Vector保存多个shot 

​编辑

创建坦克对象时, 初始化一个Shot对象, 并启动

 绘制出子弹, 不存活的需要在集合中移除

我方坦克子弹打中敌人坦克

​编辑

给敌人坦克增加一个存活变量 

​编辑

判断我方子弹是否击中敌人坦克

在不断绘制的run方法里面去判断我方子弹是否碰到敌人坦克

增加一个判断, 否则会空异常

增加判断,在敌人坦克还活着的时候再去画

坦克爆炸

敌方坦克自由移动

 ​编辑

控制敌方坦克范围​编辑

​编辑

控制我方坦克范围

​编辑

实现防止发射一棵子弹时, 还没有消亡可以在打出一颗问题

​编辑如果要发射多颗子弹怎么实现(思考演示)暂时不实行

敌方移动发射 

我方坦克被击中爆炸 

IO流应用到坦克大战

防止坦克重叠的八种情况 

记录玩家总成绩 

为了实现"继续游戏", 保存退出界面坦克的坐标​编辑 ​编辑

恢复保存的坐标

增加坦克大战音乐

修改文件位置 

处理异常提高健壮性​编辑


​​​​​​​坦克大战游戏演示

为什么要写这个项目 

√好玩

√涉及到java各个方面的技术

        1. java面向对象编程

        2.多线程

        3. 文件i/o操作

        4. 数据库

        5. 巩固旧知识,学习新知识

java绘图坐标体系

java绘图技术

快速入门-画一个圆形

// 继承JPanel类 

找到画一个圆形的方法 

 

// 调用这个方法 

// 窗口类继承JFrame, 将面板放入窗口中

 

Graphics的常用方法

// 画直线 

// 画矩形边框 

// 画填充矩形 

// 画填充椭圆

// 获取图片资源 

// 写字 

绘出坦克 

新建一个tankgame包, 新建一个类Tank, 里面包含横坐标和纵坐标

 新建一个Hero, 自己的坦克类, 去继承Tank

新建一个绘图区域类, 继承JPanel 

新建一个窗口类 

-- 设置为了1000 

 运行现在就拥有了一个窗口

在MyPanel里面写一个坦克的封装方法, 将坦克的坐标, 画笔, 方向, 类型传进去, 并根据不同类型坦克设置不同颜色

根据坦克方向, 来绘制坦克 

使用file3DRect方法

 坦克坐标分析图

 将封装的坦克放到绘制类里面去

这一步运行看到已经有一个矩形了 

MyPanel的坦克方法里面继续添加 右边的轮子

 此时运行能看到两个轮子了

 MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

更改以下颜色我方为黄色

继续画出向右的坦克

继续画出向下的坦克 

继续画出向左的坦克  

java事件处理机制

具体实现是面板绘制类实现KeyListener接口, 监听键盘事件 

重写监听接口的三个方法 

 

假如在这里实现一些操作 

让窗口可以监听到键盘事件

运行就可以发现方法a里面的操作就打印出来了 

当向下的箭头触发的时候, 就坐标y++ , 然后重绘面板, 就可以实现向下移动了 

 

我们将上下左右都加进去 

Java的事件处理机制系统说明

事件源可以是个窗口, 鼠标, 键, 按钮...

事件对象就是刚才我们用到的KeyEvent 

生活中的例子

 Java的事件处理机制深入理解

 

让坦克动起来

实现keyListener 

重写接口的方法 

处理按下的时候的操作 

因为坦克那里的方向目前是写死的, 要在按下的时候能够改变它的方向, 需要把方向作为成员变量

 

绘制类里面将方向改为hero.getDirect() 

 处理按下wdsa就改变它的方向

在窗口类将事件加进去 

此时按下对应的键就可以改变它的方向了 

在Tank类里面增加移动的方法 

在绘制类增加移动 , 此时坦克就可以移动了

可不可以控制坦克移动的速度呢, 关键点就在移动的方法里面加的多少, 我们增加一个speed来控制它的速度 

同时加入speed的get, set

在绘制类初始化坦克的时候就可以直接set它的速度, 此时面向对象的感觉就上来了 

绘制敌人的坦克

新建一个敌人的坦克类, 继承坦克 

在绘制类里面将敌人的坦克放在线程安全的Vector里面, 并初始化三个坦克 

画出敌人的坦克

此时运行效果

更改以下方向默认为0 

初始化敌人的坦克同时增加一个方向

坦克大战游戏(1.0版)

新建一个子弹类

增加子弹的属性 

增加一个构造器 

run方法里面相当于射击动作

休眠50是为了让子弹不算停留形成轨迹,  通过方向改变字段坐标

子弹触碰到面板边界就销毁 

也就是跳出死循环while

设计一个变量表示子弹是否还存活

 当子弹销毁时, 改变子弹的存活状态

在我们自己的坦克创建射击

子弹要在炮筒的位置, 先找到向上炮筒的位置, 坦克的x+20 , y不变的坐标, 方向还是0

向右子弹的坐标 

 

 向下子弹的坐标 

 向左子弹的坐标 

启动线程 

回到面板类, 按下j 就调用发射这个子弹 

画出自己坦克射击的子弹

实现不停重绘 

绘制敌人坦克的子弹

使用Vector保存多个shot 

创建坦克对象时, 初始化一个Shot对象, 并启动

 绘制出子弹, 不存活的需要在集合中移除

我方坦克子弹打中敌人坦克

给敌人坦克增加一个存活变量 

判断我方子弹是否击中敌人坦克

 

在不断绘制的run方法里面去判断我方子弹是否碰到敌人坦克

增加一个判断, 否则会空异常

增加判断,在敌人坦克还活着的时候再去画

坦克爆炸

写一个炸弹类

定义一个炸弹Vector 

准备三张图片, 用于显示炸弹效果 

初始化三张图片 

一被击中就加一一个炸弹, 这个炸弹是有三张图片组成的 

画出炸弹 

敌人坦克被打掉之后应该在集合中删掉 

敌方坦克自由移动

 

 实现runnable接口

根据方向继续移动

休眠50毫秒, 随机改变方向 

退出线程,因为在被击中的时候isLive被置为false, 也就是非真为真的时候退出线程 

启动线程 

run里面上下左右都实现移动时实现走30步 , 让坦克不是走一步就转向

加入break;

控制敌方坦克范围

控制我方坦克范围


将窗口增加一点, 让绘制区域完全展示出来, 方便查看是否控制住了范围 

tip:绘制区域仍然是1000*750的 

实现防止发射一棵子弹时, 还没有消亡可以在打出一颗问题

首先实现防止发射一棵子弹时, 还没有消亡可以在打出一颗, 在hero为空的时候, 就是第一次按j的时候, 或者isLive为false碰到边界销毁的时候可以触发shotEnemyTank发射行为

如果要发射多颗子弹怎么实现(思考演示)暂时不实行

 

 

要实现控制只能发射5颗怎么控制

是否击中坦克改为判断多颗子弹 

敌方移动发射 

 

我方坦克被击中爆炸 

给坦克增加存活属性

判断我方子弹是否击中敌人坦克的方法改为坦克父类, 即所有坦克 ​​​​​​

编写我方坦克是否被击中方法 

判断我们的子弹是否击中了敌人坦克 移动到hitEnemyTank()下面

 

增加一个判断, 让敌方子弹击中我们的时候, 我方坦克消失

IO流应用到坦克大战

防止坦克重叠的八种情况 

一个坦克不管是那个朝向, 都会可能面对另外一个坦克是上下或者左右移动的, 上下或者左右移动它的长宽会发生变化

 

判断下标为0的这个坦克是否和后面的坦克发生重叠

 

 

一二两种情况

 

三四两种情况

 

五六种情况 

七八种情况 

 

最后, 如果没有进入switch语句, 返回一个false

 Mypanel设置给enemyTank

记录玩家总成绩 

 

 

写一个类用于文件交互

 

 

为了实现"继续游戏", 保存退出界面坦克的坐标
 

 

恢复保存的坐标

 

 

 

case 1 开始新游戏 case 2 是继续上局游戏

 

 

增加坦克大战音乐

//音乐播放类

拷贝音乐文件到src下面

启动播放文件

修改文件位置 

处理异常提高健壮性

这篇关于[Java基础揉碎]坦克大战 java事件处理机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis