经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
如何使用ES6的class类继承来实现绚丽小球效果
来源:jb51  时间:2021/6/15 14:18:09  对本文有异议

介绍

本效果采用Canvas画布绘制,再利用class类继承实现,实现的效果鼠标在指定Canvas位置移动,会在当前鼠标的位置产生随机颜色的小球,之后小球会慢慢消失。

效果图示

实现步骤

  • 书写HTML
  • 创建canvas画布环境
  • 书写小球类Ball
  • 实现继承球类(Ball)的MoveBall类
  • 实例化小球

HTML结构

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>绚丽小球</title>
  7. <style>
  8. #canvas{
  9. margin-left: 100px
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <canvas id="canvas">你的浏览器不支持canvas</canvas>
  15.  
  16. <!-- <script src="./underscore-min.js"></script> -->
  17. <!-- underscore 中已有封装好的 _.random函数,引入就可以不用再手动写随机函数 -->
  18. <script src="./index.js"></script>
  19. </body>
  20. </html>

创建canvas画布环境

  1. // index.js
  2. // 1、获取当前的画布
  3. const canvas = document.getElementById('canvas');
  4. const ctx = canvas.getContext('2d');
  5. // 设置画布的大小样式
  6. canvas.width = 1000;
  7. canvas.height = 600;
  8. canvas.style.backgroundColor = '#000'

实例解析

首先,找到 canvas 元素:

  1. const canvas=document.getElementById("myCanvas");
  2.  

然后,创建 context 对象:

  1. const ctx = canvas.getContext('2d');
  2.  

设置宽高背景色

书写小球类Ball

  1. // index.js
  2.  
  3. // 2、小球类
  4. class Ball {
  5. constructor (x, y, color) {
  6. this.x = x; // x轴
  7. this.y = y; // y轴
  8. this.color = color; // 小球的颜色
  9. this.r = 40; // 小球的半径
  10. }
  11. // 绘制小球
  12. render () {
  13. ctx.save();
  14. ctx.beginPath();
  15. ctx.arc(this.x, this.y, this.r , 0, Math.PI * 2);
  16. ctx.fillStyle = this.color;
  17. ctx.fill();
  18. ctx.restore();
  19. }
  20. }

实例解析

  • 可以看到里面有一个constructor()方法,这就是构造方法,而this关键字则代表实例对象。
  • save() ---- 保存当前环境的状态
  • beginPath() ---- 起始一条路径,或重置当前路径
  • arc() ---- 用于创建弧/曲线(用于创建圆或部分圆)-- 参数如下表
参数 描述
x 圆的中心的 x 坐标。
y 圆的中心的 y 坐标。
r 圆的半径。
sAngle 起始角,以弧度计(弧的圆形的三点钟位置是 0 度)。
eAngle 结束角,以弧度计。
counterclockwise 可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
  • fillStyle() ---- 设置或返回用于填充绘画的颜色、渐变或模式。
  • fill() ---- 填充当前绘图(路径)
  • restore() ---- 返回之前保存过的路径状态和属性。

实现继承球类(Ball)的MoveBall类

  1. // index.js
  2.  
  3. // 3、会移动小球的类
  4. class MoveBall extends Ball { // 继承
  5. constructor (x, y, color) {
  6. super(x, y, color);
  7.  
  8. // 量的变化
  9. // 小球的随机坐标
  10. this.dX = Random(-5, 5);
  11. this.dY = Random(-5, 5);
  12. // 半径变小的随机数,因为小球是从一开始大然后慢慢的消失
  13. this.dR = Random(1, 3);
  14. }
  15.  
  16. // 4、改变小球的位置和半径
  17. upDate () {
  18. this.x += this.dX;
  19. this.y += this.dY;
  20. this.r -= this.dR;
  21. // 判断小球的半径是否小于0
  22. if(this.r < 0) {
  23. this.r = 0 // 半径为0表示小球消失
  24. }
  25. }
  26. }

实例解析

  • 这里定义了一个MoveBall 类,该类通过extends关键字,继承了Ball类的所有属性和方法。
  • super关键字,它在这里表示父类的构造函数,用来新建父类的this对象。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象。(详情请点击)
  • upDate方法目的就是改变小球的位置和半径,根据鼠标位置的不同进行不同的变化

