这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~接下来的几篇都是uni-app的小实战,有助于我们更好的去学习uni-app~
主页: oliver尹的主页
格言: 跌倒了爬起来就好~
准备篇:https://oliver.blog.csdn.net/article/details/127185461
启动页实现:https://oliver.blog.csdn.net/article/details/127217681
敌机模型实现:https://oliver.blog.csdn.net/article/details/127332264
requestAnimationFrame详解:https://oliver.blog.csdn.net/article/details/127377916
我方飞机实现:https://oliver.blog.csdn.net/article/details/127477230
子弹模型实现:https://oliver.blog.csdn.net/article/details/127702195

《uni-app》一个非canvas的飞机对战小游戏实现-碰撞检测的实现

  • 一. 前言
  • 二. 阅读对象与难度
  • 三. 项目地址以及最终效果
  • 四. 碰撞的实现
    • 4.1 分析分析
    • 4.2 碰撞检测
    • 4.3 爆炸动画
  • 五. 阶段性展示
  • 六. 小结

一. 前言

上一篇中主要分享的是子弹这个模型功能的实现,包括了:子弹的样式,子弹的创建坐标,子弹的位移操作等等 明显的是,到这一步我们的游戏主体还没有完成,因为子弹发射出去了,当与敌机交叉的时候子弹会穿过敌机,这不明显是不大合理的,子弹应该要摧毁敌机才行~
因此,本文将实现的是 碰撞检测 相关的内容,通过碰撞检测可以将我方飞机,子弹与敌机相互关联起来,形成一个相对完整的小游戏,耐心看完,或许你会所有收获~

二. 阅读对象与难度

本文难度属于:中级,本文中主要实现的我方飞机发射子弹后子弹与敌方飞机的碰撞检测相关内容
具体内容可以参考以下的思维导图:

三. 项目地址以及最终效果

文本代码已上传CSDN上的gitCode,有兴趣的小伙伴可以直接clone,项目地址:https://gitcode.net/zy21131437/planegameuni
如果有小伙伴愿意点个星,那就非常感谢了~最终效果图如下:

四. 碰撞的实现

4.1 分析分析

通过效果图,我们可以大致知道要实现的内容一共有两个:

  • 第一个,子弹与敌机的碰撞检测;
  • 第二个,敌机的爆炸动画被触发,包括大飞机爆炸动画和小飞机的爆炸动画;

这两个都是需要我们去实现的,只有实现了这两个后飞机大战这个小游戏才算是勉强可以正常玩耍了~

4.2 碰撞检测

在开始之前不妨思考一下,这个碰撞检测应该在什么时候执行?这明显是一个很关键的问题,不同的人有不同的解决方案,以本文为例,本文中的碰撞检测的执行时机在于敌机的每一次的 requestAnimationFrame 循环内,也就是说,每一次敌机在进行位移动画的时候都会去检测一遍有没有子弹与当前的敌机进行了碰撞,一旦进行碰撞那么,就要触发对应的后续,比如爆炸动画以及缓存中移除该飞机;
执行时机我们知道了,那么碰撞这个概念该怎么去实现呢?我们先看一段代码,代码并不复杂

export function isCollision(target, enemy) {return !(target.x + target.width < enemy.x ||enemy.x + enemy.width < target.x ||target.y + target.height < enemy.y ||enemy.y + enemy.height < target.y);
}

这一段代码就是用来做碰撞检测的,代码量上是不是非常简单,但细看一眼又觉得不大好理解,觉得很绕,其实仔细想想所谓碰撞检测不就是做了一个判断吗,判断两个DOM是否存在重叠,如果存在重叠那么就是碰撞了,需要我们后续处理,下面我们就仔细看一下这段代码,一行一行看:
首先第一行,定义了一个名为 isCollision 的函数,这个函数接收两个参数,很明显,这两个参数就是用来进行检测的两方~
第二行,第二行是返回,并且这个返回针对运算结果执行了!这个取反的操作;
从第三行开始就是两个DOM的碰撞判断了,先看第三行,第三行是一个判断

target.x + target.width < enemy.x

这段判断的意思是说,target的x轴的坐标加上target的宽度小于enemy在X轴上的坐标,什么意思呢?看个示意图:

简单的说,假设target的坐标加上其本身的宽度还小于enemy在X轴上的值的话,那target一定在enemy的左侧位置
再看第四行:

enemy.x + enemy.width < target.x

