HTML5 Canvas 碰撞检测的简单实现

2023-10-27

本示例中演示的是模拟声纳探测的动画。在黑色的背景中画了两个黑色的障碍物,通过鼠标点击发出的声波可以将其检测出来:声波碰撞到障碍物之后,障碍物将向外发出声波。

代码如下:

HTML代码:

<canvas id="canvas"> <p>Your browser does not support the canvas element!</p> </canvas>

JavaScript代码:

对JS内建对象Array的扩展,使其能删除数组中的某个特定对象

Array.prototype.remove = function(obj) { for (var i = 0; i < this.length; i++) { if (this[i] === obj) { this.splice(i, 1); break; } } }

基础对象类

function BasicObject(x, y, order) { this.x = x; this.y = y; this.order = isNaN(order) ? 0 : order; this.addTo = function(objects) { objects.push(this); objects.sort(function(a, b) {return a.order - b.order;}); } this.removeFrom = function(objects) { objects.remove(this); } }声波类,扩展自基础对象类,并实现了绘制、更新、碰撞检测的方法

function Wave(x, y, r) { BasicObject.call(this, x, y); this.radius = isNaN(r) ? 1 : r; this.color = 255; this.draw = function(context) { context.beginPath(); context.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false); context.strokeStyle = "rgb(" + this.color + ", " + this.color + ", " + this.color + ")"; context.stroke(); } this.update = function(objects) { this.color -= 20; this.radius += 10; if (this.color <= 0) { this.removeFrom(objects); } } this.collide = function(objects) { var isCollided = 0; for (i in objects) { if (objects[i] instanceof Stone) { var d = Math.sqrt(Math.pow(this.x - objects[i].x, 2) + Math.pow(this.y - objects[i].y, 2)); if (d < this.radius + objects[i].radius && d > Math.abs(this.radius - objects[i].radius)) { objects[i].isShocked = true; isCollided++; } } } if (isCollided) { this.removeFrom(objects); } } } Wave.prototype = new BasicObject();障碍物类,扩展自基础对象类,并实现了绘制和碰撞时向外发出声波的方法

function Stone(x, y, r) { BasicObject.call(this, x, y); this.radius = r; this.isShocked = false; this.draw = function(context) { context.beginPath(); context.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false); context.fillStyle = "black"; context.fill(); } this.update = function(objects) { if (this.isShocked) { var wave = new Wave(this.x, this.y, this.radius); wave.addTo(objects); this.isShocked = false; } } } Stone.prototype = new BasicObject();动画引擎类,负责动画的对象初始化、事件处理以及对象管理

function Engin() { var canvas = document.getElementById("canvas"); canvas.width = screen.width - 30; canvas.height = screen.height - 100; var context = canvas.getContext("2d"); var buffer = document.createElement("canvas"); buffer.width = canvas.width; buffer.height = canvas.height; var bufferCtx = buffer.getContext("2d"); var objs = new Array(); const FPS = 20; document.onmousedown = function(event) { var wave = new Wave(event.clientX, event.clientY); wave.addTo(objs); } this.manage = function() { bufferCtx.fillRect(0, 0, buffer.width, buffer.height); context.fillRect(0, 0, canvas.width, canvas.height); for (x in objs) { if (objs[x].update) { objs[x].update(objs); } } for (x in objs) { if (objs[x].draw) { objs[x].draw(bufferCtx); } } for (x in objs) { if (objs[x].collide) { objs[x].collide(objs); } } context.drawImage(buffer, 0, 0); } this.run = function() { var s1 = new Stone(100, 100, 50); var s2 = new Stone(canvas.width / 2, canvas.height / 2, 100); s1.addTo(objs); s2.addTo(objs); setInterval(this.manage, 1000 / FPS); } }程序入口

window.onload = function() { new Engin().run(); }
本示例实现的目的是展示在前一篇示例的动画对象中添加逻辑处理功能的方式。其模型是一种通过继承逐层包裹的对象,最里层是基础对象,中间层中实现绘制和图形更新的方法,而在外层实现逻辑和事务处理。这是我对于动画、游戏引擎的一种思路。

本例中采用的碰撞检测算法是简单的判断圆形是否相交的方法。在后续的文章中将开始使用较复杂的2D碰撞检测算法,如矩形相交、分离轴等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 Canvas 碰撞检测的简单实现 的相关文章

