广告
返回顶部
首页 > 资讯 > 精选 >怎么在Html5中使用Canvas实现动画碰撞检测功能
  • 239
分享到

怎么在Html5中使用Canvas实现动画碰撞检测功能

2023-06-09 13:06:14 239人浏览 独家记忆
摘要

本篇文章为大家展示了怎么在HTML5中使用canvas实现动画碰撞检测功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵

本篇文章为大家展示了怎么在HTML5中使用canvas实现动画碰撞检测功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

html有什么特点

1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端开发者使用。2、可扩展性:超级文本标记语言的广泛应用带来了加强功能,增加标识符等要求,超级文本标记语言采取子类元素的方式,为系统扩展带来保证。 3、平台无关性:超级文本标记语言能够在广泛的平台上使用,这也是万维网盛行的一个原因。4、通用性:HTML是网络的通用语言,它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器。

1、基于矩形的碰撞检测

所谓碰撞检测就是判断物体间是否发生重叠,这里我们假设讨论的碰撞体都是矩形物体。下面示例中我们将创建两个rect对象A和B(以下简称A,B),其中A位置固定,B跟随鼠标移动,当A,B重叠时控制台将提示intercect!!

1、创建Rect对象

这里我们新建Rect.js,建立Rect对象并为其添加原型方法draw,该方法将根据当前对象的属性(位置、大小)绘制到传入的画布对象(context)中。

代码如下 :

function Rect(x,y,width,height) {    this.x = x;    this.y = y;    this.width = width;    this.height = height;}Rect.prototype.draw = function(context){    context.save();    context.translate(this.x,this.y);    context.fillRect(0,0,this.width,this.height);    context.restore();}

2、获取鼠标位置

因为B需要跟随鼠标移动所以我们需要检测鼠标在画布的当前位置。创建Capturemouse函数检测鼠标在传入的文档节点(element)上的移动并返回一个mouse对象(其中包含了鼠标的x,y坐标)。

代码如下:

function Capturemouse (element) {    var mouse={x:null,y:null};    element.addEventListener('mousemove',function (event) {        var x, y;        if(event.pageX || event.pageY){            x = event.pageX;            y = event.pageY;        }else{            x = event.clientX+document.body.scrollLeft+                document.documentElement.scrollLeft;            y = event.clientY+document.body.scrollTop+                document.documentElement.scrollTop;        }        x -=element.offsetLeft;        y -=element.offsetTop;        mouse.x = x;        mouse.y = y;    },false);    return mouse;}

3、碰撞检测

检测A,B是否发生重叠,在讨论是否发生重叠时我们可以先看看没有重叠的四种情况,如下图:

怎么在Html5中使用Canvas实现动画碰撞检测功能

以下是对这四种状态的判断:

rectB.y+rectB.height < rectA.y
2、rectB.y > rectA.x +rectA.width
3、rectB.y > rectA.y + rectA.height
4、rectB.x+rectB.width < rectA.x

知道如何判断没有重叠的状态,那发生重叠的状态该如何判断呢?没错“取反”!,我们创建函数Interaect并添加到Init.js中,该函数传入两个Rect对象参数,当两Rect对象发生重叠将返回true。

代码如下:

function Intersect(rectA,rectB) {    return !(rectB.y+rectB.height < rectA.y || rectB.y > rectA.x +rectA.width ||        rectB.y > rectA.y + rectA.height|| rectB.x+rectB.width < rectA.x)}

4、动画循环

新建animationjs,设置requestAnimationFrame()动画函数。

在循环体中将做以下两件事:

  • “清空”当前canvas中内容,为绘制下一帧做准备。

  • 检测A,B是否发生重叠,若重叠则在控制台输出interact!!!

  • 检测当前鼠标在canvas上的移动并将鼠标位置更新到B的位置属性中。

  • 根据新的位置属性重新绘制A,B(当然,A的位置不会更新但因为每次循环将清空canvas所以需要重新绘制)

代码如下:

function drawAnimation() {    window.requestAnimationFrame(drawAnimation);    context.clearRect(0, 0, canvas.width, canvas.height);    if(Intersect(rectA,rectB)){     console.log('interact!!!!');    }    if(mouse.x){        rectB.x = mouse.x;        rectB.y = mouse.y;    }    rectA.draw(context);    rectB.draw(context);}

初始化

新建Init.js ,获取canvas元素并绑定鼠标移动检测,初始化Rect对象A和B,最后开启动画循环。

代码如下:

window.onload = function () {    canvas = document.getElementById('collCanvas');    context = canvas.getContext('2d');    Capturemouse(canvas);    rectA = new Rect(canvas.width/2,canvas.height/2,100,100);    rectB = new Rect(100,100,100,100);    drawAnimation();}

2、基于圆形的碰撞检测

说完矩形碰撞,我们再来聊聊圆形碰撞,同样我们将创建两个Circle对象A和B(以下简称A,B),其中A位置固定,B跟随鼠标移动,当A,B重叠时控制台将提示intercect!!

1、创建circle对象

function Circle(x,y,radius) {    this.x = x;    this.y = y;    this.radius = radius;}Circle.prototype.draw = function(context){    context.save();    context.translate(this.x,this.y);    context.beginPath();    context.arc(0,0,this.radius,0,Math.PI*2,false);    context.fill();    context.restore();}

2、检测圆形碰撞

圆形间碰撞检测可以简单地通过两圆心间距离与两圆半径之和的比较做判断,当两圆心距离小于两圆半径之和时则发生碰撞。

如下图:

怎么在Html5中使用Canvas实现动画碰撞检测功能

所以我们首先需要做的是计算出两圆心间的距离,这里我们将用到两点间的距离公式,如下:

怎么在Html5中使用Canvas实现动画碰撞检测功能

当取得两圆心间的距离之后将与两圆半径之和比较,如果距离小于半径之和则返回true。

现在我们更新Interaect函数。

代码如下:

function Intersect(circleA,circleB) {    var dx = circleA.x-circleB.x;    var dy = circleA.y-circleB.y;    var distance = Math.sqrt(dx*dx+dy*dy);    return distance < (circleA.radius + circleB.radius);}

3、动画循环

更新animation.js,这里我们替换Rect对象为Circle对象。

代码如下:

function drawAnimation() {    window.requestAnimationFrame(drawAnimation);    context.clearRect(0, 0, canvas.width, canvas.height);    if(Intersect(circleA,circleB)){     console.log('interact!!!!');    }    if(mouse.x){        circleB.x = mouse.x;        circleB.y = mouse.y;    }    circleA.draw(context);    circleB.draw(context);}

4、初始化

更新Init.js ,初始化Circle对象A和B,最后开启动画循环。

代码如下:

window.onload = function () {    canvas = document.getElementById('collCanvas');    context = canvas.getContext('2d');    Capturemouse(canvas);    circleA = new Circle(canvas.width/2,canvas.height/2,100);    circleB = new Circle(100,100,100);    drawAnimation();}

3、基于矩形与圆形间的碰撞检测

前面讲解都是单一形状间的碰撞检测,下面我们将检测矩形和圆形间的碰撞。

检测碰撞

和矩形检测一样,我们先看看没有发生碰撞的四种情况。

如下图:

怎么在Html5中使用Canvas实现动画碰撞检测功能

以下是对这四种状态的判断:

  • Circle.y + Circle.radius < Rect.y

  • Circle.x - Circle.radius > Rect.x + Rect.width

  • Circle.y - Circle.radius > Rect.y + Rect.height

  • Circle.x + Circle.radius < Rect.x

更新Interaect函数,将没有重叠的状态“取反”,向该函数传入Rect对象和Circle对象,当Rect对象与Circle对象发生重叠将返回true。

代码如下:

function Intersect(Rect,Circle) {    return !(Circle.y + Circle.radius < Rect.y ||             Circle.x - Circle.radius > Rect.x + Rect.width ||             Circle.y - Circle.radius > Rect.y + Rect.height ||             Circle.x + Circle.radius < Rect.x)}

2、动画循环

更新animation.js,这里我们将circle对象跟随鼠标运动,并检测与固定位置的rect对象的碰撞。

代码如下:

function drawAnimation() {    window.requestAnimationFrame(drawAnimation);    context.clearRect(0, 0, canvas.width, canvas.height);    if(Intersect(rect,circle)){     console.log('interact!!!!');    }    if(mouse.x){        circle.x = mouse.x;        circle.y = mouse.y;    }    circle.draw(context);    rect.draw(context);}

3、初始化

更新Init.js ,初始化Circle对象和Rect对象,最后开启动画循环。

代码如下:

window.onload = function () {    canvas = document.getElementById('collCanvas');    context = canvas.getContext('2d');    Capturemouse(canvas);    circle = new Circle(100,100,100);    rect = new Rect(canvas.width/2,canvas.height/2,100,100);    drawAnimation();}

上述内容就是怎么在Html5中使用Canvas实现动画碰撞检测功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Html5中使用Canvas实现动画碰撞检测功能

