置顶文章:《纯CSS打造银色MacBook Air(完整版)》

上一篇:《对于RegExp反向引用的一点理解》

作者主页:myvin

博主QQ:851399101(点击QQ和博主发起临时会话)

span{
color:red;
}


致谢

感谢Antineutrino和Cyclone77的意见,点击两位博主id可查看其主页。

因为之前是判断落出视口高度并且大于一个随机数才再次绘制,中间会有一断间隔,所以会有一断一断的感觉,已经将高度判断修改为2/3,这样会好一些,已在文中同步修改,且下文会有对应说明。

再次感谢Antineutrino和Cyclone77,点击两位博主id可查看其主页。

写在前面

关于代码和实际实现效果可以点击这里去CodePen上查看。

黑客帝国有一个经典画面:电影开头下绿色数字雨(是数字还是文字,记不清了。。。),这里我们用js来实现,下二进制雨(下什么都可以,只是二进制显得有科技感)。

网上有下文字雨的实现,思路基本上是一样,如感兴趣,请自行搜索。

正文

先上效果图:

关于代码和实际效果请这里去CodePen上查看。

在这里,我们主要用到的是H5里面的canvas画布标签,canvas只是定义了一个画布,并没有绘制功能,要实现绘制得用js。关于canvas的相关知识请自行搜索,在此不再赘述。

好的,进入正文。

首先是简单reset一下样式:

*{margin: 0 auto;padding: 0 auto;}
body{background: black;overflow: hidden;}

为了实现一个全屏没有滚动条的效果,这里对于溢出的hidden。

然后定义了一个id为martrix的画布:

<canvas id="matrix"></canvas>

接着在画布上进行绘制。

接下来是canvas的一些基本操作,获得上下文环境:

var matrix=document.getElementById("matrix");
var context=matrix.getContext("2d");

因为是实现视口的全屏效果,所以先获得视口,并设置成画布大小:

matrix.height=window.innerHeight;
matrix.width=window.innerWidth;

接下来我们设置字体大小变量,并根据字体大小来获得二进制雨的列数,同时定义一个数组,用来动态改变y坐标,如下:

var drop=[];
var font_size=16;
var columns=matrix.width/font_size;
for(var i=0;i<columns;i++)
drop[i]=1;

然后我们开始写绘制函数drawMatrix:

先给出drawMartrix函数:

function drawMatrix(){
context.fillStyle="rgba(0, 0, 0, 0.1)";
context.fillRect(0,0,matrix.width,matrix.height); context.fillStyle="green";
context.font=font_size+"px";
for(var i=0;i<columns;i++){
context.fillText(Math.floor(Math.random()*2),i*font_size,drop[i]*font_size);/*get 0 and 1*/ //if(drop[i]*font_size>matrix.height&&Math.random()>0.85)/*reset*///此处有问题,已修改,说明见下方红字
if(drop[i]*font_size>(matrix.height*2/3)&&Math.random()>0.85)/*reset*/
drop[i]=0;
drop[i]++;
}
}

因为判断落出视口高度并且大于一个随机数才再次绘制,中间会有一断间隔,所以会有一断一断的感觉,已经将高度判断修改为2/3,这样会好一些。修改的程序如下,并已经在文章同步修改:

if(drop[i]*font_size>(matrix.height*2/3)&&Math.random()>0.85)/*reset*/

简单说一下上面的绘制函数:

首先绘制了一个视口大小的矩形,并用rgba(0, 0, 0, 0.1)来填充,请注意这里的不同明度,这里的不透明度将会影响下落的效果。因为是一遍一遍绘制,如果将将其设置为完全不透明或者不透明度比较高,那么当绘制完一遍,再绘制第二遍的时候,上一次绘制出来的数字就会被完全遮盖,这样数字透明渐变的效果就会很差。

修改不透明度参数的实时效果,可以点击这里去CodePen上就行修改实时查看效果。

接下来我们设置下落的数字。数字文本是用fillText来绘制的。首先,我们将数字文本颜色设置为green,然后设置数字文本字体大小,在这里加上单位px,context.font=font_size+"px"。接下来就是一个循环了。

这个循环思路是这样的:

用循环来控制显示位置,并在显示位置上绘制数字文本,数组为random的0或1的随机值,然后进行if判断,如果超出屏幕高度,则重新从头绘制。

在context.fillText(Math.floor(Math.random()*2),i*font_size,drop[i]*font_size)中,后两个参数是xy坐标位置,很好理解,if(drop[i]*font_size>matrix.height&&Math.random()>0.85)/*reset*/

