前段时间在研究canvas,感觉还挺好玩的,就写了一个小demo,效果如下:
第一次尝试用js面向对象的方式来写,经验不足,还请大家多多包涵。
下面开始简单介绍代码:
canvas画布:
复制代码 代码如下:<canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas>
彩虹球的随机颜色是通过下面两个方法来实现的,在《js常用方法和一些封装(2) -- 随机数生成》中曾经提到过。
/** * 获取 0 ~ num的随机数(闭区间) */ function randomNum(num){ return Math.floor(Math.random()*(num+1)); }; /** * 获取随机颜色(支持任意浏览器) */ function randomColor16(){ //0-255 var r = randomNum(255).toString(16); var g = randomNum(255).toString(16); var b = randomNum(255).toString(16); //255的数字转换成十六进制 if(r.length<2)r = "0"+r; if(g.length<2)g = "0"+g; if(b.length<2)b = "0"+b; return "#"+r+g+b; };
每当我鼠标点下,其实是在一个矩形区域随机产生不同颜色的彩虹球,彩虹球出现的位置也是随机的,通过范围随机数来实现:
/* * 获取范围随机数 (闭区间) */ function randomRange(start,end){ return Math.floor(Math.random()*(end-start+1))+start; };
接下来是彩虹球的类,用面向对象来做。
//彩虹球的类 var ColorBall = function(){} ColorBall.prototype.left = 0; //X轴 ColorBall.prototype.top = 0; //y轴 ColorBall.prototype.r = 10; //半径
在本案例中,鼠标相当于是彩虹球喷枪,我们也用面向对象的思想来设计它:
//RainbowBrush 彩虹球喷枪 RainbowBrush = function(){} //生产小球数组的方法 RainbowBrush.prototype.getBalls = function(num){ var colorBalls = []; for(var i = 0; i < num; i++){ var ball = new ColorBall(); colorBalls.push(ball); } return colorBalls; } //喷刷彩虹球 RainbowBrush.prototype.brush = function(context,balls,x,y){ balls.forEach(function(ballIem){ ballIem.x = randomRange(x - 6,x + 6); ballIem.y = randomRange(y - 6,y + 6); ballIem.r = 5; context.beginPath(); context.fillStyle=randomColor16(); context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2); context.fill(); }) }
它有两个方法,一个是生产彩虹球,另一个是喷刷彩虹球。
案例的主要逻辑如下:
var rainbowBrush = new RainbowBrush(); //初始化彩虹球喷枪 var balls = rainbowBrush.getBalls(1); //当鼠标按下 canvasDom.onmousedown = function(){ var flag = true; canvasDom.onmousemove = function(e){ var x = e.clientX; var y = e.clientY; if(flag) rainbowBrush.brush(context,balls,x,y); } canvasDom.onmouseup = function(){ flag = false; } }
案例全部代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>彩虹球喷枪</title> </head> <body> <canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas> </body> <script type="text/javascript"> /** * 获取 0 ~ num的随机数(闭区间) */ function randomNum(num){ return Math.floor(Math.random()*(num+1)); }; /* * 获取范围随机数 (闭区间) */ function randomRange(start,end){ return Math.floor(Math.random()*(end-start+1))+start; }; /** * 获取随机颜色(支持任意浏览器) */ function randomColor16(){ //0-255 var r = randomNum(255).toString(16); var g = randomNum(255).toString(16); var b = randomNum(255).toString(16); //255的数字转换成十六进制 if(r.length<2)r = "0"+r; if(g.length<2)g = "0"+g; if(b.length<2)b = "0"+b; return "#"+r+g+b; }; var canvasDom = document.getElementById('canvas'); var context = canvasDom.getContext('2d'); var maxWidth = 1050; var maxHeight = 500; //彩虹球的类 var ColorBall = function(){} ColorBall.prototype.left = 0; //X轴 ColorBall.prototype.top = 0; //y轴 ColorBall.prototype.r = 10; //半径 //RainbowBrush 彩虹球喷枪 RainbowBrush = function(){} //生产小球数组的方法 RainbowBrush.prototype.getBalls = function(num){ var colorBalls = []; for(var i = 0; i < num; i++){ var ball = new ColorBall(); colorBalls.push(ball); } return colorBalls; } //喷刷彩虹球 RainbowBrush.prototype.brush = function(context,balls,x,y){ balls.forEach(function(ballIem){ ballIem.x = randomRange(x - 6,x + 6); ballIem.y = randomRange(y - 6,y + 6); ballIem.r = 5; context.beginPath(); context.fillStyle=randomColor16(); context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2); context.fill(); }) } var rainbowBrush = new RainbowBrush(); //初始化彩虹球喷枪 var balls = rainbowBrush.getBalls(1); //当鼠标按下 canvasDom.onmousedown = function(){ var flag = true; canvasDom.onmousemove = function(e){ var x = e.clientX; var y = e.clientY; if(flag) rainbowBrush.brush(context,balls,x,y); } canvasDom.onmouseup = function(){ flag = false; } } </script> </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月30日
2024年11月30日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]