同理,这段判断的意思是说,enemy的x轴的坐标加上enemy的宽度小于target在X轴上的坐标,这就代表着target一定是在enemy的右侧,如果不大清楚可以继续看个示意图

enemy一定在target的左侧,换句话说,target一定会在enemy的右侧
第五行:

target.y + target.height < enemy.y

target的Y坐标加上target的高度小于enemy的Y坐标,直接看示意图

如果target的Y坐标加上高度依然小于enemy的Y坐标,这就代表target一定是在enemy的上方位置
第六行:

enemy.y + enemy.height < target.y

enemy.y的Y坐标加上enemy.y的高度小于target的Y坐标,直接看示意图

如果enemy的Y坐标加上高度依然小于target的Y坐标,这就代表target一定是在enemy的下方位置;

到这里我们不难发现,从第五行到第九行就是一个判断的过程,判断了两个DOM在上、下、左、右这四个方向上的是否是不重合的,最后做了个取反,如果值为true,那么就代表这两者是重合、交叉的部分,也就是发生碰撞了
因此,我们只需要在敌机执行 requestAnimationFrame 的时候做一个检测,检测是否存在敌机与子弹发生碰撞,添加一个 isCollision 方法

this.moveTimer = () => {//敌机移动this.move();// 碰撞检测this.isCollision();// 重绘,无限循环requestAnimationFrame(this.moveTimer);
};
this.moveTimer();

碰撞检测代码如下