实例化小球

  1. // index.js
  2.  
  3. // 5、实例化小球
  4.  
  5. // 存放产生的小球
  6. let ballArr = [];
  7.  
  8. // 定义随机函数 如果引用了underscore-min.js 就不用写随机函数,可以直接用 _.random
  9. let Random = (min, max) => {
  10. return Math.floor(Math.random() * (max - min) + min);
  11. }
  12.  
  13. // 监听鼠标的移动
  14. canvas.addEventListener('mousemove', function (e){
  15. // 随机颜色
  16. // 也可以固定颜色数组 let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
  17. // bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
  18. let bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})`;
  19. ballArr.push(new MoveBall(e.offsetX, e.offsetY, bgColor));
  20. console.log(ballArr);
  21. })
  22.  
  23. // 开启定时器
  24. setInterval(function () {
  25.  
  26. // 清屏
  27. ctx.clearRect(0, 0, canvas.width, canvas.height);
  28.  
  29. // 绘制小球
  30. for (let i = 0 ; i < ballArr.length; i++ ) {
  31. ballArr[i].render();
  32. ballArr[i].upDate();
  33. }
  34. }, 50);

实例解析

  • 书写了一个用于产生随机颜色的Random函数
  • 监听鼠标的移动创建移动的小球,然后推入存储小球的数组中,这样数组里的小球就有render和upDate方法,最后依次调用Ball类的render方法进行绘制,调用MoveBall的upDate方法。至此效果就出来啦!
  • clearRect清屏操作 ---- 在给定的矩形内清除指定的像素(详情点击)。不清屏的效果看下图

我们可以看到不清屏小球半径逐渐缩小到最后小球是不会消失的,咋们肯定要的效果不是这样啦!清屏的效果是啥呢?就是文章开头的那个效果啦!(宝,玩得开心哟❤)

index.js完整代码

  1. // 1、获取当前的画布
  2. const canvas = document.getElementById('canvas');
  3. const ctx = canvas.getContext('2d');
  4.  
  5. // 设置画布的大小样式
  6. canvas.width = 1000;
  7. canvas.height = 600;
  8. canvas.style.backgroundColor = '#000'
  9.  
  10. // 2、小球类
  11. class Ball {
  12. constructor (x, y, color) {
  13. this.x = x;
  14. this.y = y;
  15. this.color = color;
  16. this.r = 40;
  17. }
  18.  
  19. // 绘制小球
  20. render () {
  21. ctx.save();
  22. ctx.beginPath();
  23. ctx.arc(this.x, this.y, this.r , 0, Math.PI * 2);
  24. ctx.fillStyle = this.color;
  25. ctx.fill();
  26. ctx.restore();
  27. }
  28.  
  29. }
  30.  
  31. // 3、会移动小球的类
  32. class MoveBall extends Ball { // 继承
  33. constructor (x, y, color) {
  34. super(x, y, color);
  35.  
  36. // 量的变化
  37. // 小球的随机坐标
  38. this.dX = Random(-5, 5);
  39. this.dY = Random(-5, 5);
  40. // 半径变小的随机数
  41. this.dR = Random(1, 3);
  42. }
  43.  
  44. // 4、改变小球的位置和半径
  45. upDate () {
  46. this.x += this.dX;
  47. this.y += this.dY;
  48. this.r -= this.dR;
  49. // 判断小球的半径是否小于0
  50. if(this.r < 0) {
  51. this.r = 0
  52. }
  53. }
  54.  
  55. }
  56.  
  57. // 5、实例化小球
  58.  
  59. // 存放产生的小球
  60. let ballArr = [];
  61.  
  62. // 定义随机函数 如果引用了underscore-min.js 就不用写随机函数,可以直接用 _.random
  63. let Random = (min, max) => {
  64. return Math.floor(Math.random() * (max - min) + min);
  65. }
  66.  
  67. // 监听鼠标的移动
  68. canvas.addEventListener('mousemove', function (e){
  69. // 随机颜色
  70. // 也可以固定颜色数组 let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
  71. // bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
  72. let bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})`;
  73. ballArr.push(new MoveBall(e.offsetX, e.offsetY, bgColor));
  74. console.log(ballArr);
  75. })
  76.  
  77. // 开启定时器
  78. setInterval(function () {
  79.  
  80. // 清屏
  81. ctx.clearRect(0, 0, canvas.width, canvas.height);
  82.  
  83. // 绘制小球
  84. for (let i = 0 ; i < ballArr.length; i++ ) {
  85. ballArr[i].render();
  86. ballArr[i].upDate();
  87. }
  88. }, 50);

总结

希望这个小demo能帮大家更熟悉ES6中class类的理解与使用,到此这篇关于如何使用ES6的class类继承来实现绚丽小球效果的文章就介绍到这了,更多相关ES6 class类继承实现小球内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号