游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

一招让妹子尖叫,教你非常酷炫黑客帝国里的矩阵雨

  相信大家都对黑客帝国电影里的矩阵雨印象非常深刻,就是下面这个效果。
  效果非常酷炫,我看了一下相关实现库的代码,也非常简单,核心就是用好命令行的控制字符,这里分享一下。
  在matrixrain的源代码中,总共只有两个文件,ansi。js和index。js,非常小巧。控制字符和控制序列
  ansi。js中定义了一些命令行的操作方法,也就是对控制字符做了一些方法封装,代码如下:constctlEsc〔;constansi{reset:(){ctlEsc}c,clearScreen:(){ctlEsc}2J,cursorHome:(){ctlEsc}H,cursorPos:(row,col){ctlEsc}{row};{col}H,cursorVisible:(){ctlEsc}?25h,cursorInvisible:(){ctlEsc}?25l,useAltBuffer:(){ctlEsc}?47h,useNormalBuffer:(){ctlEsc}?47l,underline:(){ctlEsc}4m,off:(){ctlEsc}0m,bold:(){ctlEsc}1m,color:c{ctlEsc}{c};1m,colors:{fgRgb:(r,g,b){ctlEsc}38;2;{r};{g};{b}m,bgRgb:(r,g,b){ctlEsc}48;2;{r};{g};{b}m,fgBlack:()ansi。color(30),fgRed:()ansi。color(31),fgGreen:()ansi。color(32),fgYellow:()ansi。color(33),fgBlue:()ansi。color(34),fgMagenta:()ansi。color(35),fgCyan:()ansi。color(36),fgWhite:()ansi。color(37),bgBlack:()ansi。color(40),bgRed:()ansi。color(41),bgGreen:()ansi。color(42),bgYellow:()ansi。color(43),bgBlue:()ansi。color(44),bgMagenta:()ansi。color(45),bgCyan:()ansi。color(46),bgWhite:()ansi。color(47),},};module。exportsansi;
  这里面ansi对象上的每一个方法不做过多解释了。我们看到,每个方法都是返回一个奇怪的字符串,通过这些字符串可以改变命令行的显示效果。
  这些字符串其实是一个个控制字符组成的控制序列。那什么是控制字符呢?我们应该都知道ASC字符集,这个字符集里面除了定义了一些可见字符以外,还有很多不可见的字符,就是控制字符。这些控制字符可以控制打印机、命令行等设备的显示和动作。
  有两个控制字符集,分别是CO字符集和C1字符集。C0字符集是0x00到0x1F这两个十六进制数范围内的字符,而C1字符集是0x80到0x9F这两个十六进制数范围内的字符。C0和C1字符集内的字符和对应的功能可以在这里查到,我们不做详细描述了。
  上面代码中,〔其实是一个组合,定义了ESC键,后跟〔表示这是一个控制序列导入器(ControlSequenceIntroducer,CSI)。在〔后面的所有字符都会被命令行解析为控制字符。
  常用的控制序列有这些:
  序列
  功能
  CSInA
  向上移动n(默认为1)个单元
  CSInA
  向下移动n(默认为1)个单元
  CSInC
  向前移动n(默认为1)个单元
  CSInD
  向后移动n(默认为1)个单元
  CSInE
  将光标移动到n(默认为1)行的下一行行首
  CSInF
  将光标移动到n(默认为1)行的前一行行首
  CSInG
  将光标移动到当前行的第n(默认为1)列
  CSIn;mH
  移动光标到指定位置,第n行,第m列。n和m默认为1,即CSI;5H与CSI1;5H等同。
  CSInJ
  清空屏幕。如果n为0(或不指定),则从光标位置开始清空到屏幕末尾;如果n为1,则从光标位置清空到屏幕开头;如果n为2,则清空整个屏幕;如果n为3,则不仅清空整个屏幕,同时还清空滚动缓存。
  CSInK
  清空行,如果n为0(或不指定),则从光标位置清空到行尾;如果n为1,则从光标位置清空到行头;如果n为2,则清空整行,光标位置不变。
  CSInS
  向上滚动n(默认为1)行
  CSInT
  向下滚动n(默认为1)行
  CSIn;mf
  与CSIn;mH功能相同
  CSInm
  设置显示效果,如CSI1m表示设置粗体,CSI4m为添加下划线。
  我们可以通过CSInm控制序列来控制显示效果,在设置一种显示以后,后续字符都会沿用这种效果,直到我们改变了显示效果。可以通过CSI0m来清楚显示效果。常见的显示效果可以在SGR(SelectGraphicRendition)parameters查到,这里受篇幅限制就不做赘述了。
  上面的代码中,还定义了一些颜色,我们看到颜色的定义都是一些数字,其实每一个数字都对应一种颜色,这里列一下常见的颜色。
  前景色
  背景色
  名称
  前景色
  背景色
  名称
  30hr40hr黑色
  90hr100hr亮黑色
  31hr41hr红色
  91hr101hr亮红色
  32hr42hr绿色
  92hr102hr亮绿色
  33hr43hr黄色
  93hr103hr亮黄色
  34hr44hr蓝色
  94hr104hr亮蓝色
  35hr45hr品红色(Magenta)
  95hr105hr亮品红色(Magenta)
  36hr46hr青色(Cyan)
  96hr106hr亮青色(Cyan)
  37hr47hr白色
  97hr107hr亮白色
  上面的代码中,使用了CSIn;1m的形式来定义颜色,其实是两种效果的,一个是具体颜色值,一个是加粗,一些命令行实现中会使用加粗效果来定义亮色。比如,如果直接定义CSI32m可能最终展示的是暗绿色,我们改成CSI32;1m则将显示亮绿色。
  颜色支持多种格式,上面的是3bit和4bit格式,同时还有8bit和24bit。代码中也有使用样例,这里不再赘述了。矩阵渲染
  在matrixrain的代码中,index。js里的核心功能是MatrixRain这个类:classMatrixRain{constructor(opts){this。transposeopts。directionh;this。coloropts。color;this。charRangeopts。charRange;this。maxSpeed20;this。colDroplets〔〕;this。numCols0;this。numRows0;handlereadingfromfileif(opts。filePath){if(!fs。existsSync(opts。filePath)){thrownewError({opts。filePath}doesntexist);}this。fileCharsfs。readFileSync(opts。filePath,utf8)。trim()。split();this。filePos0;this。charRangefile;}}generateChars(len,charRange){bydefaultcharRangeasciiletcharsnewArray(len);if(charRangeascii){for(leti0;ilen;i){chars〔i〕String。fromCharCode(rand(0x21,0x7E));}}elseif(charRangebraille){for(leti0;ilen;i){chars〔i〕String。fromCharCode(rand(0x2840,0x28ff));}}elseif(charRangekatakana){for(leti0;ilen;i){chars〔i〕String。fromCharCode(rand(0x30a0,0x30ff));}}elseif(charRangeemoji){emojisaretwocharacterwidths,souseaprefixconstemojiPrefixString。fromCharCode(0xd83d);for(leti0;ilen;i){chars〔i〕emojiPrefixString。fromCharCode(rand(0xde01,0xde4a));}}elseif(charRangefile){for(leti0;ilen;i,this。filePos){this。filePosthis。filePosthis。fileChars。length?this。filePos:0;chars〔i〕this。fileChars〔this。filePos〕;}}returnchars;}makeDroplet(col){return{col,alive:0,curRow:rand(0,this。numRows),height:rand(this。numRows2,this。numRows),speed:rand(1,this。maxSpeed),chars:this。generateChars(this。numRows,this。charRange),};}resizeDroplets(){〔this。numCols,this。numRows〕process。stdout。getWindowSize();transposefordirectionif(this。transpose){〔this。numCols,this。numRows〕〔this。numRows,this。numCols〕;}Createdropletspercolumnaddremovedropletstomatchcolumnsizeif(this。numColsthis。colDroplets。length){for(letcolthis。colDroplets。length;colthis。numCols;col){maketwodropletsperrowthatstartinrandompositionsthis。colDroplets。push(〔this。makeDroplet(col),this。makeDroplet(col)〕);}}else{this。colDroplets。splice(this。numCols,this。colDroplets。lengththis。numCols);}}writeAt(row,col,str,color){Onlyoutputifinviewportif(row0rowthis。numRowscol0colthis。numCols){constposthis。transpose?ansi。cursorPos(col,row):ansi。cursorPos(row,col);write({pos}{color}{str});}}renderFrame(){constansiColoransi。colors〔fg{this。color。charAt(0)。toUpperCase()}{this。color。substr(1)}〕();for(constdropletsofthis。colDroplets){for(constdropletofdroplets){const{curRow,col:curCol,height}droplet;droplet。alive;if(droplet。alivedroplet。speed0){this。writeAt(curRow1,curCol,droplet。chars〔curRow1〕,ansiColor);this。writeAt(curRow,curCol,droplet。chars〔curRow〕,ansi。colors。fgWhite());this。writeAt(curRowheight,curCol,);droplet。curRow;}if(curRowheightthis。numRows){resetdropletObject。assign(droplet,this。makeDroplet(droplet。col),{curRow:0});}}}flush();}}
  还有几个工具方法:SimplestringstreambufferstdoutflushatonceletoutBuffer〔〕;functionwrite(chars){returnoutBuffer。push(chars);}functionflush(){process。stdout。write(outBuffer。join());returnoutBuffer〔〕;}functionrand(start,end){returnstartMath。floor(Math。random()(endstart));}
  matrixrain的启动代码如下:constargsargParser。parseArgs();constmatrixRainnewMatrixRain(args);functionstart(){if(!process。stdout。isTTY){console。error(Error:Outputisnotatextterminal);process。exit(1);}clearterminalandusealtbufferprocess。stdin。setRawMode(true);write(ansi。useAltBuffer());write(ansi。cursorInvisible());write(ansi。colors。bgBlack());write(ansi。colors。fgBlack());write(ansi。clearScreen());flush();matrixRain。resizeDroplets();}functionstop(){write(ansi。cursorVisible());write(ansi。clearScreen());write(ansi。cursorHome());write(ansi。useNormalBuffer());flush();process。exit();}process。on(SIGINT,()stop());process。stdin。on(data,()stop());process。stdout。on(resize,()matrixRain。resizeDroplets());setInterval(()matrixRain。renderFrame(),16);60FPSstart();
  首先初始化一个MatrixRain类,然后调用start方法。start方法中通过MatrixRain的resizeDroplets方法来初始化要显示的内容。
  MatrixRain类实例中管理着一个colDroplets数组,保存这每一列的雨滴。在resizeDroplets中我们可以看到,每一列有两个雨滴。
  在启动代码中我们还可以看到,每隔16毫秒会调用一次renderFrame方法来绘制页面。而renderFrame方法中,会遍历每一个colDroplet中的每一个雨滴。由于每一个雨滴的初始位置和速度都是随机的,通过droplet。alive和droplet。speed的比值来确定每一次渲染的时候是否更新这个雨滴位置,从而达到每个雨滴的下落参差不齐的效果。当雨滴已经移出屏幕可视范围后会被重置。
  每一次渲染,都是通过write函数向全局的缓存中写入数据,之后通过flush函数一把更新。

