既然是飞机大战 那必定少不了子弹追踪

那么添加子弹追踪功能的实现如下:


// 原文链接:https://blog.csdn.net/erweimac/article/details/82256087
// https://blog.csdn.net/weixin_30756499/article/details/97551805
// https://blog.csdn.net/looffer/article/details/8846159
// https://github.com/processing/p5.js
/*** @description: 追踪目标* @param {number} x1 追踪目标x轴* @param {number} y1 追踪目标y轴* @param {number} x2 追踪者x轴* @param {number} y2 追踪者y轴* @param {number} speed 追踪者速度* @return {Object} {x, y} 返回下一次要移动的位置*/
function FollowUpBullet(x1, y1, x2, y2, speed) {// 向量const deltaX = x1 - x2;const deltaY = y1 - y2;// 微小偏移if (deltaX == 0) {if (y1 >= y2) {deltaX = 0.0000001;} else {deltaX = -0.0000001;}}if (deltaY == 0) {if (x1 >= x2) {deltaY = 0.0000001;} else {deltaY = -0.0000001;}}let angle = 0;let π = Math.PI;// 右下角if (deltaX > 0 && deltaY > 0) {angle = Math.atan(Math.abs(deltaY / deltaX)); // 第一项限// 左下角} else if (deltaX < 0 && deltaY > 0) {angle = π - Math.atan(Math.abs(deltaY / deltaX)); // 第二项限// 左上角} else if (deltaX < 0 && deltaY < 0) {angle = π + Math.atan(Math.abs(deltaY / deltaX)); // 第三项限// 右上角} else {angle = 2 * π - Math.atan(Math.abs(deltaY / deltaX)); // 第四项限}let x = speed * Math.cos(angle);let y = speed * Math.sin(angle);return { x, y, angle: calAngle(x2, y2, x1, y1) };
}
// 参考:https://juejin.cn/post/6844903880493367304
// 计算角度
function calAngle(cx, cy, x, y) {const radian = getCosBy2pt(x, y, cx, cy);let angle = (Math.acos(radian) * 180) / Math.PI;if (x < cx) angle = -angle;return angle;// 计算 点1指点2形成 的向量function getCosBy2pt(x, y, cx, cy) {let a = [x - cx, y - cy];let b = [0, -1];return calCos(a, b);}function calCos(a, b) {// 点积let dotProduct = a[0] * b[0] + a[1] * b[1];let d =Math.sqrt(a[0] * a[0] + a[1] * a[1]) *Math.sqrt(b[0] * b[0] + b[1] * b[1]);return dotProduct / d;}
}

当然做之前肯定百度了一下 既然可以CV就尽量不自己写代码
跟踪代码有了 那么就是实装了

// 跟踪子弹// 获取敌机的数据const enemyStoreList = enemyStore.getStore();const keys = Object.keys(enemyStoreList);// 找到第一个幸运儿const enemy = enemyStoreList[keys[0]];// 如果没有敌机 子弹往前飞if (enemy === undefined) {// 数据移动this.positionY -= this.bulletFlySpeed;} else {// 调用子弹追踪const { x, y, angle } = FollowUpBullet(enemy.positionX + containerInfo.offsetLeft + enemy.width / 2,enemy.positionY + containerInfo.offsetTop + enemy.height / 2,this.positionX,this.positionY,this.bulletFlySpeed);// 保存位置this.positionY += y;this.positionX += x;// 子弹旋转this.angle = angle;

那么就有了追踪效果了 方便的很

这只是当中一个方法 完整飞机大战项目可以查看:https://github.com/SDSGK/plane-ES6

