马黑黑 发表于 2023-12-24 20:12

黑客帝国代码雨可控机制

本帖最后由 马黑黑 于 2023-12-24 20:13 编辑

去年八月份做的一个帖子,《黑客帝国》,当时没有引入代码雨可控机制。那时的JS代码是酱紫:

<script type="text/javascript">

let ctx = canv.getContext('2d');
let w = canv.width, h = canv.height;
let texts = Array.from(Array(94), (x,k) => String.fromCharCode(33+k)),
      fontsize = 16,
      columns = Math.floor(w / fontsize) - 1,
      drops = new Array(columns),
      aud = new Audio();
      
aud.src = 'https://music.163.com/song/media/outer/url?id=1809135506.mp3';
aud.loop = true;
aud.autoplay = true;

disc.style.animationPlayState = aud.paused ? 'paused' : 'running';
disc.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing',()=> disc.style.animationPlayState = 'running');
aud.addEventListener('pause',()=> disc.style.animationPlayState = 'paused');

(function draw(){
      ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
      ctx.fillRect(0, 0, w, h);
      ctx.fillStyle = '#0f0';
      ctx.font = fontsize + 'px arial';
         for(var j = 0; j < drops.length; j ++){
                let text = texts;
                ctx.fillText(text, j * fontsize + fontsize / 2 + 1, drops * fontsize);
                if(drops*fontsize > h || Math.random() > 0.95){
                        drops = 0;
                }
                drops++;
      }
      requestAnimationFrame(draw);
})();

</script>


我们改变一下,不是大刀阔斧的改变:

<script type="text/javascript">

let cTimer = null;

let ctx = canv.getContext('2d');
let w = canv.width, h = canv.height;
let texts = Array.from(Array(94), (x,k) => String.fromCharCode(33+k)),
      fontsize = 16,
      columns = Math.floor(w / fontsize) - 1,
      drops = new Array(columns),
      aud = new Audio();

aud.src = 'https://music.163.com/song/media/outer/url?id=1809135506';
aud.loop = true;
aud.autoplay = true;

let mState = () => {
      disc.style.animationPlayState = aud.paused ? 'paused' : 'running';
      draw();
};
disc.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing',mState,false);
aud.addEventListener('pause',mState,false);

function draw() {
      ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
      ctx.fillRect(0, 0, w, h);
      ctx.fillStyle = '#0f0';
      ctx.font = fontsize + 'px arial';
         for(var j = 0; j < drops.length; j ++){
                let text = texts;
                ctx.fillText(text, j * fontsize + fontsize / 2 + 1, drops * fontsize);
                if(drops*fontsize > h || Math.random() > 0.95){
                        drops = 0;
                }
                drops++;
      }
      cTimer = aud.paused ? cancelAnimationFrame(cTimer) : requestAnimationFrame(draw);
};

</script>


一个 cTimer 变量,用来标记请求关键帧动画执行状态;设计一个我们已经习以为常的 mState 函数,作为控制按钮和代码雨的触发机制;两个 audio 监听事件,绑定 mState 函数;最后是,原来的自执行函数 draw 去掉外壳,不自动执行(它由 mState 函数带动执行,mState 执行的是 draw 函数,draw 函数又由 audio 控件的暂停与否做判断、决定是否运行代码雨)。

马黑黑 发表于 2023-12-24 20:24

演示:http://mhh.52qingyin.cn/art/bshow.php?st=3&sd=3&art=mahei_1703413713

红影 发表于 2023-12-24 20:35

我找到了原来的帖子{:4_173:}

红影 发表于 2023-12-24 20:37

requestAnimationFrame 这个里面又用到了这个。看了效果,很完美{:4_187:}

红影 发表于 2023-12-24 20:38

哈哈,刚看到你主楼里有链接的,我还自己跑去翻了半天{:4_170:}

马黑黑 发表于 2023-12-24 21:14

红影 发表于 2023-12-24 20:38
哈哈,刚看到你主楼里有链接的,我还自己跑去翻了半天

正常的,翻翻也好

千羽 发表于 2023-12-24 21:19

吃瓜群众谢谢黑黑老师分享精彩{:4_187:}

红影 发表于 2023-12-24 22:03

马黑黑 发表于 2023-12-24 21:14
正常的,翻翻也好

我看帖也太不仔细了,我一页页翻,翻半天才找到,然后一抬头,发现上面有链接的呢{:4_173:}

马黑黑 发表于 2023-12-24 22:36

红影 发表于 2023-12-24 22:03
我看帖也太不仔细了,我一页页翻,翻半天才找到,然后一抬头,发现上面有链接的呢

搜索一下子就能找到

红影 发表于 2023-12-24 23:08

马黑黑 发表于 2023-12-24 22:36
搜索一下子就能找到

哦,对哦,可以用名字取搜的,我还跑去翻了{:4_173:}

马黑黑 发表于 2023-12-24 23:08

红影 发表于 2023-12-24 23:08
哦,对哦,可以用名字取搜的,我还跑去翻了

笨方法其实也挺好

红影 发表于 2023-12-24 23:16

马黑黑 发表于 2023-12-24 23:08
笨方法其实也挺好

是啊,也顺便看了好多以前帖子名,黑黑做了那么多呢{:4_187:}

马黑黑 发表于 2023-12-25 08:17

红影 发表于 2023-12-24 23:16
是啊,也顺便看了好多以前帖子名,黑黑做了那么多呢

其实我最满意的是用类封装的例子,好像有四个教程吧,循序渐进

红影 发表于 2023-12-25 09:59

马黑黑 发表于 2023-12-25 08:17
其实我最满意的是用类封装的例子,好像有四个教程吧,循序渐进

完了,发现都没记住,我还得回头去复习一下{:4_173:}

马黑黑 发表于 2023-12-25 10:23

红影 发表于 2023-12-25 09:59
完了,发现都没记住,我还得回头去复习一下

我刚才搜了一下,共五讲

红影 发表于 2023-12-25 10:50

马黑黑 发表于 2023-12-25 10:23
我刚才搜了一下,共五讲

用JS类封装粒子特效的1-5讲,刚才我也去搜了一下{:4_173:}

马黑黑 发表于 2023-12-25 12:20

红影 发表于 2023-12-25 10:50
用JS类封装粒子特效的1-5讲,刚才我也去搜了一下

这个重在思路。做帖,要实现某些功能,实现的思路很重要。类只是一种封装方式,可以不用它的。

红影 发表于 2023-12-25 13:19

马黑黑 发表于 2023-12-25 12:20
这个重在思路。做帖,要实现某些功能,实现的思路很重要。类只是一种封装方式,可以不用它的。

对于你来说,是讲究思路,队伍来说只是跟在后面混的{:4_173:}

马黑黑 发表于 2023-12-25 17:46

红影 发表于 2023-12-25 13:19
对于你来说,是讲究思路,队伍来说只是跟在后面混的

谁还不是混?在队伍里混也挺好

红影 发表于 2023-12-25 19:40

马黑黑 发表于 2023-12-25 17:46
谁还不是混?在队伍里混也挺好

对我来说我又打成了队伍{:4_170:}
页: [1] 2
查看完整版本: 黑客帝国代码雨可控机制