对这段代码不是很理解 能不能给个详细注释一下

对这段代码不是很理解 能不能给个详细注释一下

    // 绘制下落的圆形
  for(var i=0; i<=10; i++) {
    if(!circles[i]) {
      circles[i] = {};
      circles[i].radius = Math.floor(Math.random() * 5) + 1;
      circles[i].y = - circles[i].radius - Math.floor(Math.random() * 10);
      circles[i].x = i * 60 + Math.floor(Math.random() * 10) - 5;
      circles[i].vy = Math.floor(Math.random() * 5) + 1;
    }
    ctx.beginPath();
    ctx.arc(circles[i].x, circles[i].y, circles[i].radius, 0, Math.PI * 2);
    ctx.fillStyle = "rgba(255, 255, 255, 0.5)";
    ctx.fill();
    circles[i].y = circles[i].y + circles[i].vy;
    if(circles[i].y > ctx.canvas.height + circles[i].radius * 2) {
      circles[i] = undefined;
    }
  }


正在回答

登陆购买课程后可参与讨论,去登陆

6回答

同学你好,累加计算理解的没有问题。但是累加在for循环中,循环一次就会累加一次,也就是在一次定时器中会累加11次,下一次定时器中也会累加11次。

祝学习愉快!

提问者 陈立天 2020-08-21 17:43:55
  • 提问者 陈立天 #1
    这样理解对么
    2020-08-21 17:44:07
好帮手慕星星 2020-08-21 13:48:17

同学你好,问题解答如下:

1、定时器在for循环外层,所以是执行一次定时器,就会执行里面的代码,for循环也会全部执行完毕

2、可以参考这个例子,temp变量对比vy

http://img1.sycdn.imooc.com//climg/5f3f5ef1098bcc8b04040277.jpg

http://img1.sycdn.imooc.com//climg/5f3f5f1f099b39b003670271.jpg

开始a的值为0,在for循环中初始i的值0,第一次循环a和i相加为0,然后和temp相加为3 ,不符合if判断,不执行里面的代码。第二次循环,i的值为1,和a相加为4,再和temp相加为7,满足if条件,a的值初始为0 。第三次循环,i的值为2,和a相加为2,再和temp相加为5,不满足if条件,不执行里面的代码。以上就是第一次定时器内执行的过程。

然后第二次定时器内执行和上面类似,还是同样的,for循环会全部执行完毕。

自己测试理解下,祝学习愉快!

好帮手慕星星 2020-08-21 11:29:23

同学你好,问题解答如下:

1、代码中是小于等于10,意思是创建11个球。将数值变大,绘制圆的水平坐标也会变大,因为是根据循环的i值进行计算的

http://img1.sycdn.imooc.com//climg/5f3f3e6f09a71ffc05230027.jpg

超出canvas的时候也会看不到了,所以感觉没有变多。把数值变小是可以看到变少的,自己测试下。

2、绘制圆的各个参数都是随机计算的,自己也可以修改

http://img1.sycdn.imooc.com//climg/5f3f3ec50976487a08040200.jpg

3、循环外层用了定时器,不要看漏了

http://img1.sycdn.imooc.com//climg/5f3f3f160951b7a209610324.jpg

还有一点,一个圆绘制之后,垂直方向坐标值会增加,vy是增加的值,第二次定时器的时候,会在增加的坐标上进行绘制,这样也就实现了下落的过程。还有判断,如果超出了canvas视口,重置绘制数据

http://img1.sycdn.imooc.com//climg/5f3f3ed0099cf83907790148.jpg

自己再理解下,祝学习愉快!

  • 提问者 陈立天 #1
    我想知道这里是先执行完毕for循环还是for循环没执行完就执行了定时器?
    2020-08-21 12:20:29
  • 提问者 陈立天 #2
    我不明白这里是如何通过定时器 对y=y+vy进行了累加? 能不能举个例子 比如在第一次定时器的时候 和第二次的时候 在哪里进行了累加y的?
    2020-08-21 12:38:15
提问者 陈立天 2020-08-20 20:36:37

 circles[i].radius = Math.floor(Math.random() * 5) + 1;

      circles[i].y = - circles[i].radius - Math.floor(Math.random() * 10);

      circles[i].x = i * 60 + Math.floor(Math.random() * 10) - 5;

      circles[i].vy = Math.floor(Math.random() * 5) + 1;

    }


能不能标注一下这几个算法的细节 我不是很理解。另外 不明白代码是如何能让球体运动往下的?视频前面老师教过的运动动画 是使用setinterval 来实现的,这里面没有运用到这个 是如何让球体往下动起来的?

  • 提问者 陈立天 #1
    这里的循环小于10意思是创建10个球的意思么? 我尝试小于100 也没见球变多 怎么回事?
    2020-08-20 20:47:30
好帮手慕言 2020-08-20 19:22:11

同学你好,以源码为例:绘制圆形是使用for循环,一次产生许多小球,将小球的各个属性值放进一个对象中,属性值可以使用随机数来产生,然后绘制小球即可。参考:

http://img1.sycdn.imooc.com//climg/5f3e5c2b095d236f12170462.jpg

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师