随机推荐

  • python模拟报数游戏

    题目 编写程序 模拟报数游戏 有n个人围成一圈 顺序编号 从第一个人开始从1到k 假设k 3 报数 报到k的人退出圈子 然后圈子缩小 从下一个人继续游戏 问最后留下的是原来的第几号 思路 初步实现功能 使用集合输出剩下的数字 而未考虑是第几
  • 性能测试、负载测试、压力测试-之间的差异

    性能测试 负载测试 压力测试 之间的差异 目录 1 什么是性能测试 2 什么是负载测试 3 什么是压力测试 4 性能测试 vs 负载测试 vs 压力测试 5 为什么要进行性能测试 6 为什么要进行负载测试 7 为什么要进行压力测试 8 什么
  • Streamlit 讲解专栏(六):展示文本魔力

    文章目录 1 前言 2 st markdown 引入丰富的Markdown文本 3 st title 引入引人注目的大标题 4 st header 引入简洁的小标题 5 st subheader 添加次级标题 6 st caption 添加
  • zookeeper的安装配置(详细步骤)

    配置前准备 将apache zookeeper 3 7 0 bin tar gz安装包上传到xshell 在xshell上解压缩包 输入解压命令 cd zookeeper tar zxvf apache zookeeper 3 7 0 bi
  • 【大前端】NestedScrollView/ScrollView 加载完自动滑动至底部导致内容上滑问题解决

    正常情况下 由于NestedScrollView ScrollView 嵌套RecyclerView 可能会导致Recyclerview占据焦点导致整个NestedScrollView ScrollView内容上滑 此问题的解决方案如下 1
  • 在MFC中使用OpenCV2.3.1

    最近要做数字图像处理的项目 大家都说VS MFC OpenCV很好用 于是我就试着弄了下 首先我到OpenCV ChinaOpenCV中文版主页找了一些很不错的教程开始做了 我用的是Visual Studio 2005 OpenCV的版本是
  • 憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台

    憨批的语义分割重制版11 Keras 搭建自己的HRNetV2语义分割平台 学习前言 什么是HRNetV2模型 代码下载 HRNetV2实现思路 一 预测部分 1 主干网络介绍 a Section 1 b Section 2 c Secti
  • SpringBoot返回Json数据

    Spring Boot 返回 Json 数据 XML 文件的解析常见的解析工具有 DOM4j JDOM 等 为了标准化 XML 文件解析 Java 中提出了 JAXP 规范 使用的解析模型有 DOM 将标记语言文档一次性加载进入内存中 在内
  • 第九课: 工作空间-Work Space介绍

    2 7 工作空间 Work Space介绍 工作空间是WorkBench3 3集成开发环境对项目工程进行集中管理的空间 用户创建的BootRom工程 VxWorks工程 Downloadable工程和静态库工程等都存在于Work Space
  • 微信小程序使用crypto.js加密解密

    微信小程序中使用crypto js crypto js是用来进行AES加密的 注意AES在使用时有7个配置项 前后端加解密记着统一参数 测试时注意配置项的选择是否一致 测试工具 AES加密测试工具 下载crypto js npm i cry
  • 闭环系统的零极点图判定稳定性_《自动控制原理》课后习题答案.doc

    第五章 线性系统的频域分析与校正 习题与解答 5 1 试求题5 75图 a b 网络的频率特性 a b 图5 75 R C网络 解 a 依图 b 依图 5 2 某系统结构图如题5 76图所示 试根据频率特性的物理意义 求下列输入信号作用时
  • 点陶极速版《隐私政策》

    点陶极速版 隐私政策 生效日期 2021年3月10日 提示条款 大石桥市多禾网络科技有限公司 以下可统称为 我们 或 多禾 高度重视个人信息的保护 在您使用 点陶极速版 app提供的服务时 以下可称为 点陶极速版 服务 我们将按照本隐私政策
  • c++知识系列:new、operator new、placement new

    总结 operator new 三种形式 http www cplusplus com reference new operator 20new throwing 1 void operator new std size t size th
  • angular11 报错 ERROR Error: If ngModel is used within a form tag, either the name attribute must be s

    angular 报错 ERROR Error If ngModel is used within a form tag either the name attribute must be set or the form control mu
  • hyperledger中cryptogen工具使用

    cryptogen 主要功能 1 生成秘钥和证书文件 2 查看配置模板的信息 cryptogen 命令详解 output 指定存放生成秘钥和证书文件的路径 默认为当前目录下的crypto config目录 config 指定所采用的配置模板
  • 基于注意力机制的 CNN-BiGRU 短期电力负荷预测方法

    提出了一种基于 Attention 机制的CNN BiGRU 卷积神经网络 双向GRU 注意力机制 短期电力负荷预测方法 该方法将历史负荷数据作为输入 搭建由一维卷 积层和池化层等组成的 CNN 架构 提取反映负荷复杂动态变化的高维特征 将
  • 优秀的程序员——勇于尝试新技术并能快速掌握

    一个人有了好奇心求知欲就完了吗 那不能 这可不够 除了好奇去探索外 你还得有把探索所得 转化成自己经验的能力 这种能力的外在表现就是勇于尝试新技术 而且还得快速掌握 再举另一个同事的例子 这个同事在工作中遇到了一个问题 就是存储海量数据的问
  • ruoyi权限验证

    目录 首先在ruoyi的菜单管理中添加权限测试的按钮 设置权限字符 在角色管理中勾选新增加的权限按钮 在ruoyi前端代码中自行添加按钮组件 ajax发送请求给后端接口 后端接口 效果 首先在ruoyi的菜单管理中添加权限测试的按钮 设置权
  • 谷粒商城--nginx--高级篇笔记四

    谷粒商城 nginx 高级篇笔记四 1 nginx搭建域名访问 反向代理 1 1 动静分离 1 2 正向代理与反向代理 正向代理隐藏客户端 反向代理隐藏服务端 1 3 nginx与windows搭建域名访问环境 为什么能够通过修改host文
  • HTML5 Canvas 碰撞检测的简单实现

    本示例中演示的是模拟声纳探测的动画 在黑色的背景中画了两个黑色的障碍物 通过鼠标点击发出的声波可以将其检测出来 声波碰撞到障碍物之后 障碍物将向外发出声波 代码如下 HTML代码