js实现黑客帝国二进制雨
置顶文章:《纯CSS打造银色MacBook Air(完整版)》
上一篇:《对于RegExp反向引用的一点理解》
作者主页:myvin
博主QQ:851399101(点击QQ和博主发起临时会话)
span{
color:red;
}
致谢
感谢Antineutrino和Cyclone77的意见,点击两位博主id可查看其主页。
因为之前是判断落出视口高度并且大于一个随机数才再次绘制,中间会有一断间隔,所以会有一断一断的感觉,已经将高度判断修改为2/3,这样会好一些,已在文中同步修改,且下文会有对应说明。
再次感谢Antineutrino和Cyclone77,点击两位博主id可查看其主页。
写在前面
黑客帝国有一个经典画面:电影开头下绿色数字雨(是数字还是文字,记不清了。。。),这里我们用js来实现,下二进制雨(下什么都可以,只是二进制显得有科技感)。
网上有下文字雨的实现,思路基本上是一样,如感兴趣,请自行搜索。
正文
先上效果图:

在这里,我们主要用到的是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实现黑客帝国二进制雨的更多相关文章
- Canvas修行之黑客帝国代码雨
既然是修行,不卖弄关子,不吊胃口,修行成果必须先晒一晒. 下图是我用canvas画的黑客帝国代码雨,想起当年看黑客帝国时,那个代码雨场景让我心旷神怡,大开脑洞,满脑子是那种三维空间,无数0和1像雨一样 ...
- 安装屏保软件(Linux终端演示 “黑客帝国” 字母雨界面)和Linux修改管理员密码
1.Linux修改管理员密码:打开终端:1. 重启 reboot 2.进入内核登陆系统点击e3.进入系统救援界面,定位Linux16所在行,找到ro 后删除,在此位置添加一条命令: rw init= ...
- JS字符串与二进制的转化
JS字符串与二进制的相互转化 1 2 3 4 5 //字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A ...
- js仿黑客帝国文字数字雨效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- JQuery实现——黑客帝国代码雨效果
效果如你所见就是本页面上方那样的效果 实现方法来自一个印度小伙纸,学习完我也没总结一下,今儿个补上 如何实现,大家右键查看源码复制即可,不过学习的过程还是要总结总结. 下面通过另外两个小例子,一步一步 ...
- 认识Js中的二进制数据
Blob 在项目中涉及到要对html原生的audio组件进行样式复写,因此需要重新实现audio的一些功能,比如下载.实现一个下载大致的思路是服务端返回一段音频的二进制数据,客户端将其存放在Blob中 ...
- JS MD5 返回二进制格式
今天靠大佬的帮助,成功的解决了一个弄了好久的问题.起因就是我们要对一个手机号进行加密. 加密方式是把一个字符串进行MD5加密之后,得到原始 16 字符二进制格式.然后把得到的这个字符作为AES的key ...
- js base64转二进制
base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...
- JS十进制转二进制(控制位数)
主要需求:十进制转二进制,可以控制指定的位数. 转化显示后的二进制数为bin-bit中输入的数字宽度.dec-number为5,bin-bit为5,则转化后数字为00101.如果bin-bit小于转化 ...
随机推荐
- java Hello 出现以下结果:Bad command or the file name 可能是什么原因
没有这个命令或文件名 原因可能是没有成功安装jdk或者没有配置好jdk 的环境变量,或者没有编译相应的文件. 2. 出现以下结果:Exception in thread “main” java.lan ...
- Asp.net 页面访问模板页的属性
首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页 ...
- 使用Java正则表达式提取字符串中的数字一例
直接上代码: String reg = "\\D+(\\d+)$"; //提取字符串末尾的数字:封妖塔守卫71 == >> 71 String s = monster. ...
- wireshark安装
原文链接地址:http://blog.csdn.net/holandstone/article/details/47026213 Wireshark下载地址:https://www.wireshark ...
- linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序
作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...
- 快速解决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 ...
- asp.net连接SQL SERVER 2012的方法
在web.config文件中添加 <connectionStrings> <add name="SQLConnectionString" connectionSt ...
- table边框美化
在<table>里面加代码就可以了. 效果1: <TABLE style="BORDER-RIGHT: #993333 3px dashed; BORDER-TOP: #9 ...
- Hive drop table batched
if the hive version not support drop table tablename purge. your drop table command will move data t ...
- selenium处理div生成弹框
目前遇到的弹框有两种,一种是alert,一种是div,如果遇到div模拟的弹框,在用alert就不行了. 1. public static Alert getAlert(WebDriver dr) { ...