canvas实现探照灯效果


Posted in Javascript onFebruary 07, 2017

canvas中的clip()方法用于从原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)

也可以在使用clip()方法前通过使用save()方法对当前画布区域进行保存,并在以后的任意时间通过restore()方法对其进行恢复

接下来使用clip()方法实现一个探照灯效果

<button id="btn">变换</button>
<button id="con">暂停</button>
<canvas id="canvas" width="400" height="290" style="border:1px solid black">当前浏览器不支持canvas,请更换浏览器后再试</canvas>
<script>
btn.onclick = function(){history.go();}
con.onclick = function(){
 if(this.innerHTML == '暂停'){
  this.innerHTML = '恢复';
  clearInterval(oTimer);
 }else{
  this.innerHTML = '暂停'; 
  oTimer = setInterval(fnInterval,50);
 }
}
var canvas = document.getElementById('canvas');
//存储画布宽高
var H=290,W=400;
//存储探照灯
var ball = {};
//存储照片
var IMG;
//存储照片地址
var URL = 'http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/chunfen.jpg';
function initial(){
 if(canvas.getContext){
  var cxt = canvas.getContext('2d');
  var tempR = Math.floor(Math.random()*30+20);
  var tempX = Math.floor(Math.random()*(W-tempR) + tempR);
  var tempY = Math.floor(Math.random()*(H-tempR) + tempR)  
  ball = {
   x:tempX,
   y:tempY,
   r:tempR,
   stepX:Math.floor(Math.random() * 21 -10),
   stepY:Math.floor(Math.random() * 21 -10)
  };
  IMG = document.createElement('img');
  IMG.src=URL;
  IMG.onload = function(){
   cxt.drawImage(IMG,0,0);
  } 
 } 
}
function update(){
 ball.x += ball.stepX;
 ball.y += ball.stepY; 
 bumpTest(ball);
}
function bumpTest(ele){
 //左侧
 if(ele.x <= ele.r){
  ele.x = ele.r;
  ele.stepX = -ele.stepX;
 }
 //右侧
 if(ele.x >= W - ele.r){
  ele.x = W - ele.r;
  ele.stepX = -ele.stepX;
 }
 //上侧
 if(ele.y <= ele.r){
  ele.y = ele.r;
  ele.stepY = -ele.stepY;
 }
 //下侧
 if(ele.y >= H - ele.r){
  ele.y = H - ele.r;
  ele.stepY = -ele.stepY;
 }
}
function render(){
 //重置画布高度,达到清空画布的效果
 canvas.height = H; 
 if(canvas.getContext){
  var cxt = canvas.getContext('2d');
  cxt.save();
  //将画布背景涂黑
  cxt.beginPath();
  cxt.fillStyle = '#000';
  cxt.fillRect(0,0,W,H);
  //渲染探照灯
  cxt.beginPath();
  cxt.arc(ball.x,ball.y,ball.r,0,2*Math.PI);
  cxt.fillStyle = '#000';
  cxt.fill(); 
  cxt.clip();  
  //由于使用了clip(),画布背景图片会出现在clip()区域内
  cxt.drawImage(IMG,0,0);
  cxt.restore();
 }
}
initial();
clearInterval(oTimer);
function fnInterval(){
 //更新运动状态
 update();
 //渲染
 render(); 
}
var oTimer = setInterval(fnInterval,50);
</script>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
Jun 25 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
使用jQuery实现验证上传图片的格式与大小
Dec 03 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
深入理解 Koa 框架中间件原理
Oct 18 Javascript
js实现表单项的全选、反选及删除操作示例
Jun 05 Javascript
js实现全选和全不选功能
Jul 28 Javascript
javascript数据类型详解
Feb 07 #Javascript
JS简单获取当前年月日星期的方法示例
Feb 07 #Javascript
vuejs指令详解
Feb 07 #Javascript
fullCalendar中文API官方文档
Feb 07 #Javascript
JS常用倒计时代码实例总结
Feb 07 #Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 #Javascript
javascript验证香港身份证的格式或真实性
Feb 07 #Javascript
You might like
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
2013/07/08 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python实现股市信息下载的方法
2015/06/15 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
房地产出纳岗位职责
2013/12/01 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python