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 相关文章推荐
Extjs 继承Ext.data.Store不起作用原因分析及解决
Apr 15 Javascript
使用GruntJS构建Web程序之合并压缩篇
Jun 06 Javascript
javascript常用函数归纳整理
Oct 31 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 Javascript
微信小程序左滑删除功能开发案例详解
Nov 12 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
解析JS在获取当前月的最后一天遇到的坑
Aug 30 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
动态规划之使用备忘录来改进Javascript函数
Apr 07 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
jQuery参数列表集合
2011/04/06 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python中datetime常用时间处理方法
2015/06/15 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python交易记录整合交易类详解
2019/07/03 Python
django 控制页面跳转的例子
2019/08/06 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
创业者是否需要商业计划书?
2014/02/07 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
工作保证书范文
2014/04/29 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
2015年试用期工作总结
2014/12/12 职场文书
司考复习计划
2015/01/19 职场文书
学校实习推荐信
2015/03/27 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
Python Pandas 删除列操作
2022/03/16 Python