[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下面

启动播放文件

修改文件位置 

处理异常提高健壮性

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值