isCollision() {if (this.bulletData.length === 0) return;this.bulletData.forEach(el => {const collision = isCollision(el, this.data);if (collision) {new Promise(resolve => {this.data.isExplosion = true;// 删除子弹this.$emit('removeBullet', el.id);setTimeout(() => resolve(), 450);}).then(res => {this.remove();});}});
}

检测到如果与任意一个子弹发生碰撞,那么立即将 isExplosion 设置为true,且将子弹的ID上传到父级,让其删除子弹~

4.3 爆炸动画

敌机的爆炸动画其实我们在之前已经分享过了,这边再简单分享一下,将其和子弹碰撞串起来,核心的点在于上一篇中的 isExplosion ,当 isExplosion 被设置成true的时候,也就是这一段

this.data.isExplosion = true;

一旦data的isExplosion为true,那么我们在computed中设置的样式会立即发生对应的变化

 computed: {getEnemyClass() {const classStyle = [`enemy_${this.data.type}`];const explosion = {};explosion[`enemy_${this.data.type}_effect`] = this.data.isExplosion;classStyle.push(explosion);return classStyle;}},

原来返回的是:

[`enemy_1`]

会变成返回

[`enemy_1`,{enemy_1_effect:true}]

这就代表enemy_1_effect这个类名上添加的animation动画会被立刻触发,其爆炸效果也就会立刻显示;
可能有小伙伴会问,这里的延迟是怎么实现的,我们知道爆炸效果是有一个延迟的,爆炸效果持续了0.45秒,0.45秒后需要将敌机移除,这里的延迟是通过 promise+setTimeout 实现的

new Promise(resolve => {this.data.isExplosion = true;// 删除子弹this.$emit('removeBullet', el.id);setTimeout(() => resolve(), 450);
}).then(res => {this.remove();
});

通过 setTimeout 将移除这个功能延迟到0.45秒之后执行,这样就实现了县执行爆炸动画,当爆炸动画显示了0.45秒以后,执行 remove函数,将对应敌机删除掉;

五. 阶段性展示

到这一章节,我们已经实现的效果图如下:

六. 小结

本文主要概述了碰撞以及爆炸效果的实现,主要包含:

  • 碰撞检测:我们在敌机每次渲染位移的时候多进行了一步碰撞检测,在检测中如果发现子弹与敌机存在DOM上的交叉,那么我们就认为两种进行碰撞了,一旦发生碰撞敌机就需要执行爆炸动画,之后移除敌机,而子弹则在一开始碰撞时就立刻进行移除~
  • 爆炸动画:爆炸动画其实在之前的对应模型实现中就已经实现了,这里只是给予其触发的一个提示,当这个提示出现时,敌机立刻执行爆炸动画~

到这里,飞机大战算是简单的,基本的能玩了,有我方飞机,有敌机,有子弹,子弹能摧毁敌机,基本上所有主要条件算是凑齐了,有兴趣的小伙伴一定要亲自试试~还是非常有趣的;

《uni-app》一个非canvas的飞机对战小游戏实现-碰撞检测的实现相关推荐

  1. 《uni-app》一个非canvas的飞机对战小游戏实现-敌机模型实现

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言-博主看到后会去代替大家踩坑的-接下来的几篇都是uni-app的小实战,有助于我们更好的去学 ...

  2. 《uni-app》一个非canvas的飞机对战小游戏实现(一)准备

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言-博主看到后会去代替大家踩坑的-接下来的几篇都是uni-app的小实战,有助于我们更好的去学 ...

  3. 《uni-app》一个非canvas的飞机对战小游戏-启动页

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言-博主看到后会去代替大家踩坑的-接下来的几篇都是uni-app的小实战,有助于我们更好的去学 ...

  4. 《uni-app》一个非canvas的飞机对战小游戏实现-我方飞机实现

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言-博主看到后会去代替大家踩坑的-接下来的几篇都是uni-app的小实战,有助于我们更好的去学 ...

  5. 《uni-app》一个非canvas的飞机对战小游戏实现-requestAnimationFrame详解

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言-博主看到后会去代替大家踩坑的-接下来的几篇都是uni-app的小实战,有助于我们更好的去学 ...

  6. 怎么开发联机小游戏_Q飞机游戏:空战吃鸡大乱斗游戏!好玩的联机Q飞机对战小游戏...

    20000+游戏爱好者已加入我们! 带你发现好游戏! <Q飞机>游戏小程序好玩吗? <Q飞机>小游戏怎么玩? 只有你想不到, 没有我找不到的好游戏! 「良心好游戏推荐」 搜罗了 ...

  7. 基于LabVIEW的飞机大作战小游戏(可做毕设)

    一.前言 Python是目前相当流行的一门编程语言,网上有人用Python做了一个<飞机大作战>的小游戏,并且出了一份视频教程,很有意思."基于Python的飞机大作战小游戏&q ...

  8. c语言小程序飞机大战,飞机大战微信小游戏:经典像素飞机大战小程序,点开即玩...

    50000+游戏爱好者已加入我们! 每天推荐好玩游戏! 关注我们,沐沐带你发现好游戏! <经典像素飞机大战>游戏小程序好玩吗? <经典像素飞机大战>小游戏怎么玩? 怎么进入&l ...

  9. HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形

    HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形 游戏介绍 完整代码 代码目录 游戏运行 HTML5 canvas 绘制图形 canvas 介绍 绘制函数 加载图片 生物行走动画绘制 ...

最新文章

  1. 面试必备:6个你必须熟练掌握的机器学习算法
  2. Bootstrap 手风琴搭配导航条实现常用菜单栏
  3. 让ASP.NET5在Jexus上飞呀飞
  4. 程序代码移植和烧录需要注意什么_购买建站模板需要注意什么问题
  5. 获取并编译linux源码,linux – 从源代码编译软件:如何收集依赖项列表?
  6. layout_gravity和gravity的区别
  7. jquery中的过滤filter not的用法以及可以添加this
  8. php startup memcache,centos php 安装memcache模块
  9. stackoverflow图片大小修改
  10. 佩戴十字架项链有什么特殊含义?
  11. 数据仓库系列之总线架构
  12. 计算机系统漏洞及防范,计算机系统漏洞以及防范的措施.doc
  13. 大厂Java面试过程中如何介绍自己的项目经历?
  14. python批量处理图片属性_python PIL 批量处理处理图片
  15. ofo小黄车骑车券无条件领取,人人有份!
  16. BR/EDR控制器: 基带规范(Baseband Specification)
  17. Mysql安装教程,最简单的配置
  18. 如何从一个虚拟主机迁移数据到另一个虚拟主机
  19. 关于一体机外卖单不打印外卖单号FAQ(适用正餐6.0.09,轻餐4.0.6.1,轻餐4.0.6.2)
  20. 水滴筹-商业模式画布

热门文章

  1. Java基础笔记-Java8及其他新特性
  2. java面试题大汇总,京东校招java面试题
  3. 2021威海高考成绩查询电话,2021威海高考成绩查询系统
  4. Innodb简介及性能调优
  5. 耶稣13门徒c语言算法,【C语言】耶稣门徒问题求解——谁是叛徒
  6. Java基础学习(6)---Java面向对象
  7. git stats生成html不显示,性能 – JMeter:生成Taurus无法生成的默认html报告
  8. kde调整分辨率_7个很酷的KDE调整将改变您的生活
  9. qt获得当前窗口所在屏幕的大小
  10. 高级计算机网络实验——c++实现ping工具