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 相关文章推荐
ModelDialog JavaScript模态对话框类代码
Apr 17 Javascript
php对mongodb的扩展(小试牛刀)
Nov 11 Javascript
非html5实现js版弹球游戏示例代码
Sep 22 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
Angular2数据绑定详解
Apr 18 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 Javascript
vue 兄弟组件的信息传递的方法实例详解
Aug 30 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 Javascript
小程序选项卡以及swiper套用(跨页面)
Jun 19 Javascript
JSON stringify方法原理及实例解析
Oct 23 Javascript
微信小程序实现录音Record功能
May 09 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 截取中英文混合字符串的方法
2018/05/31 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
python搜索指定目录的方法
2015/04/29 Python
发布你的Python模块详解
2016/09/15 Python
Python简单读取json文件功能示例
2017/11/30 Python
python中强大的format函数实例详解
2018/12/05 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
pymysql的简单封装代码实例
2020/01/08 Python
Django中的AutoField字段使用
2020/05/18 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
C#实现启动一个进程
2016/10/01 面试题
岗位明星事迹材料
2014/05/18 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
2016大一新生军训感言
2015/12/08 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android