本文链接: https://www.lsjlt.com/news/256179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Html5中使用Canvas实现动画碰撞检测功能
    本篇文章为大家展示了怎么在Html5中使用Canvas实现动画碰撞检测功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵...
    99+
    2023-06-09
  • Html5如何实现Canvas动画基础碰撞检测
    这篇文章主要介绍了Html5如何实现Canvas动画基础碰撞检测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Html5 Canvas动...
    99+
    2022-10-19
  • 使用Canvas怎么实现文字碰撞检测并抽稀
    使用Canvas怎么实现文字碰撞检测并抽稀?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。计算文字在 canvas 中所占据的范围// 计算文字所需的宽度var&n...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现一个动态画饼状图
    怎么在html5中使用canvas实现一个动态画饼状图?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先用canvas画实心圆//伪代码var canv...
    99+
    2023-06-09
  • HTML5中怎么用Canvas实现文字动画特效
    本篇内容介绍了“HTML5中怎么用Canvas实现文字动画特效”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-19
  • 怎么在html5中使用Canvas自定义路径动画
    怎么在html5中使用Canvas自定义路径动画?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。创建Path制作动画前,先要拿到动画的路径,对此我们可以直接使用svg的pat...
    99+
    2023-06-09
  • 怎么在html5中利用canvas实现一个弹幕功能
    本篇文章为大家展示了怎么在html5中利用canvas实现一个弹幕功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(function () {   ...
    99+
    2023-06-09
  • HTML5中怎么用Canvas实现3D水体模拟动画
    这篇文章主要介绍了HTML5中怎么用Canvas实现3D水体模拟动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML5中怎么用Canvas实现3D水体模拟动画文章都会有所...
    99+
    2022-10-19
  • 怎么在JavaScript中使用canvas实现一个画板和签字板功能
    怎么在JavaScript中使用canvas实现一个画板和签字板功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。<!DOCTYPE html><...
    99+
    2023-06-06
  • 使用python与opencv怎么实现一个运动检测器功能
    使用python与opencv怎么实现一个运动检测器功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python主要用来做什么Python主要应用于:1、We...
    99+
    2023-06-06
  • 怎么在H5中使用canvas实现一个动态图形功能
    怎么在H5中使用canvas实现一个动态图形功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是动画?我们在绘制动画之前必须要弄清楚什么是动画,一个动画最起码需要哪些基...
    99+
    2023-06-09
  • HTML5中怎么用Canvas实现超炫酷烟花绽放动画
    这篇文章主要介绍了HTML5中怎么用Canvas实现超炫酷烟花绽放动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML5中怎么用Canvas实现超炫酷烟花绽放动画文章都会...
    99+
    2022-10-19
  • 怎么在python中利用opencv实现一个车道线检测功能
    这篇文章将为大家详细讲解有关怎么在python中利用opencv实现一个车道线检测功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现思路:canny边缘检测获取图中的边缘信息;2、霍夫变...
    99+
    2023-06-06
  • 使用opencv怎么实现一个车道线检测功能
    这篇文章给大家介绍使用opencv怎么实现一个车道线检测功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。原理:算法基本思想说明:传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受...
    99+
    2023-06-06
  • 使用socket.io 和canvas怎么实现一个共享画板功能
    这期内容当中小编将会给大家带来有关使用socket.io 和canvas怎么实现一个共享画板功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。git clone <reposit...
    99+
    2023-06-09
  • 如何在python中使用opencv实现一个颜色检测功能
    本文章向大家介绍如何在python中使用opencv实现一个颜色检测功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络...
    99+
    2023-06-06
  • 怎么在Html5页面中使用JSON实现一个动画
    今天就跟大家聊聊有关怎么在Html5页面中使用JSON实现一个动画,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.demo.html里面有很多内联的东西,使用时堆积在页面内不好看仔...
    99+
    2023-06-09
  • 怎么在HTML5中实现移动端复制功能
    本篇文章为大家展示了怎么在HTML5中实现移动端复制功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用clipboard.js实现移动端粘贴复制 clipboard.js是一款很强大的粘贴复制的...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现柱状图
    这篇文章给大家介绍怎么在html5中使用canvas实现柱状图,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用方式首先我们看一下使用方式,参考了部分ECharts的使用方式,先传入要显示图表的html标签,接着调用i...
    99+
    2023-06-09
  • 怎么在HTML5中使用websocket实现直播功能
    这篇文章给大家介绍怎么在HTML5中使用websocket实现直播功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。录像页面HTML结构<video autoplay id="sou...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作