[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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]