中,如果没有Math.random()>0.85的限制,则效果是循环每列数字同时从视口上面出现,同时从视口的2/3处消失,没有随机的效果,所以加一个random来限制,效果如下:

修改random参数的实时效果,可以点击这里去CodePen上就行修改实时查效果。

最后一步就是把绘制函数循环调用:

setInterval(drawMatrix,50);

循环的时间间隔自行设置,修改循环时间间隔参数可以点击这里去CodePen上就行修改实时查效果。

最后,祝大家都过好每一天~~



转载请记得说明作者和出处哦-.-

作者:myvin

原文出处:http://www.cnblogs.com/myvin/p/4775152.html


下一篇:《Canvas模拟粒子系统》

置顶文章:《纯CSS打造银色MacBook Air(完整版)》

*****************************************

js实现黑客帝国二进制雨的更多相关文章

  1. Canvas修行之黑客帝国代码雨

    既然是修行,不卖弄关子,不吊胃口,修行成果必须先晒一晒. 下图是我用canvas画的黑客帝国代码雨,想起当年看黑客帝国时,那个代码雨场景让我心旷神怡,大开脑洞,满脑子是那种三维空间,无数0和1像雨一样 ...

  2. 安装屏保软件(Linux终端演示 “黑客帝国” 字母雨界面)和Linux修改管理员密码

    1.Linux修改管理员密码:打开终端:1. 重启 reboot  2.进入内核登陆系统点击e3.进入系统救援界面,定位Linux16所在行,找到ro 后删除,在此位置添加一条命令: rw init= ...

  3. JS字符串与二进制的转化

    JS字符串与二进制的相互转化 1 2 3 4 5 //字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A ...

  4. js仿黑客帝国文字数字雨效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. JQuery实现——黑客帝国代码雨效果

    效果如你所见就是本页面上方那样的效果 实现方法来自一个印度小伙纸,学习完我也没总结一下,今儿个补上 如何实现,大家右键查看源码复制即可,不过学习的过程还是要总结总结. 下面通过另外两个小例子,一步一步 ...

  6. 认识Js中的二进制数据

    Blob 在项目中涉及到要对html原生的audio组件进行样式复写,因此需要重新实现audio的一些功能,比如下载.实现一个下载大致的思路是服务端返回一段音频的二进制数据,客户端将其存放在Blob中 ...

  7. JS MD5 返回二进制格式

    今天靠大佬的帮助,成功的解决了一个弄了好久的问题.起因就是我们要对一个手机号进行加密. 加密方式是把一个字符串进行MD5加密之后,得到原始 16 字符二进制格式.然后把得到的这个字符作为AES的key ...

  8. js base64转二进制

    base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...

  9. JS十进制转二进制(控制位数)

    主要需求:十进制转二进制,可以控制指定的位数. 转化显示后的二进制数为bin-bit中输入的数字宽度.dec-number为5,bin-bit为5,则转化后数字为00101.如果bin-bit小于转化 ...

随机推荐

  1. java Hello 出现以下结果:Bad command or the file name 可能是什么原因

    没有这个命令或文件名 原因可能是没有成功安装jdk或者没有配置好jdk 的环境变量,或者没有编译相应的文件. 2. 出现以下结果:Exception in thread “main” java.lan ...

  2. Asp.net 页面访问模板页的属性

    首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页 ...

  3. 使用Java正则表达式提取字符串中的数字一例

    直接上代码: String reg = "\\D+(\\d+)$"; //提取字符串末尾的数字:封妖塔守卫71 == >> 71 String s = monster. ...

  4. wireshark安装

    原文链接地址:http://blog.csdn.net/holandstone/article/details/47026213 Wireshark下载地址:https://www.wireshark ...

  5. linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序

    作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...

  6. 快速解决mysql Lost connection to MySQL server at 'reading initial communication packet及can't connect to mysql server on 'localhost'

    今天在使用Navicat连一个远程mysql时,总是提示连接不成功,提示Lost connection to MySQL server at 'reading initial communicatio ...

  7. asp.net连接SQL SERVER 2012的方法

    在web.config文件中添加 <connectionStrings> <add name="SQLConnectionString" connectionSt ...

  8. table边框美化

    在<table>里面加代码就可以了. 效果1: <TABLE style="BORDER-RIGHT: #993333 3px dashed; BORDER-TOP: #9 ...

  9. Hive drop table batched

    if the hive version not support drop table tablename purge. your drop table command will move data t ...

  10. selenium处理div生成弹框

    目前遇到的弹框有两种,一种是alert,一种是div,如果遇到div模拟的弹框,在用alert就不行了. 1. public static Alert getAlert(WebDriver dr) { ...