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 相关文章推荐
Ajax,UTF-8还是GB2312 eval 还是execScript
Nov 13 Javascript
jquery对表单操作2
Apr 06 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 Javascript
js确定对象类型方法
Mar 30 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
Aug 19 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
Jul 01 Javascript
浅谈Vue.js中的v-on(事件处理)
Sep 05 Javascript
jQuery实现的简单前端搜索功能示例
Oct 28 jQuery
vue实现模态框的通用写法推荐
Feb 26 Javascript
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
Vue的props父传子的示例代码
May 20 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
PHP中SimpleXML函数用法分析
2014/11/26 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
python如何把字符串类型list转换成list
2020/02/18 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
linux面试题参考答案(5)
2016/11/05 面试题
职业生涯规划怎么写
2013/12/29 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
党员演讲稿
2014/09/04 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书