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 相关文章推荐
静态的动态续篇之来点XML
Aug 15 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
Feb 15 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
微信小程序实现流程进度的图样式功能
Jan 16 Javascript
详解js根据百度地图提供经纬度计算两点距离
May 13 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 Javascript
通过实例解析js可枚举属性与不可枚举属性
Dec 02 Javascript
JavaScript canvas实现流星特效
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+mysql 实现身份验证代码
2010/03/24 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
Python实现Const详解
2015/01/27 Python
12步教你理解Python装饰器
2016/02/25 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
python数组循环处理方法
2019/08/26 Python
python类的实例化问题解决
2019/08/31 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
linux下进程间通信的方式
2014/12/23 面试题
2014年团总支工作总结
2014/11/21 职场文书
中考学习决心书
2015/02/04 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书