这么漂亮的房子,只要看上一眼,再穷也会想装一套面积:113平风格:现代美式轻奢这是一套美式轻奢风,整体装修效果时尚大方,优雅轻奢非常的漂亮,我相信只要你看上一眼,定会喜欢上这样的装修风格,哪怕是再穷也会想着装一……蜂窝物联网为什么要等到2023年见分晓?文立厷图网络蜂窝物联网(IoT)将从2023年开始获得5G带来的全面收益,并在2026年达到每年9亿台的出货量。为什么要等到2023年?这期间还有一些梗,看看市场研……家里有宝宝,秋冬换季温差大如何保障宝宝的健康?秋冬季寒冷,气温低,很多疾病都会在冬季诱发,宝宝因为抵抗力弱,很容易生病,。而且随着冬季温度急剧下降,降水减少,空气变得十分干燥,宝宝鼻子出血的频率也变得高了,更不要提秋……吃了增高药真的能长高吗?专家来回答近来身高已经成为衡量一个人的标准,市面上的增高药也层出不穷,有些父母也是花大价钱买药为了孩子,可是吃了药真的能长高吗?专家回答道:增高的药物如果是生长激素就可以增高,生长……决策参考快手成中国短视频第一股薇娅要进创投圈1、快手正式上市市值超越京东小米事件:2月5日,快手科技(01024)在港交所正式挂牌交易,开盘价为338港元,比115港元的发行价上涨了193。913,成交量达到296……阿克图尔斯蒙斯克星际争霸II合作人物指挥官1、你的皇帝要求你尽忠阿克图尔斯蒙斯克有令,所有身体健全的市民都需要倾尽全力保卫我们的帝国,至死方休。有时,我们美丽的世界会受到各方敌人的攻击:异虫怪物想要吞噬我们;入侵……回家第一天惊魂一刻昨天晚上两点多睡的正香,突然被媳妇摇醒,说客厅有声音,我们就默默地听,听了一会我没听到,我都快睡着了,突然又有了,声音是咔咔的,感觉像机械结构里面的声音,我以为是外面楼道,感觉……保险医疗健康生态,理解中国平安未来的一把钥匙说起来联合健康,在保险行业可谓无人不知。作为全球保险行业标杆,联合健康以保险服务的业务模式长期位居行业龙头,并得到资本市场青睐。这家成立于1974年的美国健康险企,用了40多年……原创作品民法典之歌(快板)作者李寅生网络文学文学交流专注原创原创作品授权天美五星全网首发文章阅读也可在微信读书上检索此文民法典之歌(快板)作者李寅生编审天美五星民法典之歌……连美国都无可奈何的中国公司!全球排名第一,不是华为,不是联想今年6月,美国正式宣布,将采购两款通过审查的大疆的无人机。而这时,大疆已经被美国制裁长达三年时间了。。。。。。无人机,这一新兴科技产品,如今已经成为了各个国家不可或缺的重……推荐ViewSonic优派VX2780HD227英寸显示器【数码值】优派VX27802KHD2显示器采用27英寸屏幕,比例为16:9,分辨率2560x1440,刷新率60Hz,面板类型IPS,响应时间5ms,最大亮度350nit……看中国足球学世界地理FIFA更新国家队排名,国足又下跌两名,排名世界第77。其实排名多少根本无所谓!早已对它们不抱希望了!但是超越国足的两支球队分别是佛得角和库拉索,真是太让人无语问苍……
618当天,董明珠直播带货狂销超102亿元,说明了什么问题?直播带货现在似乎已经成为一种新的营销趋势,现在各大平台都推出了直播卖货,从淘宝、1688、京东、拼多多到快手、抖音等等,都在力推直播带货,好像谁没有推出直播带货业务,就跟不上潮……发那科与嘉实多正式达成战略合作,加速工业X。0的腾飞近日,发那科与拥有百年历史的世界领先润滑油品牌嘉实多正式达成战略合作伙伴关系,双方将在中国地区开启机器人行业和润滑油领域的智能转型及可持续发展的全方位合作,共同携手在工业X。0……创想杯增材制造(3D打印)设备操作员竞赛在京启动2021年5月30日,由国家人力资源和社会保障部批准,中国电子商会、中国就业培训技术指导中心、中国国防邮电工会全国委员会联合主办的2021全国行业职业技能竞赛全国电子信息服务业……共享文件夹设置如果出现问题不能正常访问共享文件夹,那按照我一下方法一步步操作,基本就能解决问题。1。guest账户开启2。允许Guest用户从网络访问本机点击开始运行,在运……宝可梦正版授权,电力十足的萌宠皮卡丘降临桌面熟悉雷蛇的朋友应该都知道,雷蛇在之前出过不少主题外设套装,比如大受女生喜爱的粉晶套装,还有各种游戏宅青睐的游戏套装等。最近雷蛇拿到了宝可梦正版授权,推出了全新的皮卡丘限定套装,……大连重工研制出8500吨锁模力注塑机模板近日,在顾客代表、业主的共同见证下,大连重工下属大连华锐重工铸业有限公司(简称铸业公司)为国内某知名企业研制的8500吨锁模力注塑机模板顺利交付。注塑机是利用塑料成型模具……名门修谱穷人富人官人的眼里,修家谱是什么样子?纸质家谱修家谱在农村比较普及,为什么在知识水平相对较弱的农村,反倒会保留这种传统文化的传承?主要还是因为农耕社会讲究家族脉络,也就是秩序,为的是当家族外延后不会乱了纲常。……Vue非常实用的自定义指令在Vue,除了核心功能默认内置的指令(vmodel和vshow),Vue也允许注册自定义指令。它的作用价值在于当开发人员在某些场景下需要对普通DOM元素进行操作。Vue自……苹果手机在中国为什么这么受欢迎?你以为苹果真的只是卖的是手机这么简单吗?所有的公司不管是卖的是什么,最终销售的是什么,消费者买单的又是什么,其实最终的核心就是用户体验;苹果手机不仅仅是在中国……华为助力5G工业互联网采矿,中兴通讯发布5G超高清直播解决方5G运营商中国电信5GNBIoT用户规模突破1亿根据天翼物联科技有限公司近日发布的消息,中国电信5GNBIoT用户规模突破1亿,5G窄带物联网规模全球第一。NBIo……马斯克点赞中国新能源汽车产业特斯拉加快中国超充网络布局【太平洋汽车网行业频道】9月17日,2021世界新能源汽车大会(WNEVC2021)在海南省海口市国际会展中心召开。特斯拉公司首席执行官司埃隆马斯克先生在智能网联赋能新能源汽车……九安医疗,陕西金叶,兆易创新,美锦能源,江特电机,隆基股份九安医疗持续调整。苏宁易购是互联网电商概念。吴通控股是物联网概念。兆易创新持续调整。零点有数是大数据概念。恒瑞医药持续调整。冰山冷热是冰雪概念。美锦能源是氢能源概念。楚江新材是……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网