ES6飞机大战篇-添加子弹追踪功能相关推荐

  1. ES6飞机大战篇-封装全局定时器

    最近在编写飞机大战,开发到一半想到 是否可以选择暂停游戏 常见的清理就是用 clearTimerout 或者 clearInterval 那么 如果数量多了 就会出现有些定时器没有清理的问题 为了避免 ...

  2. 飞机大战之-添加子弹

    现在添加字段对象,子弹,敌机,玩家,都是属于modle包中的对象,所以我们新建一个类Bullet 1/定义子弹需要的一些常量,子弹图片的长宽,子弹的坐标. 然后使用Tooklit.getDefault ...

  3. ES6飞机大战篇-敌机自动移动发射子弹

    想要游戏变得有点难度的话 就得让敌机自己动起来(移动轨迹提前设置好)那么就得单独的来进行控制敌机上下左右发射 首先制作数据: /*** health:生命值* width:宽度* height:高度* ...

  4. ES6飞机大战篇-github托管游戏

    研究了一下github 发现居然可以托管网页, 我这个页面也没啥东西 所以就设置了一下 代理了一下 这样就可以直接在线玩了. 如果出现报错 可以等待所有资源加载完毕 毕竟是免费的托管 避免不了的请求慢 ...

  5. 奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作

    奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPG ...

  6. python-pygame实现飞机大战-3-发射子弹以及击中敌机

    承接上两步: 1.python-pygame实现飞机大战-添加背景以及飞机运动 2.python-pygame实现飞机大战-2-添加敌机以及碰撞爆炸 在完成玩家飞机运动,生成敌机飞机以及两者碰撞爆炸后 ...

  7. Python学习日记-第二十六天-飞机大战(发射子弹和碰撞检测)

    系列文章目录 1.发射子弹 2.碰撞检测 一.发射子弹 1.1   添加发射子弹事件 Pygame的定时器使用套路非常固定: 定义定时器常量--eventtid 在初始化方法中,调用set_timer ...

  8. 飞机大战之-添加背景

    之前我们已经生成了一个空白的窗口,接下来我们要在这个窗口上添加背景. 我们新建一个MyPanel的类用来单独设置面板. MyPanel是继承于JPanel的一个子类.导入所需的包. package v ...

  9. java 中飞机大战碰撞检测,飞机大战开发04子弹与敌机的碰撞检测

    先是敌机与玩家子弹的碰撞检测: 代码: GameLayer.h void GameLayer::update(float dt) { for (int i = 0 ;i < m_pEnermyV ...

最新文章

  1. dockerfile tomcat 配置jvm参数_Java 从小白到大牛,JVM 不得不知的一些参数和配置
  2. corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求
  3. Excutor线程池
  4. mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...
  5. p图软件pⅰc_惊爆软件:王者荣耀P图大神,助力少年国服梦
  6. MATLAB使用教程(4)——悄悄滴上手项目
  7. PCWorld选出52个实用网站
  8. 【Windows网络编程】完成端口IOCP介绍(超详细)
  9. 移动前端开发和 Web 前端开发的区别是什么?
  10. python输出矩阵_python输出矩阵
  11. 加密经济学应用的机制设计
  12. GIS应用水平考试2009年度第一次全国统一考试
  13. setImageBitmap 图片太大部分机型不显示
  14. GTD时间管理简洁做法
  15. 学习OpenCV(4) 基于OpenCV的双目测距程序
  16. c语言字符串删掉小写字母
  17. Android面试整理
  18. 【STM32+cubemx】0026 HAL库开发:NRF24L01无线2.4G通信模块的应用
  19. 开关电源芯片(自学使用 码住)
  20. 抽奖!送一箱 GitHub 周边

热门文章

  1. Synchronized代码块锁的是什么?全局锁?对象锁?
  2. 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析
  3. 数据解析中 / %的应用
  4. Android系统静默安装预置应用宝
  5. 操作系统的自我修养-02-玩你妹的“BIOS”
  6. 虚幻4-初识蓝图“设置操控器旋转“
  7. FCFS算法java实现
  8. 程序员要如何走上创业逆袭路,获得百万、千万?
  9. 直拍反手拉球引拍位置及发力技巧
  10. 自动文摘系统实现总结