黑客帝国代码特效(一招让妹子尖叫)(3)
// Simple string stream buffer stdout flush at once let outBuffer = []; function write(chars) { return outBuffer.push(chars); } function flush() { process.stdout.write(outBuffer.join(``)); return outBuffer = []; } function rand(start, end) { return start Math.floor(Math.random() * (end - start)); }
matrix-rain 的启动代码如下:
const args = argParser.parseArgs(); const matrixRain = new MatrixRain(args); function start() { if (!process.stdout.isTTY) { console.error(`Error: Output is not a text terminal`); process.exit(1); } // clear terminal and use alt buffer process.stdin.setRawMode(true); write(ansi.useAltBuffer()); write(ansi.cursorInvisible()); write(ansi.colors.bgBlack()); write(ansi.colors.fgBlack()); write(ansi.clearScreen()); flush(); matrixRain.resizeDroplets(); } function stop() { 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); // 60FPS start();
起首初始化一个 MatrixRain 类,然后挪用 start 要领。start 要领中通过 MatrixRain 的 resizeDroplets 要领来初始化要表现的内容。
MatrixRain 类实例中打点着一个 colDroplets 数组,生涯这每一列的雨滴。在 resizeDroplets 中我们可以看到,每一列有两个雨滴。
在启动代码中我们还可以看到,每隔 16 毫秒会挪用一次 renderFrame 要领来绘制页面。而 renderFrame 要领中,会遍历每一个 colDroplet 中的每一个雨滴。因为每一个雨滴的初始位置和速率都是随机的,通过 droplet.alive 和 droplet.speed 的比值来确定每一次渲染的时辰是否更新这个雨滴位置,从而到达每个雨滴的着落东倒西歪的结果。当雨滴已经移出屏幕可视范畴后会被重置。
每一次渲染,都是通过 write 函数向全局的缓存中写入数据,之后通过 flush 函数一把更新。
(责任编辑:admin)