Percebemos o efeito visual do filme "The Matrix"



Bom dia amigos

Revisou recentemente o "Matrix". Ouça o que é um filme legal (isso se aplica apenas à primeira parte). Mais uma vez, chamei a atenção para as linhas "caindo" com hieróglifos em suas telas (usei deliberadamente a palavra "deles" por diversão). Pensei em como isso pode ser implementado ... o mais simples possível (por preguiça). Foi o que eu consegui.

Bem-vindo à Matrix


A marcação é assim:
<body style="margin: 0; background: #000; overflow: hidden;"> <canvas></canvas> </body> 

Inicialize a tela, contexto, largura e altura da tela. Tornamos o último igual à largura e altura da janela do navegador:
 const C = document.querySelector("canvas"), $ = C.getContext("2d"), W = C.width = innerWidth, H = C.height = innerHeight 

Criamos uma linha com caracteres que serão usados ​​para visualização (não quero hieróglifos, quero o alfabeto cirílico!). Converta essa sequência em uma matriz. Os espaços dão vazios nas colunas, com eles o efeito é mais interessante:
 const str = "+0-1=2 3 4 5 6 7 8 9 ! ? ., :;", matrix = str.split('') 

Determinamos o tamanho da fonte, o número de colunas e criamos uma matriz vazia. Usaremos essa matriz para determinar a coordenada y:
 let font = 11, //   =   /   col = W / font, arr = [] 

Preencha uma matriz vazia com unidades pelo número de colunas:
 for(let i = 0; i < col; i++) arr[i] = 1 

Tudo está pronto para desenhar. Introdução:
 function draw() { //    //         $.fillStyle = "rgba(0, 0, 0, .05)" //     $.fillRect(0, 0, W, H) //     $.fillStyle = "#0f0" //    $.font = font + "px system-ui" //   for (let i = 0; i < arr.length; i++) { //     let txt = matrix[Math.floor(Math.random() * matrix.length)] //   //     // fillText( ,  x =  i,    ,  y =  arr,    ) $.fillText(txt, i * font, arr[i] * font) //  "y"     Math.random()   0.975 (   ,      ),    ( "y") //        if (arr[i] * font > H && Math.random() > 0.975) arr[i] = 0 //   y arr[i]++ } } 

Iniciamos a função de desenho a cada 123 milissegundos (um número aleatório):
 setInterval(draw, 123) 

Finalmente, ao redimensionar a janela, recarregamos a página (por preguiça):
 window.addEventListener('resize', () => location.reload()) 

O resultado pode ser visto aqui .

Há um pequeno problema: de tempos em tempos as colunas ficam juntas, elas são desenhadas quase niveladas horizontalmente. Isso afeta a percepção: o olho se apega à ordem. Há uma falta de caos, ou algo assim. Uma solução válida ainda não foi encontrada.

Obrigado pela atenção. Tudo de bom.

Source: https://habr.com/ru/post/pt485404/


All Articles