javascript canvas检测小球碰撞


Posted in Javascript onApril 17, 2020

本文实例为大家分享了javascript canvas实现检测小球碰撞的具体代码,供大家参考,具体内容如下

定义一个canvas标签

<div class="cnavasInfo">
 <canvas
  id="canvas"
  width="800"
  height="500"
 ></canvas>
</div>

函数以及相关的逻辑处理

export default {
 data() {
  return {
   canvas: null,
   ctx: null,
   arcObj: {}
  };
 },
 mounted() {
  this.canvas = document.getElementById("canvas");
  this.ctx = this.canvas.getContext("2d");
  // this.move(); // 矩形的边缘碰撞函数
  // this.moveArc(); // 绘制碰撞圆形,对象形式
  this.moveRect()
 },
 methods: {
  move() {
   let x = 0;
   let y = 0;
   let width = 100;
   let height = 100;
   let speedX = 2;
   let speedY = 2;
   let ctx = this.ctx;
   ctx.fillStyle = "red";
   ctx.fillRect(x, y, width, height);
   setInterval(() => {
    ctx.clearRect(x, y, this.canvas.width, this.canvas.height);
    x += speedX;
    if (x > this.canvas.width - width) {
     speedX *= -1;
    } else if (x < 0) {
     speedX *= -1;
    }
    y += speedY;
    if (y > this.canvas.height - height) {
     speedY *= -1;
    } else if (y < 0) {
     speedY *= -1;
    }
    ctx.fillRect(x, y, width, height);
   }, 10);
   // this.requestmove(x,y,width,height,ctx,speedX,speedY); // 请求帧的动画过程
  },
  requestmove(x, y, width, height, ctx, speedX, speedY) {
   ctx.clearRect(x, y, this.canvas.width, this.canvas.height);
   x += speedX;
   if (x > this.canvas.width - width) {
    speedX *= -1;
   } else if (x < 0) {
    speedX *= -1;
   }
   y += speedY;
   if (y > this.canvas.height - height) {
    speedY *= -1;
   } else if (y < 0) {
    speedY *= -1;
   }
   ctx.fillRect(x, y, width, height);
   window.requestAnimationFrame(
    this.requestmove(x, y, width, height, ctx, speedX, speedY)
   );
  },
  moveArc(x, y, r, speedX, speedY) {
   this.x = x;
   this.y = y;
   this.r = r;
   this.speedX = speedX;
   this.speedY = speedY;
   this.moveUpdata = function() {
    this.x += this.speedX;
    if (this.x > this.canvas.width - this.r) {
     this.speedX *= -1;
    } else if (this.x < 0) {
     this.speedX *= -1;
    }
    this.y += this.speedY;
    if (this.y > this.canvas.height - this.r) {
     this.speedY *= -1;
    } else if (this.y < 0) {
     this.speedY *= -1;
    }
   };
  },
  moveRect(){
   // 面向对象编程
   function Rect(x,y,width,height,color,speedX,speedY,ctx,canvas) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.color = color
    this.speedX = speedX
    this.speedY = speedY
    this.ctxRect = ctx
    this.canvas = canvas
   }
   Rect.prototype.draw = function() {
    this.ctxRect.beginPath();
    this.ctxRect.fillStyle = this.color
    this.ctxRect.fillRect(this.x,this.y,this.width,this.height)
    this.ctxRect.closePath();
   }
   Rect.prototype.move = function() {
    this.x += this.speedX
    if(this.x > this.canvas.width - this.width){
     this.speedX *= -1
    } else if(this.x < 0){
     this.speedX *= -1
    }
    this.y += this.speedY
    if(this.y > this.canvas.height - this.height){
     this.speedY *= -1
    } else if(this.y < 0){
     this.speedY *= -1
    }
   }
   let rect1 = new Rect(0,100,100,100,'red',2,2,this.ctx,this.canvas)
   let rect2 = new Rect(300,100,100,100,'blue',-2,-2,this.ctx,this.canvas)
   // rect1.draw();
   // rect2.draw()
   let animate = ()=>{
     this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height)
     rect1.draw()
     rect1.move()
     rect2.draw()
     rect2.move()
    let rect1Min = rect1.x;
    let rect1Max = rect1.x + rect1.width
    let rect2Min = rect2.x
    let rect2Max = rect2.x + rect2.width
    let min = Math.max(rect1Min,rect2Min)
    let max = Math.min(rect1Max,rect2Max)
    if(min < max){
     rect1.speedX *= -1;
     rect1.speedY *= 1;
     rect2.speedX *= -1
     rect2.speedY *= 1
    }
    window.requestAnimationFrame(animate)
   } 
   animate()
  }
 }
};

样式控制

#canvas {
 border: 1px solid black;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
js随机颜色代码的多种实现方式
Apr 23 Javascript
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
使用Promise链式调用解决多个异步回调的问题
Jan 15 Javascript
Javascript原型链及instanceof原理详解
May 25 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
Nov 03 Javascript
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 Javascript
Vue实现浏览器打印功能的代码
Apr 17 #Javascript
基于JavaScript获取url参数2种方法
Apr 17 #Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 #Javascript
vue fetch中的.then()的正确使用方法
Apr 17 #Javascript
如何基于filter实现网站整体变灰功能
Apr 17 #Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 #Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
Apr 17 #Javascript
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
js创建元素(节点)示例
2014/01/02 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
node跨域请求方法小结
2017/08/25 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
幼儿园秋游活动方案
2014/01/21 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
公司管理建议书
2015/09/14 职场文书
《称赞》教学反思
2016/02/17 职场文书