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 相关文章推荐
javascript函数重载解决方案分享
Feb 19 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
javascript实现表单提交后,提交按钮不可用的方法
Apr 18 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
Django使用多数据库的方法
Sep 06 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
Vue常见面试题整理【值得收藏】
Sep 20 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
深入理解Node内建模块和对象
Mar 12 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
Bootstrap实现模态框效果
Sep 30 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中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
解读ES6中class关键字
2017/11/20 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
Python 多线程实例详解
2017/03/25 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
python输出决策树图形的例子
2019/08/09 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
结束运行python的方法
2020/06/16 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
爱游人:Travelliker
2017/09/05 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
采购主管岗位职责
2014/02/01 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
超市员工辞职信范文
2015/05/12 职场文书
战友聚会致辞
2015/07/28 职场文书
校长新学期寄语2016
2015/12/04 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL