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 相关文章推荐
js中获取事件对象的方法小结
Mar 13 Javascript
js 分页全选或反选标识实现代码
Aug 09 Javascript
jQuery实现跨域
Feb 03 Javascript
Uploadify上传文件方法
Mar 16 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
javascript 面向对象实战思想分享
Sep 07 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
vue组件的路由高亮问题解决方法
May 11 Vue.js
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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP新手上路(十)
2006/10/09 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
php数据序列化测试实例详解
2017/08/12 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
教师专业自荐书范文
2014/02/10 职场文书
党员违纪检讨书
2014/02/18 职场文书
投资意向书范本
2014/04/01 职场文书
项目合作协议书
2014/04/16 职场文书
初中班主任评语大全
2014/04/24 职场文书
计算机科学与技术专业求职信
2014/09/03 职场文书
求职信格式范文
2015/03/19 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