Programação criativa com JavaScript: do básico às obras-primas | Belhadj Ramzi | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Programação criativa com JavaScript: do básico às obras-primas

teacher avatar Belhadj Ramzi, concept artist, concept designer, vfx ar

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução ao curso

      2:57

    • 2.

      Quem me influencia

      3:45

    • 3.

      Comece a confusão

      1:39

    • 4.

      Introdução ao Java

      12:22

    • 5.

      Aprenda variáveis e funções

      20:00

    • 6.

      Aprenda matrizes e loops

      13:30

    • 7.

      Aprenda a fazer esboços de ambiente

      12:02

    • 8.

      Aprenda sobre o Transform

      6:40

    • 9.

      Aprenda sobre ângulos

      5:41

    • 10.

      Aprenda sobre funções de utilidade

      4:54

    • 11.

      Aprenda a criar arcos

      5:47

    • 12.

      Aprenda sobre objetos e classes

      9:35

    • 13.

      Crie uma animação

      6:13

    • 14.

      Conecte agentes com linhas

      6:36

    • 15.

      Aprenda sobre a saída de vídeo

      2:00

    • 16.

      Aprenda a criar uma grade

      7:40

    • 17.

      Manipulação de formas com ruído

      6:27

    • 18.

      Crie slides de interface gráfica

      10:55

    • 19.

      Aprenda a criar texto

      9:09

    • 20.

      Aprenda sobre o assíncrono

      9:49

    • 21.

      Criando um bitmap

      10:26

    • 22.

      Aprenda sobre os glifos

      6:04

    • 23.

      Desenhando retângulo

      6:08

    • 24.

      Desenhando um retângulo inclinado

      6:08

    • 25.

      Aprenda a criar distribuição

      5:04

    • 26.

      Aprenda sobre como adicionar cores

      9:12

    • 27.

      Criando máscara de recorte

      6:37

    • 28.

      Faça uma semente aleatória

      2:42

    • 29.

      Crie uma curva qudrática

      5:44

    • 30.

      Crie uma interação com o cursor

      8:54

    • 31.

      Crie vários pontos

      5:56

    • 32.

      Aprenda sobre como criar uma grade

      8:30

    • 33.

      Aprenda a criar segmentos

      6:22

    • 34.

      Crie animação de grade

      3:23

    • 35.

      Crie o jogo prensado

      4:50

    • 36.

      Crie um analisador

      7:48

    • 37.

      Aprenda a criar frequências

      7:00

    • 38.

      Aprenda a criar áudio para arcos

      9:38

    • 39.

      Aprenda sobre a criação de pôster

      4:07

    • 40.

      Desenhe uma única partícula

      4:23

    • 41.

      Aprenda sobre a aplicação de forças

      6:08

    • 42.

      Como distribuir as partículas

      7:42

    • 43.

      Como modificar escala e cores

      3:43

    • 44.

      Criando dados de imagem

      8:40

    • 45.

      Projeto de curso

      0:44

    • 46.

      Aprenda as dicas finais

      2:34

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

5

Estudantes

--

Sobre este curso

Transforme o código em arte! Aprenda a criar arte generativa, animações e visuais interativos com Javascript

Você quer desbloquear sua criatividade por meio do código? Você já se perguntou como artistas digitais, designers e desenvolvedores criam visuais bonitos, animações fascinantes e experiências interativas usando o JavaScript?

Boas-vindas ao curso Criativo de programação com JavaScript, um curso prático onde você vai explorar o lado artístico da programação e aprender a criar arte generativa impressionante, animações interativas e efeitos visuais do zero.Crie visuais envolventes com código. Explore os fundamentos da programação e aprenda a desenhar com programação criativa em Javascript

produzo animações, impressões, peças interativas e muito mais que me levaram a colaborar com marcas.

Desbloqueie a criatividade ilimitada — experimente com teoria das cores, padrões, aleatoriedade e design algorítmico.

Experimente com teoria das cores, padrões, aleatoriedade e design algorítmico. Desenvolva visuais que respondem à entrada do usuário, movimento e interações em tempo real.

Quer você seja um artista, designer, desenvolvedor web ou entusiasta da programação, este curso vai capacitar você a transformar ideias em experiências visualmente dinâmicas usando o JavaScript.

Ao final deste curso, você será capaz de criar arte generativa, experiências interativas e animações dinâmicas usando o JavaScript. Quer você esteja criando arte baseada na web, recursos de jogos, visuais orientados por dados ou simplesmente programando por diversão, este curso vai liberar seu programador criativo.

Conheça seu professor

Teacher Profile Image

Belhadj Ramzi

concept artist, concept designer, vfx ar

Professor

Hello, I'm ramzi belhadj a futurist and professional designer 

i work as vfx artist, production designer, concept artist, illustrator, animator, visual designer, graphic designer, director  and  many other things. 

my passion is the cinema and the gaming production, i adore the magic of creating worlds and stories, 

and putting smiles upon people faces , i love teaching and learning, it makes always your life different

more cultivated and skilled.

i like to share all my knowledge and experience with hungry students to learn and evolve

i would enjoy taking you with me on this journey to create amazing art .

"intellectual growth should commence at birth and erase at death" albert einstein   .

Visualizar o perfil completo

Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução ao curso: Olá. Meu nome é Renzi Blah Sou artista conceitual, designer gráfico, artista visual e muitas outras coisas. Tenho dois anos de experiência na área de design gráfico e arte. Eu trabalhei com muitas marcas e com muitos clientes. Como humano, tenho uma apreciação inerente das formas, padrões e ritmos Eu crio imagens com código porque estou interessado na estrutura por trás das coisas que queremos, experimente esteticamente satisfatoriamente com código criativo e nunca Sempre há algo para explorar nova técnica para aprender ou uma nova imagem para criar. Eu mesclo meu interesse em animação gráfica e visual com programador para que eu possa desenvolver, desenhar e animar qualquer Eu usei muitas linguagens de programação , mas minha favorita atual é JavaScript. É fácil de pegar, é flexível, adequado para pequenos projetos rápidos e grandes. Nessas ferramentas de premiação, aprenderemos os fundamentos da programação criando recursos visuais com JavaScript. Para o projeto final, você produz uma série de composição visual com um código que pode ser implementado em um navegador da web. Para começar, mostrarei como configurar um editor de texto e como executar código em um navegador. Em seguida, ensinarei alguns conceitos básicos de JavaScript, como matriz de funções variáveis e loops, sempre usando exemplos e desenhando recursos visuais ao longo do caminho Começaremos com uma configuração simples e, em seguida, passaremos para o ambiente de esboço com um código chamado Canvas sketch Depois disso, saímos do visual usando rotação e arcos e , em seguida, passamos para um esboço animado com agentes móveis e linha Também mostrarei como exportar sua arte como imagem e vídeo Na próxima etapa, veremos sair de grades, usar ruído e criar nosso próprio painel de controle com um controle deslizante para ajustar os valores em tempo e criar nosso próprio painel de controle com um controle deslizante para ajustar os valores Em seguida, mostrarei como trabalhar com texto de forma criativa e como ler valores de cores a partir do pixel de uma imagem. Na segunda parte do nosso curso, que é a mais avançada, vamos trabalhar com a primeira composição. Começaremos com um retângulo simples e construiremos um padrão geométrico Aprenderemos sobre paleta de cores, modos de mesclagem e máscaras de recorte Em seguida, passamos para as curvas. Começaremos com uma única curva quadrática seguida por um ponto contínuo a vários pontos No processo, também abordaremos interação do cursor e o mapeamento de cores e, no esboço, produziremos uma visualização de áudio Vou te ensinar como reproduzir arquivos de som com seus dados e usar a frequência para conduzir a animação. E para a última composição que tocamos com as partículas, vamos definir sua velocidade e aceleração, fazê-las reagir ao curso Também aprenderemos como definir suas cores com base em imagens. Por fim, encerraremos com algumas dicas e truques extras. Ao final deste curso, você terá várias técnicas para continuar e desenvolver sua própria composição. Para tirar o máximo proveito dessas listas, é melhor se você estiver familiarizado com JavaScript ou linguagem de programação similar Escreva código e construa sua própria estrutura para criar algo bonito. Bem-vindo à aula e espero que você goste. 2. Quem me influencia: Nesta escuta, vou falar sobre algumas das pessoas que me inspiraram. Quando comecei com a codificação criativa, não foi só uma pessoa que me fez querer fazer isso Havia uma comunidade de pessoas fazendo um ótimo trabalho com a carne, que mais tarde se tornou o Adobe Flesh. Mas um nome que se destaca desse período é Yugo Nakamur Ele é um designer japonês que costumava ter um site chamado yugop.com, que infelizmente não está mais ativo Esse experimento de codificação era mínimo e muito interessante Não muitos deles, apenas alguns, mas foram muito influentes para muitas pessoas naquela época Ele dirige o estúdio de design no Japão e continua fazendo um trabalho incrível. Alguns anos depois, quando a web começou a migrar do flash para Havia dois sites que me inspiraram a começar a fazer codificação criativa usando o Canvas Um deles foi o sketch dot gs de Justin Wende, que era uma estrutura mínima para esboçar, por Tinha uma galeria com alguns pequenos experimentos com os quais era muito divertido brincar. O outro foi Play Pit, de Aji Moriahi, que estava experimentando um CD, mas que também O site era apenas uma coleção de ideias aleatórias. Eles nem tinham nomes, apenas números. Gosto da ideia de criar um espaço para hospedar experimentos aleatórios. Não é preciso esperar que um projeto comece a codificar uma ideia Só poderia ser publicado como um experimento rápido. Fora da web, também fiquei muito impressionado com o trabalho de alguns artistas digitais Um deles foi Memo at ten, que não só tem uma ideia muito interessante, mas também mantém um nível de execução muito alto Seu trabalho é muito completo, muito bem apresentado, às vezes mostrando um pouco do processo por trás da criação da obra de arte Sou um grande fã de um projeto de 2012 chamado Forms. Há um vídeo em que podemos ver imagens de Atlet em movimento e como elas foram usadas como entrada para a arte abstrata que eles estavam criando Outra arte digital que eu gosto muito é Rogi Atida. Ele tem um estilo característico e é muito consistente com sua estética. Seu trabalho é ao mesmo tempo mínimo e complexo. Ele está nos mostrando que podemos criar algo bonito com código sem precisar depender de motores pesados ou técnicas de iluminação realistas. E, mais recentemente, na era do Instagram, há muitas pessoas boas fazendo um ótimo trabalho por aí. Um que eu tenho que destacar é Matt Drier, que parece ter um conjunto infinito de ideias para esboçar com código Ele publica constantemente novos materiais e é consistente com a aparência de seu trabalho. Como veremos mais adiante neste curso, ele também é o autor de uma ferramenta popular para código criativo usando o Canvas. E, finalmente, um artista que não está realmente no Instagram, mas que é muito ativo no Twitter, é Anders Hoff, também conhecido como n Novamente, minimalista e bonito, mas não necessariamente simples. Ele está criando sistemas e explorando o comportamento com matemática e geometria para criar sua arte Espero que você tenha achado o trabalho desse artista inspirador, porque agora é a nossa vez É hora de começarmos a programar. 3. Comece a confusão: Tudo o que precisamos para começar é um navegador da web e um editor de texto. Usaremos o editor de texto para escrever um código e o navegador para executá-lo. Você provavelmente já está assistindo isso em um navegador da web. Então, metade do trabalho já está feito. Sinta-se à vontade para usar qualquer navegador com o qual você se sinta confortável. Vou usar o Google Chrome, mas seria ótimo usar o Firefox, Edge ou Safari O conteúdo que vamos ver deve funcionar bem em todos os principais navegadores. Quanto ao editor de texto, existem muitas boas opções disponíveis. Vou mencionar dois dos mais populares, o código do Visual Studio e o texto sublime Ambos estão disponíveis para Windows e Mac, e ambos são muito bons. Vou usar texto sublime porque é leve e eu gosto muito dele Mas aqui, é o mesmo que com um navegador. Se você já tem um editor favorito, não tem problema. Sinta-se à vontade para usar o que você preferir para o curso. Caso você ainda não tenha um favorito ou queira seguir exatamente o que vê na minha tela , eu recomendaria um texto sublime. Agora, segredos aqui. Basta clicar no grande botão Download, seguir as etapas na tela e o editor estará pronto e funcionando em alguns segundos. Agora, com o navegador pronto e editor pronto, podemos começar. Na próxima escuta, faremos uma introdução ao JavaScript. 4. Introdução ao Java: Para aproveitar ao máximo este curso, presumo que você já esteja familiarizado com o JavaScript. Nosso foco será abandonar os recursos visuais com código. Se tivéssemos que começar a abordar o idioma do zero, precisaríamos de todo o curso só para isso. Portanto, se este é seu primeiro contato com o programador, eu recomendaria primeiro conhecer um pouco do básico. Se você aprende rápido ou conhece outras linguagens de programação, ou se deseja apenas refrescar sua memória sobre JavaScript, isso é Se você já está familiarizado com o JavaScript, fique à vontade para pular para o outro vídeo Então, aqui eu tenho o Google Chrome e um texto sublime por enquanto. Não quero que você se preocupe com a configuração ou cópia de nada do que estou prestes a digitar. Não vamos desistir de nada ainda. Estamos apenas dando uma olhada no idioma. Começaremos com uma variável. Em Javascript, as variáveis são declaradas com um let e uma constante com custo. As variáveis podem ser alteradas após a declaração, mas é bastante comum ouvir a palavra variável se referindo a qualquer uma delas. Mesmo que constante, não se pode confiar em variar. Agora funciona. Também é comum declará-las usando constantes Por exemplo, multiplique const igual a A e B dentro dos tamanhos dos pais Em seguida, uma seta plana e, em seguida, com Carl BrGusrTurn A vezes B. Isso é o mesmo que escrever uma função, multiplique A e B, retorne A vezes B. Se você conhece outras linguagens de programação, a segunda Mas de qualquer forma, os dois são iguais. Ambos são válidos. Vamos usar a primeira forma ao longo do curso e depois chamar a função. Vamos multiplicar os parênteses e depois os parâmetros que queremos passar Por exemplo, oito e quatro, isso resultaria em 32. Se quisermos ver a saída, já que você está trabalhando com o navegador, podemos registrá-la no console. Então, aqui estou armazenando o resultado em uma variável e desconectando-o com o log de pontos do console. Para abrir o console, pressione o botão Control Shift no Windows ou Command Option I no Mac. E aí está. Passando para a matriz e os objetos. As matrizes são declaradas com colchetes e o objeto com colchetes. Um exemplo de matriz pode ser cores em que cada valor é uma string. Por exemplo, azul, amarelo, vermelho e verde. Um exemplo de objeto pode ser um polígono com uma propriedade como visão e raio Para acessar um item na matriz, novamente, usamos colchetes, por exemplo, colchete zero de cores nos dá o primeiro item da matriz, que neste caso é azul Para acessar uma propriedade de um objeto, usamos o mesmo nome do objeto, ponto e, em seguida, o nome da propriedade. Por exemplo, rádio de pontos poligonais, que produz 120. Podemos percorrer matrizes usando um clássico de quatro loops , composto por três partes Primeiro, o índice da iteração. Tradicionalmente, a letra I e depois o comprimento do laço, como em. Olá, plupon, embora eu seja menor que o comprimento do ponto colorido e, finalmente, o que fazer com o I em cada iteração Novamente, tradicionalmente, incrementado em um com I plus plus Aqui, podemos ver no console o valor de I e o valor da matriz em I. Outra forma de iteração por meio de uma matriz é a largura de cada As cores pontuam para cada uma. Desta vez, é uma função e o primeiro parâmetro é o valor do item. De cada iteração, aqui também podemos acessar o item de log de pontos do console E se precisarmos do índice da iteração, ele será passado como o segundo parâmetro Para condicionais, caso contrário, a sintaxe é bem direta Se algo for verdadeiro, console dot log dot lcsole dot log dot Quando estamos declarando uma variável, podemos usar outro tipo mais compacto de condicionais com um operador ternário Digamos que temos uma variável chamada noite e queremos definir a cor de fundo com base no fato de ser noite ou não. A cor de fundo é igual a esta noite. Ponto de interrogação, preto, dois pontos brancos. Isso é equivalente a escrever se noite for igual a verdade. A cor de fundo é igual a preto. Caso contrário, a cor do fundo é igual a branco. Um último tópico que quero abordar em nossa recapitulação é como usar uma função síncrona com uma sincronização e um peso Em JavaScript, o código é interrompido de forma sincronizada por padrão, o que significa que se você declarar uma variável com um valor na linha 93, você sabe que ela ainda não existe na linha 92 e tem um valor Às vezes, precisamos executar código que não é resolvido instantaneamente. Chamar algo em uma linha não significa que obteremos o resultado antes que a próxima linha seja interrompida Um exemplo disso é quando queremos carregar uma imagem. Vamos criar uma função chamada carregar imagem. Ele usa o URL como parâmetro. Em seguida, criamos uma nova imagem armazenada em uma variável chamada EMG. Ted, a fonte de EMG do RL, nós falecemos. E, finalmente, retornamos a imagem. Agora podemos usar nossa função, por exemplo, com uma variável chamada my Image, que é igual a carregar imagem e, em seguida, a URL que queremos passar. Vou usar uma imagem genérica do Lorem PixM e pegar essa URL aqui, que deve me dar uma imagem aleatória com uma largura de 200 pixels, e depois tentarmos sair da imagem Isso não nos dará erro, mas a largura será zero porque a imagem não termina carregar antes de tentarmos lê-la a partir dela Carregar uma imagem é uma tarefa não sincronizada. Para gerenciar uma situação como essa, podemos usar um conceito de Javascript chamado promise. Vou fazer uma cópia do que escrevemos aqui. Então, vamos elogiar esse bloqueio. Agora, modificamos a cópia para usar um pecado e esperar. Primeiro, preciso digitar uma coisa na frente da função e depois dentro dela. O que eu quero fazer é retornar uma nova promessa com os dois parâmetros, resolver e rejeitar. No carregamento da imagem, queremos resolver a promessa e retornar MG. E em caso de erro, queremos rejeitar a promessa. Em seguida, vou mover essa parte aqui dentro de outra função de sincronização chamada start Em seguida, defina minha imagem para a imagem de carga de peso. E então basta ligar para start para ver o resultado. E aqui está a maneira correta. Então, aqui estamos dizendo ao navegador que espere até que os problemas sejam resolvidos e só então execute a próxima linha. Esta última parte pode ter sido um pouco mais complicada do que o resto que abordamos em nossa recapitulação Se você entendeu tudo até esta parte, está pronto para prosseguir com o curso. Não é obrigatório entender o cenário e esperar agora, mas é bom saber que ele existe para o caso de nos depararmos com ele mais tarde Certo. Esta é toda a nossa recapitulação Era apenas um amplificador curto e fofo. Claro, há mais no Javascript do que isso. Portanto, se alguma coisa não estiver clara, verifique a documentação. Em seguida, começaremos a configurar nosso ambiente. 5. Aprenda variáveis e funções: Codificar é dar instruções a uma máquina. Nós dois temos que falar uma língua comum e a máquina. No nosso caso, falaremos Javascript e a máquina usará o navegador como intérprete Os navegadores são ferramentas muito poderosas. Sua função principal é renderizar páginas STML, o que não é uma tarefa fácil Há muita coisa que pode ser feita apenas com o SDML. JavaScript e CSS, se você não estiver familiarizado com esses termos, posso simplificar: SDML lida com os dados, CSS lida com a formatação e JavaScript cuida do comportamento Nosso objetivo neste curso é escrever JavaScript, mas também quero mostrar como começar algo do zero, a partir de um arquivo vazio. Então, precisamos ver um pouco de DML primeiro. Quando abrimos nosso editor, vemos um arquivo vazio. E a primeira coisa que eu quero fazer é salvá-lo. Eu já fui em frente e criei uma pasta para armazenar todos os arquivos desse curso. E eu vou salvar isso como hello dot HTML. Um documento HTML é feito de blocos, que podem conter outros blocos. E esses blocos são definitivamente marcados por tags. Vamos escrever nossa primeira tag. Entre colchetes angulares, inserimos HTML. Essa é a etiqueta de abertura, e também precisamos da etiqueta de fechamento, que começa com um colchete angular e uma barra para frente Você deve ter notado que, assim eu digitei a barra, o editor já completou automaticamente a tag Essas tags estão dizendo que temos um documento CML aqui. E, no mínimo, precisamos de pelo menos mais uma tag, que é definir o corpo da página Então, vamos também escrever o corpo e, novamente, abri-lo e fechá-lo. E então, dentro do corpo, podemos escrever uma mensagem. Olá, palavra. Agora salvamos o arquivo. Clique duas vezes nele no Explorer ou no Finder. E abra-o no navegador, e aí está nossa primeira página SEML muito básica Agora, e se quiséssemos que a mensagem fosse exibida como cabeçalho? Só precisaríamos envolvê-lo com etiquetas H one, abri-lo e fechá-lo. E eu vou voltar ao navegador, atualizar a página, e nossa mensagem agora está estilizada como um O que o navegador está fazendo é pressionar o arquivo SGML e renderizar seus elementos Podemos ver o SGML por trás desta página ou de fato. Qualquer página que você vê no navegador com o inspetor de elementos, na maioria dos navegadores, o atalho é Control Shift I ou Command Shift I. Ou também podemos clicar com o botão direito do mouse em qualquer lugar da página e ir para inspecionar E aí está nosso elemento H um novamente, mas não estamos realmente interessados nos elementos do cabeçalho. Vamos usar o SGML apenas para nos dar um espaço no qual possamos desenhar, e há um elemento só para isso É chamado Canvas. Abra, feche. E desta vez vamos entrar na tag de abertura para adicionar algumas propriedades. Com igual a 600 no interior, códigos duplos e altura também igual a E agora, se salvarmos e atualizarmos, não veremos nada. E isso porque a tela ainda é transparente, não há nada nela. Mas usando o elemento e o Spector, podemos vê-lo ainda lá É uma caixa de 600 pixels por 600 pixels onde podemos desenhar usando código. E para escrever algum código, precisamos de outra tag , chamada script. É aqui que escrevemos JavaScript para ser interrompido pelo navegador, e esse será nosso espaço É aqui que começamos a aprender sobre codificação, e o primeiro tópico sobre o qual quero falar é variável Uma variável é uma referência a um valor. Vou te dar um exemplo imediatamente, seja X igual Aqui, X é uma variável e cinco é um valor. Em JavaScript, declaramos variável usando a palavra let. Digamos que eu precise usar esse valor em vários lugares no meu código. Não preciso digitar cinco em todos os lugares. Acabei de me referir a X. E então, se mais tarde o valor mudar para quatro, por exemplo, o resto do código usará o valor atualizado Vamos dar uma olhada em outro exemplo. Seja aqui igual a 2024. E se quiséssemos armazenar também no próximo ano, eu poderia dizer que o próximo ano seja igual a 2025. Mas aqui, em vez do tipo 2025, basta dizer que o próximo ano é igual ao ano mais um. Se tivéssemos que alterar o valor do ano, próximo ano já teria o valor correto. Você deve ter notado que eu uso o ponto e vírgula após o valor, ou seja, indique o final da linha Eles não são obrigatórios. Os navegadores não gerarão erros se você não os usar, mas há alguns cenários que fica complicado sem ponto e vírgula Então, eu prefiro ser explícito sobre onde minhas linhas terminam. Esse é o estilo que vou seguir neste curso. Ainda variáveis, elas não servem apenas para armazenar números. Eles também podem armazenar outros tipos de dados, como texto, poderíamos dizer: Deixe o jantar igual ao macarrão. Aqui eu escrevi pasta dentro de um único código, que é como diferenciamos texto normal de variável e outras palavras especiais em JavaScript. Também podemos usar códigos duplos que também funcionam. Na programação, o texto geralmente é chamado string porque é uma sequência de caracteres. Vamos escrever outra string. Deixe a frase ser hoje à noite, o jantar será. E então nossa variável. A frase seria lida hoje à noite, o jantar será macarrão. Mas se mudarmos o valor da nossa variável , a frase seria lida hoje à noite, o jantar será salada. As variáveis estão em toda parte e são essenciais para a programação. Acho que não preciso dar muitos outros exemplos. O conceito é bem fácil de entender. Vamos usá-los o tempo todo, mas as variáveis por si só não fazem muita coisa. Antes de podermos fazer qualquer coisa, também precisamos falar sobre funções. Função é um bloco de código que executa uma tarefa. Isso pode ser considerado como ações. Quando chamamos uma função, estamos executando um pedaço de código. Vamos dar uma olhada em um exemplo. Função: faça algo, abra e feche os parênteses. Abra e feche os colchetes encaracolados. Podemos dizer que isso é uma função não apenas porque tem a palavra função à sua frente, mas principalmente por causa dos parênteses de abertura e fechamento Isso aqui significa ação. Nesse caso, estamos declarando uma função e entre os colchetes é onde escrevemos o que a função fará E essa função específica ainda não está fazendo nada. Então, vamos chamar um que realmente faz alguma coisa. Vamos usar uma ferramenta de navegador que é a melhor amiga do programador chamada ConSot e podemos encontrá-la aqui ao lado do Podemos usar a mensagem Logout do nosso código e, para fazer isso, precisamos chamar aconsole dot lug Digitamos a mensagem que queremos registrar, por exemplo, olá. E aí está nossa mensagem. Agora vamos mudar de fazer algo para dizer algo, e então podemos colocar o log do console dentro da nossa função. Sim, não há problema em colocar uma função dentro de outra função. Não queremos que ele diga olá toda vez. Queremos que ele registre tudo o que passamos para a função. E para isso, precisamos de um parâmetro. Vamos chamá-lo de param. Está entre os parênteses aqui e aqui. Agora podemos chamar say something e passar nossa mensagem como parâmetro. Olá. Ou podemos usar a frase que criamos antes como uma variável. Em vez de trocar janelas o tempo todo, talvez possamos colocar os navegadores em uma metade da tela e o editor na outra metade da Vamos ver outro exemplo com parâmetros. Vamos criar uma função chamada ED, que usa dois parâmetros A e B. E depois os somamos A mais B. E então podemos chamar a função e armazenar o resultado em uma variável. Deixe o resultado B somar cinco e sete. Em seguida, faça o login no console para que possamos ver o resultado. Bem, não há nada lá, e isso é porque a função está apenas adicionando os números, mas não os está retornando. Se quisermos que uma função execute uma tarefa e também retorne um valor, precisamos adicionar a palavra return. Agora vemos o resultado. Há também uma maneira diferente de escrever uma função em JavaScript, que na verdade veremos com mais frequência do que com a função de palavras, ou seja, com uma função de seta. Vamos criar um chamado multiplicar. Começamos declarando uma variável, então vamos multiplicar e definir o valor dois, abrir e fechar parênteses, e então precisamos de uma seta grossa, que seja igual e maior do que Lembre-se, eu disse que variáveis são referência a valores. Aqui está a mesma coisa. Estamos usando uma variável, referenciando uma função. Essa é apenas outra forma de escrever a mesma coisa que escrevemos aqui. Podemos colocar nossos parâmetros A e B dentro dos parênteses, e essa função retornará A vezes B. Para verificar se está funcionando, nem precisamos armazenar o resultado em Podemos simplesmente registrar a chamada diretamente. Registro do console, multiplique cinco e sete. E esse é o nosso resultado. Agora que sabemos sobre variável e função, podemos começar a nos afogar com o código Precisamos de uma variável para referenciar nosso elemento Canvas aqui. Então, vamos criar um. Deixe o Canvas ser igual a documento, ponto, seletor de consulta e entre parênteses dentro Canvas, há algumas coisas acontecendo aqui. Então, deixe-me explicar isso. Estamos definidos no valor de variável chamada Canvas para uma expressão. Ele começa com um documento, que é um objeto JavaScript referido a esse documento HML Os pontos indicam que queremos algo que faça parte do objeto. Nesse caso, uma função chamada seletor de consultas, e o que ela faz é selecionar um elemento do documento Precisamos dar a ele o nome do elemento que queremos selecionar, e o nome é uma string. É por isso que estamos passando o Canvas dentro de um único código. Esse nome aqui precisa coincidir com esse aqui em cima. O nome da variável não precisa ser Canvas. Pode ser qualquer outra coisa. Mas acho que também faz sentido chamá-lo de Canvas. Ok, agora temos uma referência ao nosso Canvas, mas também precisamos de uma referência ao contexto do Canvas. O contexto seja igual ao Canvas dot Get Context. Essa linha é muito parecida com a anterior, pelo menos na estrutura. Pegamos um objeto de tela, chamamos uma função que faz parte dele, chamamos o contexto G e passamos um parâmetro como uma string. O contexto é onde realmente fazemos o desenho e pode ser dois D ou três D. Por enquanto, estamos interessados no contexto de dois D. Agora podemos finalmente desenhar alguma coisa. Vamos digitar context dot field wret Field rect é uma função que ocupa quatro X, largura e altura. Vou usar 100, cem, 404 centenas. Sempre precisamos verificar as letras maiúsculas e minúsculas Caso contrário, gerará um erro. Além disso, a sintaxe, continue verificando todo o seu script. Proteja e atualize. E aí está nossa primeira forma desenhada com código. Deixe-me explicar o que esses números significam. Essas coordenadas R em um espaço de dois D. Nosso Canvas é um plano de 600 por 600 pixels, e o 00 está aqui no topo do canto esquerdo. O valor que estamos usando em nosso campo rect para X e Y é 100 e 100 Então, começamos do zero, movemos 100 pixels para a direita, 100 pixels para baixo, e é aqui que começamos a desenhar a forma. Em seguida, vamos 400 pixels para a direita e 400 pixels para baixo. Agora vamos mudar a cor do nosso retângulo. A cor padrão do campo é preta. Se você quiser algo diferente, precisamos mudar o estilo do campo. Então, antes do campo ser destruído, digitamos o estilo de preenchimento de pontos de contexto e, desta vez, não é uma função, é uma propriedade E a propriedade é como uma variável que faz parte de um objeto. É armazenar um valor nesse caso. Estamos configurando para azul. Proteja e atualize, e aí está nosso retângulo azul. E aqui usamos a função mais rápida possível para desenhar algo em nossa tela Os pés são meio que um atalho. Na verdade, está fazendo três coisas ao mesmo tempo. Está criando uma nova forma, desenhando um retângulo e preenchendo-o com alguma cor Se quiséssemos fazer algo diferente, como apenas o contorno do retângulo, por exemplo, precisaríamos escrever algumas instruções mais explícitas Primeiro, precisaremos dizer ao contexto que estamos iniciando uma nova forma ou um novo caminho. Caminho inicial do ponto de contexto. Então, precisamos dizer ao contexto que queremos desenhar um retângulo sem preenchê-lo Entre em contato com o ponto t e podemos usar o mesmo parâmetro que usamos antes de 100.000, 400 , 400, e então podemos decidir preenchê-lo com uma cor ou desenhar apenas o contorno, que é o que vou fazer com o traçado de pontos do contexto Se atualizarmos agora, prestes a ver um contorno preto ao redor do retângulo azul Vamos facilitar a visualização aumentando a largura da linha A largura da linha de pontos do contexto é igual a quatro. Também podemos ocultar o retângulo azul comentando a linha com field Só precisamos digitar dois para barras de palavras no início da linha Em texto sublime, há um atalho para ele, que é controlado por barra de palavra ou comando por barra ou comando por Você pode ver a linha ficar cinza, o que significa que foi comentada, e é ignorada pelo navegador ao executar o código Agora, vamos desenhar uma forma diferente. Vamos desenhar um círculo. Começamos novamente com o caminho inicial do ponto de contexto, e o método para desenhar o círculo é chamado ponto de contexto ARC RC E como sabemos onde os métodos ou propriedades estão disponíveis para o Canvas ou o contexto do Canvas? Precisamos consultar a documentação. Existem algumas documentações de referência on-line e, para o Canvas, costumo usar essa para três escolas. Deixe-me ver tudo como uma única lista. Aqui está um acidente de campo, por exemplo, e aqui está a largura da linha A palavra método aqui pode ser lida como uma função. Há uma diferença sutil entre os dois, mas não precisamos nos preocupar com isso Então, ao usar o método, você pode pensar em uma função. O meio em que estamos interessados agora é o Rc, então vamos dar uma olhada mais Aqui embaixo, vemos que são necessários seis perímetros, e o último é opcional, então vamos nos concentrar nos cinco primeiros Raio X, Y, ângulo inicial e ângulo final. Quero circular bem no meio da nossa tela, que tem 600 por 600. Então, X e Y serão 303 centenas. raio pode ser 100 e os ângulos inicial e final seriam de zero a 360, mas os ângulos estão em brilho e não em Então, precisamos de zero a Pi vezes dois. Em JavaScript, o número PI é usado com tanta frequência que já está armazenado como constante, e podemos acessá-lo com o ponto matemático PI. E então só precisamos multiplicá-lo por dois. Agora, para finalmente desenhar o círculo, podemos usar preenchimento ou traçado, e eu vou usar traçado novamente. Então, isso é muito bom. Estamos aprendendo e desenhando. E agora vamos continuar fazendo isso. Na próxima lição, ensinarei sobre matrizes e loops 6. Aprenda matrizes e loops: Antes de podermos esboçar um pouco mais, vamos dar uma olhada em outros dois conceitos de programação. Começaremos com matrizes. A lista de matrizes é: vou te dar um exemplo imediatamente. Deixe o seu ser igual a Aqui temos uma lista de valores e podemos reconhecê-la como uma matriz porque eles estão entre colchetes e os valores são separados por cos a Aqui temos uma lista de valores e podemos reconhecê-la como uma matriz porque eles estão entre colchetes e os valores são separados por cos. E é o mesmo para todos os tipos de um valor. Podemos criar uma matriz de strings. Deixe o menu ser igual a iniciar ou maio. Sobremesa e bebidas. Agora, e se quiséssemos examinar cada item dessa lista? Quando precisamos de loops. Loops são trechos de código que são executados repetidamente por um número limitado de Existem alguns tipos diferentes de loops em JavaScript. Eu vou te mostrar o clássico for loop. Para parênteses abertos e fechados, abra e feche o suporte frio Dentro do colchete Clear é onde escreveremos o código que queremos executar várias vezes E dentro dos parênteses, escreveremos uma expressão para controlar o loop, que é feito de Na primeira parte, declaramos que uma variável é o índice do loop Tradicionalmente, usamos a letra I e começamos em Zo, então seja I igual a E aqui precisamos de um ponto e vírgula para indicar o final da primeira A segunda parte é a duração do loop ou quantas vezes queríamos rodar. E queríamos correr enquanto eu tivesse menos de quatro anos. E a terceira parte é o que queremos fazer com I em cada iteração do loop E queremos incrementá-lo em um, então I mais é igual Incrementar em um é muito comum na programação. Portanto, há uma maneira mais curta de escrever a mesma coisa, que é I plus plus. Com isso, estamos dizendo que estamos começando com zero e depois executando algo, depois mudando para um e depois executando algo novamente. E depois para dois e para três. E quando chegamos a quatro, saímos do loop e continuamos com o resto do código. Esse loop será executado por quatro iterações, que é o mesmo que o número de itens que temos em nossa matriz de menu Podemos acessar os itens da matriz digitando menu. Colchetes. Aqui, I está alterando seu valor 0-1 e depois dois e depois três Podemos bloquear esse acompanhamento toda vez que o loop é executado. E aí está nosso cardápio com itens listados um por um. E isso poderia ser um pouco mais dinâmico. Digamos que adicionássemos um item ao nosso menu, acompanhamentos, por exemplo. E então, se executarmos isso, não o veríamos no console porque nosso loop está sendo executado quatro vezes e nossa lista agora tem cinco itens. Podemos substituir o número quatro aqui pelo tamanho ou comprimento da nossa matriz. Comprimento mínimo. Agora, não importa o tamanho da matriz, sempre examinaremos todos os itens. E os loops não servem apenas para ler valores de uma matriz, também podemos usá-los para escrever duas matrizes Vamos remover esses valores aqui e deixá-los como uma matriz vazia. E então podemos escrever outro loop desta vez subindo para dez. Aqui, queremos inserir valores na matriz de anos 2024 mais R. Depois que o ciclo terminar, podemos registrar o valor dos anos e ver o que está nele Vemos que preenchemos a matriz com um valor 2024-2033. Também podemos usar loops para desenhar, então vamos fazer isso. Vamos secretar outro loop rodando cinco vezes e, dentro dele, escreveremos algo semelhante ao que escrevemos anteriormente Caminho inicial do ponto de contexto. pontos de contexto X e Y podem permanecer em 100, mas a largura e a altura agora serão 60 e , em seguida, o traçado de pontos de contexto Quando executamos isso, vemos outro quadrado aqui em cima, mas vamos comentar as outras formas para deixar isso um pouco mais claro Deveríamos estar vendo cinco quadrados, mas estamos vendo apenas um, e isso é porque os estamos desenhando um em cima do outro Precisamos mudar alguma coisa toda vez que o loop é executado. Poderíamos dizer, por exemplo, que X é 100 mais 60, que é o widget vezes I. Agora vemos todos os cinco ou, se quisermos um espaço entre os quadrados, poderíamos dizer 80 vezes I. Mas então digamos que queremos manter essa lacuna, mas altere a largura para Precisaríamos alterar esse valor em dois lugares, e isso parece um bom candidato para variável. Vamos declará-los aqui. Deixe a largura igual a 60. Deixe a altura ser igual a 60. Seja X igual a 100. Seja Y igual a 100. E então nós os usamos no parâmetro. Também podemos criar uma variável para lacuna que seja igual a 20 e, em seguida, atualizar X para mais de 100 Madeira mais lacuna, vezes R. Se estivermos nisso, nada muda. Mas agora, se mudássemos as madeiras da matriz, a lacuna permaneceria consistente O que temos agora é uma linha de cinco quadrados. E se quiséssemos mais linhas? Precisaríamos de outro loop dentro do nosso loop, ou em outras palavras, um loop aninhado Também precisamos de outra letra para o índice do segundo loop. E, tradicionalmente, é a letra G. Então, precisamos mover nosso código dentro do segundo loop no texto legendado dentro de selecionar as linhas e pressionar control shift para cima ou para baixo para movê-las. Agora podemos atualizar y da mesma forma que fizemos com X. 100 mais altura mais espaço vezes G. E nos livramos dos retângulos Qualquer coisa que escrevermos dentro desse loop será executada 25 vezes. Então, se desenharmos outra forma, ela também aparecerá 25 vezes. Vamos fazer isso. Caminho inicial do contexto, ponto reto do contexto, e podemos tornar o retângulo um pouco menor agora X mais oito Y mais oito largura -16 e altura -16. E então contextualize Dot stroke. Agora, e se não quisermos que esse quadrado menor apareça dentro de todos os quadrados grandes É hora de outro conceito de programação. As condicionais em JavaScript são muito parecidas com muito Se alguma condição faz alguma coisa ou faz alguma coisa, nem sempre precisamos de outra. Se outra coisa significa não fazer nada, então podemos ignorá-lo. Vamos usar a condicional em nosso loop. Quero desenhar o pequeno quadrado somente se eu for maior que zero e menor que quatro. Observe o operador atual aqui, que significa um fim lógico. Isso vai pular o pequeno quadrado na primeira e na última coluna Poderíamos escrever Ls aqui e desenhar em formas diferentes, talvez. Mas, em vez disso, vamos ver algo um pouco mais interessante. Lembre-se de quando precisamos usar PI, e eu disse, ele é usado com tanta frequência que temos uma constante para ele. Bem, números aleatórios são usados com ainda mais frequência e temos uma função para obtê-los. Ponto matemático aleatório. Essa função retorna um número aleatório de 0 a 1, e são nossos amigos O resultado é diferente a cada vez, e isso é muito interessante para nós que estamos criando imagens com código. Ele introduz um elemento de chance. Permite que o computador faça um pouco do trabalho criativo, um pouco de design generativo, poderíamos usar um número aleatório dentro de nossa condicional Então, em vez disso, poderíamos dizer que queremos desenhar o pequeno retângulo Quando a aleatoriedade de pontos matemáticos for maior que 0,5, essa condicional será verdadeira em média 50% das vezes Sempre aleatoriamente. Então, toda vez que atualizamos a página, obtemos pequenos quadrados em lugares diferentes Falamos muito até aqui, mas antes de prosseguirmos com nosso hello HTML, quero falar um pouco mais sobre alguns dos conceitos que vimos anteriormente. Eu mencionei que em JavaScript, declaramos a variável usando a palavra let Há também outra maneira de declará-los, que é a palavra const Os custos são constantes. Então, nós o usamos para um valor que não mudará. Um exemplo pode ser variável para gravidade e outro para velocidade A gravidade não muda, então devemos declará-la com custo, e é provável que a velocidade mude Então, declararíamos isso usando chumbo. A regra geral é sempre usar const, a menos que saibamos que o valor vai mudar Podemos aplicar isso ao nosso loop aqui em cima. altura e a lacuna arborizadas não mudam, então podem ser constantes Na verdade, eles nem precisam ser declarados dentro do loop. Seria suficiente que eles fossem declarados apenas uma vez fora do loop, e o mesmo vale para X e Y. Mas sabemos que o valor deles vai mudar, então, para eles, precisamos usar let E como eles não têm um valor inicial, ambos podem ser declarados na mesma linha. Agora, a saída visual não muda, mas nosso código está um pouco mais organizado. Não vou falar sobre todos os tipos diferentes de loops em JavaScript, mas quero mostrar pelo menos mais um, que é para cada loop Lembre-se de nossa variedade de menus. Podemos examinar seus itens digitando um ponto mínimo para cada um e, em seguida, abrimos parênteses porque E o primeiro parâmetro é o item que está sendo iterado. E então precisamos da flecha gorda e dos suportes encaracolados fechados abertos Dentro dos colchetes, podemos registrar o item exatamente como estávamos fazendo antes E aqui está nossa lista de itens mais uma vez. Vimos muitos conceitos de programação nesta lição. Voltaremos ao código em breve e usaremos esses conceitos repetidamente . Caso alguns deles ainda não estejam totalmente claros, não se preocupe, você pode escolhê-los ao longo do caminho. A melhor maneira de aprender é por exemplo, e vamos ver muitos deles enquanto desenhamos Agora você está familiarizado com mais conceitos de programação. Na próxima lição, examinaremos um ambiente para esboçar 7. Aprenda a fazer esboços de ambiente: Nas aulas anteriores, eu queria mostrar uma conexão direta entre as palavras que estamos digitando no editor de texto e o que acontece quando elas são interrompidas pelo navegador Isso é o que sempre acontece. O navegador está sempre pressionando um pouco de HTML e interrompendo algum código Mas não precisamos começar do zero todas as vezes. Ao longo dos anos, a comunidade desenvolveu todo um ecossistema de ferramentas para escrever coisas para o navegador, e podemos tirar proveito disso. Então, agora vamos adicionar algumas camadas entre nosso código e o navegador. A complexidade vai aumentar um pouco, mas não há nada a temer. Muito pelo contrário, vai ficar mais emocionante de agora em diante. Precisaremos instalar mais algumas coisas. A primeira coisa que precisamos é de um terminal. Você não precisará instalar nada. Você só precisa ir ao Finder e digitar terminal. Se você estiver no Windows, precisará baixar alguma coisa. E, novamente, existem algumas opções disponíveis e estão todas bem. Git para Windows ou Commander, ou no meu caso, usarei o CMDar Mas você também pode usar UC, então escolha o que quiser Clique no botão de download e instale-o. Ao abri-lo, você verá uma janela como esta. O esquema de cores pode ser diferente dependendo da plataforma em que você está ou da opção escolhida Mas, em essência, é tudo a mesma coisa. Em seguida, também precisamos parar os pontos do nodo. Então acesse nodgs.org e baixe a versão mais recente recomendada Após a conclusão da instalação , podemos verificar se tudo correu bem. Ao abrir nosso terminal e digitar o nó V, você deve ver o número da versão aqui. Caso você veja algo como comando não encontrado, talvez seja necessário fechar o terminal e abri-lo novamente. O Node agora está instável e vem com algo em que estamos muito interessados, chamado PM Vamos verificar se está aqui digitando PMV. O MPM é um gerenciador de pacotes para JavaScript. Ele nos permite instalar pacotes e bibliotecas recrutados pela comunidade Isso faz parte do ecossistema do qual eu estava falando. Vamos estilizar uma biblioteca, que é ótima para codificação criativa com o Canvas, chamada Canvas Sketch Canvas sketch foi criado por Matt Dier, que é artista e programador criativo E eu definitivamente recomendaria conferir o trabalho dele. Mas, por enquanto, vamos continuar com a paralisação do Canvas sketch. Precisamos copiar essa linha e passá-la em nosso terminal. Esboço de tela no estilo PM, Cli G. Esta é uma biblioteca paralisada com PM e o G significa que a estamos instalando globalmente Assim, podemos executá-lo de qualquer lugar, não apenas da nossa pasta atual, a CLI aqui significa interface de linha de comando, que significa que podemos digitar alguns comandos para o Canvas sketch em nosso terminal Quando a instalação estiver concluída, precisamos ir para a pasta que criamos para este curso. Suponho que alguns de vocês possam não estar muito familiarizados com os comandos do terminal, então vamos dar uma olhada rápida em alguns deles. Claro. Se você quiser limpar a tela, use CD para alterar o diretório. No meu caso, quero mudar para documentos Java Visual. Caso precise voltar para uma pasta principal, você pode digitar CD dot forward slash Quando começarmos a digitar o nome de um arquivo existente ou diretamente, podemos pressionar tab O preenchimento automático e também temos o LS para listar arquivos e pastas no diretório atual. Esta é minha pasta, claro, e espero que você tenha conseguido encontrar a sua também. Precisamos criar outra pasta dentro dela, e o comando é MKDIR ou make directory e, em seguida, o nome do novo diretório Vamos chamá-lo de nossos esboços. E então esboços em CD para entrar em nossa nova pasta. E aqui vamos usar o Canvas sketch para criar um novo arquivo para nós Então, primeiro, digitamos Canvas sketch, depois o nome do nosso arquivo, que vai esboçar dzero one E então, é novo dizer que queremos que ele seja criado. Se você quiser mais detalhes sobre esses comandos, dê uma olhada no Canvas sketch. Leia-me no Github. Agora voltamos para nossa pasta, podemos ver que há alguns arquivos novos. Pacote dot GSO e pacote dot log dot dot JSON. Existem arquivos de dados que acompanham os pacotes que iniciamos com o MPM. O que queremos é abrir o sketch 01 dot gs em nosso Editor. Podemos ver um pouco de código padronizado já escrito Deixe-me explicar o que está aqui. Na parte superior, vemos uma linha com uma exigência. Isso é importante para a biblioteca de esboços do Canvas e para armazenar uma referência a ela como um esboço do Canvas Então, temos um objeto chamado configuração com uma propriedade chamada dimensões. Esses valores estão em pixels. Isso significa que ele criará um elemento Canvas, que tem 2048 por 2048 pixels Então temos uma função chamada sketch, que está retornando outra função sem nome Essa função anônima é chamada de entrega B em si e fornece algumas propriedades úteis sobre nossa tela, como contexto, largura e altura Dentro dessa função, estamos vendo algo familiar. Temos estilo preenchido com contexto e quebra de campo de contexto. Basicamente, isso é desenhar um grande retângulo branco como plano de fundo para nossa tela E a última linha está finalmente chamando a entrega e passando nossa função de esboço e nossa configuração como parâmetros Se voltarmos ao nosso terminal, podemos ver esta linha de informações que diz, servidor em execução e, em seguida, endereço HTTP. Isso nos diz que o esboço do Canvas cumprimentou o servidor HTTP local e podemos abri-lo em nosso navegador Então, agora, em vez de clicar duas vezes no arquivo HTML para abri-lo, vamos visitar a página da web Mas esta página da web não está no terminal, está apenas em nossa máquina. Copie e cole na barra de endereço. E aqui está nosso esboço. É um grande quadrado branco. Vamos dividir a tela novamente, metade para o editor e metade para o navegador. Agora, se mudarmos o estilo do campo para azul, podemos ver que não precisamos mais atualizar a página. O cache do Canvas está fazendo isso automaticamente. Se observar as alterações no arquivo GS e atualizar a página sempre que a salvarmos, poderemos continuar de onde paramos em nosso hellos Podemos copiar nosso loop aninhado e colá-lo aqui. Só precisamos ajustar algumas coisas. Podemos ver que a largura e a altura já são usadas como parâmetros, então precisamos escolher nomes diferentes para nossa variável. Vamos substituí-lo por W e altura por H. Agora, revertemos o preenchimento do estilo para branco e lá está nossa grade para retângulos novamente. Eles são bem pequenos porque nossa tela agora é muito maior do que era antes. Então, vamos mudar a dimensão de volta para 600 por 600. Agora, isso parece muito familiar. Uma das características mais legais do Canvas sketch para mim é que podemos ver tudo o que desenhamos Ao pressionar o Controle S ou o comando S, gera um PNG a partir do Canvas e, por padrão, salve-o nas pastas de downloads. Podemos alterar a pasta de saída e usar a que criamos para este curso. Vamos voltar ao nosso terminal e pressionar Control C ou Command C para interromper a tarefa atual e recuperar o prompt Agora pressione a seta para cima para voltar ao último tipo de comando. E aqui, em vez de Dadu, queremos a saída do traço e a configuramos para a saída da barra dianteira Agora, nosso esboço está sendo executado novamente e, se pressionarmos Control S ou Command S, o arquivo vai para nossa pasta, saída 01, e aí está Outra grande vantagem do Canvas sketch é que ele facilita o uso de outras dimensões Digamos que queremos imprimir nosso esboço no formato A four, podemos substituir nossas dimensões por string Um quatro, e como estamos imprimindo, também precisamos de uma maior densidade de pixels. Portanto, podemos usar 300 pixels por polegada. Podemos mudar a orientação do papel e usar a paisagem. Todas essas configurações estão disponíveis na documentação do Canvas sketch Você provavelmente notará que nosso esboço quase desapareceu quando alteramos as densidades de pixels E isso é porque estamos usando números codificados aqui. Podemos tornar nosso esboço mais dinâmico tornando esses números em relação ao tamanho da tela Precisaremos defini-los como porcentagem. Então, queremos preparar isso para o Instagram. Precisamos mudar nossa dimensão para 1080 por 1080. Nossa largura, que agora é W, usa como 60, que é 10% de 600, então podemos configurá-la para o tempo de largura 0,10 E agora é sempre 10% de qualquer que seja a largura da tela. E podemos fazer o mesmo para a altura, 10% GAAP foi 20, que é cerca de 3%, então seria vezes 0,03 E para X e Y, poderíamos criar uma variável para substituir esse número 100 aqui embaixo. Então, x para X inicial e Y para Y. Cem dividido por 600 é cerca de 17%, e então precisamos substituí-los dentro do loop Isso compensa os valores aqui embaixo, pois o menor quadrado também pode vir de uma variável Então, vamos criar um cancelado. Costumava ser 16, o que representa cerca de 2% do vento. Na verdade, não estamos procurando valores exatos. E agora precisamos substituir esses números divididos por dois e depois desativados e desativados. Também precisamos alterar a linha com ela, que costumava ser quatro, mas podemos torná-la um pouco mais grossa e configurá-la para 1% da largura Agora podemos pressionar Control ou command para salvar algumas variações e dar uma olhada em nosso primeiro esboço em nossa pasta de saída Se algum dos conceitos que vimos até agora ainda não estiver claro, não se preocupe. Veremos muitos outros exemplos neste curso. 8. Aprenda sobre o Transform: Nesta lista, vamos começar um novo esboço, e o resultado final ficará assim Para conseguir isso, precisamos aprender sobre a transformação do Canvas e o estado do contexto. Vamos cavar. Vá começar um novo esboço. Então o terminal ainda está aberto na pasta do projeto, vamos digitar Canvas sketch sketch 02, Isso criará um novo arquivo chamado sketchs dot gs. Você também pode criá-lo com um novo. Você não precisa colocar o dash Open. E abrir é apenas uma nova guia no navegador. Podemos abrir o esboço 02 em nosso editor, e ele se parece exatamente com o esboço 01 quando o criamos Vamos alterar as dimensões novamente para 1080 por 1080 e também dividir a tela E começaremos desenhando algo familiar, um quadrado preto. Então, primeiro defina o estilo de preenchimento para preto. Em seguida, o ponto de contexto inicia o caminho. Context dot rect, e vamos passar X, Y, W e quais são as variáveis que vamos criar em segundos e, em seguida, preenchimento de pontos de contexto E agora precisamos que o custo X seja igual a zero, custo Y seja igual a zero e o custo W seja o mais largo e possa ser 30% do maior da Portanto, largura vezes 0,0 e custo , que é 30% da altura da nossa tela Salve isso e teremos nosso quadrado preto. Agora, se você quiser movê-lo, há duas maneiras de fazer isso. Primeiro, já sabemos que só precisamos alterar o valor de X e Y aqui. A outra forma é transformar o contexto em si. Nesse caso, com context dot translate, ele traduz o contexto por X e Y. Agora eu desenho o retângulo O resultado é o mesmo, mas há uma diferença fundamental. Eu posso fazer uma metáfora com papel e caneta. Uma está movendo a caneta enquanto o papel permanece imóvel, e a outra está movendo o papel enquanto a caneta permanece parada. Se todas as transformações que queremos fazer são apenas tradução, não há grande diferença cada um desses métodos que usamos Mas se quisermos aplicar mais transformações como rotação ou escala , isso faz a diferença. Você pode ver isso bem claro se tentarmos alternar o contexto Deixe-me voltar a usar X e Y no Direct e comentar essa chamada de tradução Agora, queremos chamar a rotação do ponto de contexto e passar por um ângulo pequeno, como 0,3 É verdade que giramos o quadrado, mas também o movemos um pouco Podemos ver que o ponto de ancoragem da rotação estava fora do quadrado Na verdade, estava aqui no canto superior esquerdo da tela porque é aqui que está a origem. Isso era equivalente a girar o papel e depois mover a caneta Agora, se movermos o papel em vez disso ou se traduzirmos o contexto antes de girá-lo e depois desenharmos o quadrado de zero, zero Podemos ver que a rotação aconteceria do canto superior esquerdo do quadrado, não da tela. Então, agora o ponto de origem estaria aqui em cima. E é aí que vemos a vantagem de usar transformações de contexto Nosso quadrado parece um pouco estranho, como este girado do canto superior esquerdo Parece que foi rosa para uma parede. Ficaria melhor se fosse girado do centro, X e Y já estão no centro da tela Então, precisamos começar a desenhar o quadrado menos metade de sua largura e menos metade de sua altura E, claro, não há diferença entre dividir por dois ou multiplicar Então, para manter a consistência com nossa variável aqui em cima, vamos multiplicar isso por 0,5 Uma coisa a ter em mente sobre essa transformação é que elas são cumulativas Estamos mudando o estado do contexto quando movemos e giramos o papel, ele permanece lá Se desenhássemos outra forma, ela começaria de onde saímos. Vou te mostrar um exemplo rápido. Primeiro, vou traduzir o contexto por 10400 e depois desenhar um círculo. R Se nossa intenção fosse girar o círculo junto com o quadrado, isso teria sido perfeito Mas se quiséssemos apenas o círculo em X 100 e Y 400, teríamos que voltar atrás e reverter toda a nossa transformação anterior, que rapidamente se tornaria inevitável. Em vez disso, o que podemos fazer é redefinir o estado do contexto. Funciona assim. Primeiro, salvamos o estado atual, depois fazemos nossas transformações e depois restauramos o estado em que salvamos antes Então, primeiro, salve os pontos do contexto e depois a restauração dos pontos do contexto. E agora vemos nosso círculo com origem em 10400. Na verdade, não precisamos do círculo foi apenas um exemplo rápido. De agora em diante, vamos usar muito isso. Quase todas as transformações que vemos ocorrerão em blocos como esse, começando com um cofre e terminando com uma restauração. Agora, você está familiarizado com as traduções. Na próxima lição, continuaremos aprendendo sobre transformação, rotação e um pouco de trogonometria 9. Aprenda sobre ângulos: Nesta escuta, vamos nos concentrar nas rotações. Vamos ver como converter ângulos de graus em radiância e usar um pouco de triognometria para distribuir formas ao redor para distribuir formas ao Gente, não se preocupem com o esquema de cores porque estou usando uma versão antiga de texto sublime É a mesma coisa, só que de uma cor diferente. Agora vamos voltar nossa atenção para nosso ângulo de rotação aqui. Este 03 está em radiante, não em graus. Os radianos podem ser confusos para algumas pessoas. Podemos aprender como usá-los e nos acostumar a calcular coisas com brilho Mas geralmente é mais conveniente trabalhar com diplomas e, na verdade, é muito fácil converter entre eles. Digamos que quiséssemos girar nosso quadrado 45 graus para obter o equivalente em brilho Só precisamos dividi-lo por 180 e multiplicá-lo pelo ponto matemático pi Essa fórmula é muito útil e talvez a queiramos novamente. Podemos convertê-lo em uma função para que não precisemos escrever a mesma coisa várias vezes. Vou chamá-lo de Dog to Rad. Ele tomará como parâmetro o ângulo em graus. Em seguida, retorne um grau dividido por 180 e multiplicado por Pi Então, agora podemos usar apenas o ângulo em graus. Com isso pronto, podemos tornar nosso esboço um pouco mais interessante Primeiro, vamos tornar nossa forma menor, como um retângulo muito estreito E o que eu quero fazer é distribuir essa forma ao redor do círculo, como as horas em um relógio. Precisamos de uma variável para o número de cópias da forma. Vou chamá-lo de num e configurá-lo para 12. Então, precisamos de quatro loops rodando 12 vezes e colocando nosso código de desenho dentro dele. Agora precisamos alterar o ângulo de rotação com base no índice do loop. Se imaginarmos uma pizza e a cortarmos em 12 fatias, qual é o ângulo de cada fatia A pizza é um círculo, então 360 graus divididos pelo número de fatias. Com um pouco de matemática rápida, podemos dizer que isso vai ser 30 graus. Mas lembre-se de que queremos esses ingredientes, então precisamos usar nossa função para convertê-los. Esse é o tamanho da fatia e, para o ângulo real, precisa de outra variável O ângulo de custo será dividido vezes I. Isso será zero e depois 30 graus e depois 60 graus e assim por diante E então precisamos usar isso em nosso contexto, rotação de pontos. E temos uma pequena forma de estrela. Agora, para colocar esse traço ao redor do círculo como um relógio, precisamos de um pouco de trigonometria trigonometria trata da relação entre os lados e os ângulos dos triângulos está além do escopo Ensinar trigonometria está além do escopo desta lista Mas podemos refrescar nossa memória rapidamente. Aqui está uma animação para ajudar. Aqui vemos que o ângulo está aumentando com o tempo e o cosseno do ângulo está subindo e descendo em um intervalo fixo O mesmo vale para o seno dos ângulos, e podemos ver que há um deslocamento entre o seno e o cosseno, ambos Então, primeiro de tudo, precisamos uma nova variável para o raio do nosso círculo, que será com vezes 0,3 E então, como teremos X e Y diferentes para cada forma, podemos renomear nossos X e Y existentes para C X e C Y para serem o centro do nosso círculo E então declaramos X e Y novamente desta vez com a esquerda porque vamos modificar seu valor dentro do loop, e é aí que usamos o seno e o cosseno Vamos colocar X no centro do círculo. Veremos X mais o raio do círculo multiplicado pelo seno do Então, matematize o ponto seno e o ângulo entre parênteses. Em seguida, uma expressão similar para Y com C Y mais raio multiplicado pelo cosseno do ângulo Isso é quase o que queremos. Só precisamos que o traço gire ao contrário. Portanto, precisamos que o contexto gire para o ângulo negativo. E aqui está nosso relógio. E podemos alterar o número das fatias para o que quisermos. Vou manter 12 por enquanto. Uma coisa que você deve ter notado é que estamos adicionando CX e C Y a X e Y. Também podemos dividir isso em duas chamadas para traduzir Nesse caso, o resultado final não muda. Eu só estou mostrando isso para você como uma alternativa. Então você pode ver que há um pouco de flexibilidade aqui. 10. Aprenda sobre funções de utilidade: Algumas funções que estamos usando para esse esboço também podem ser úteis para outros esboços Por exemplo, talvez queiramos usar a função para converter graus em radiância novamente. Nesta escuta, mostrarei como paralisar e usar uma biblioteca de funções utilitárias Outra coisa que podemos fazer para tornar nosso esboço mais interessante é brincar com o último tipo de transformação de contexto, que é uma escala A escala usa dois parâmetros, X e Y, e o valor padrão é um. Então, se você não quiser mudar nada, basta passar um. Poderíamos mudar a escala X ou a escala Y. Ou poderíamos usar algum valor aleatório novamente Aqui, com um valor aleatório, às vezes alguns traços são muito finos. E isso é porque o aleatório começa em zero, então isso vai de 0 a 3 Seria bom se eles passassem de, digamos, um para três ou se pudéssemos passar por uma faixa de aleatoriedade. Diga um valor mínimo e um valor máximo. Para fazer isso de 1 a 3, teríamos que multiplicar aleatoriamente por três menos um e depois adicionar um Novamente, essa é outra fórmula útil que talvez queiramos usar novamente e podemos criar uma função quatro Vou chamá-lo de rancho aleatório, e ele usará dois parâmetros, menos e MX, e retornará um ponto matemático aleatoriamente vezes, máximo menos mínimo E então podemos substituir essa expressão pelas ramificações aleatórias um e três, que são muito mais intuitivas e fáceis de ler. Antes de continuarmos com nosso esboço, quero mencionar que funções úteis como essa não são úteis apenas para Na verdade, é muito comum nos depararmos com cenários em que fizemos coisas assim Uma coisa que poderíamos fazer é criar uma biblioteca mínima de funções utilitárias como essa e usá-las em esboços, mas não somos os primeiros a ter essa ideia e bibliotecas como essa já existem Na verdade, a biblioteca em que estamos usando o Canvas a sketch tem uma biblioteca irmã chamada Canvas Sketch Ut e tem uma coleção dessa função útil Vamos dar uma olhada em um aleatório. Este é um invólucro que contém várias funções aleatórias utilitárias, incluindo uma chamada ranch, que faz exatamente o mesmo que a função de ramificação aleatória que acabamos Além disso, se você voltar à página anterior e clicar em Matemática, também encontraremos Decor vermelha e outras, é claro, que podem ser úteis mais tarde. Então, em vez de escrever nossas próprias funções, podemos importá-las do Canvas Sketch UTO Primeiro, precisamos instalá-lo. Então, vamos voltar ao nosso terminal e pressionar Control C ou Command C para interromper o processo atual. Em seguida, digite NPM stall Canvas sketch UTL Quando terminar, podemos pressionar a seta para cima para voltar ao nosso comando anterior e podemos nos livrar do traço u e d abertos porque já saímos desse esboço e ele já está aberto em nosso navegador e Então, só queremos executá-lo novamente. Agora, de volta ao código e, na parte superior do arquivo, queremos importar matemática e aleatoriamente. Portanto, matemática C é igual a require Canvas sketch Uth math e a mesma para aleatória Custo aleatório, corte aleatório. E então podemos substituir nosso baralho vermelho pelo baralho matemático por vermelho e nosso galho aleatório por rancho de pontos aleatórios Nada deve mudar em nossa produção. E podemos até mesmo excluir as funções que criamos anteriormente ou simplesmente deixá-las lá, caso você queira consultá-las posteriormente. Então aí está. Agora temos uma biblioteca de funções utilitárias prontas para uso em esboços futuros Na próxima escuta, passaremos a usar arcos e versus aleatórios para criar mais visuais A 11. Aprenda a criar arcos: Conclua a aparência do nosso esboço. Vamos adicionar mais algumas formas para torná-lo mais interessante. Vamos usar novamente a função de arco que vimos antes. Desta vez, não para desenhar um círculo completo, mas para desenhar um arco real. Vamos dar uma olhada. Vamos precisar de outro conjunto de transformação diferente dos que estamos usando aqui. Portanto, precisamos de outro bloco de salvamento de pontos de contexto e restauração de contexto. Aqui, queremos traduzir para o centro do círculo. Então veja X e veja Y. E também rotacionado pelo ângulo negativo E então começamos a desenhar uma nova forma. ponto de contexto inicia o caminho. Ponto de contexto. Traçado de pontos de contexto para os arcos X e Y, podemos começar em zero, zero, mas no raio podemos usar nossa variável de raio ângulo inicial pode ser zero e o ângulo final pode ser fatiado Eu disse que não desenhamos um círculo completo, mas acabamos com um. A diferença é que desta vez somos sorteados, é fatia por fatia Podemos ver que, se tornarmos a fatia um pouco menor, digamos, vamos multiplicar o ângulo final por 0,6, por Também podemos alinhar o arco com o traçado usando um ângulo inicial negativo e um ângulo final positivo Vamos usar -0,3 e 0,3 positivo. Também pode tornar os arcos um pouco mais grossos alterando a linha de contexto com, vou defini-la como 20 Agora, com isso estabelecido, tudo se resume a ajustar os valores para obter uma saída visual interessante Eu gostaria de jogar primeiro com a escala dos golpes. Podemos alterar o intervalo da escala X para 0,1 e dois. E também mexa com a escala Y e defina o intervalo para 0,2 e 0,5 Também varie a espessura dos arcos, então defina a linha com ela para variar de 5 a 20 Também quero compensar um pouco o traçado para que eles não fiquem tão bem alinhados Como o contexto já está rotacionado, posso fazer isso alterando a posição Y do reto Então, em vez de apenas menos metade da altura, poderíamos dizer chave de pontos aleatória, de zero a menos metade A mesma ideia também funcionaria para os arcos, mas só precisamos definir o intervalo para a variável de raio Chave de pontos aleatória de algo menor que o raio original, como 0,7, para algo maior que o raio original Ou podemos escrever isso de uma forma um pouco mais curta com tempos de raio, intervalo aleatório de 0,7 a 1,3, o que provavelmente é mais fácil de ler Podemos fazer algo semelhante e também adicionar alguma aleatoriedade para os ângulos inicial e final A fatia vezes o intervalo de pontos aleatórios de zero e -0,5. E então corte o galho aleatório de zero e 0,5. Acho que podemos tornar esse efeito muito mais exagerado. Podemos usar alguns números maiores. Então, em vez de 0,5, vamos usar apenas cinco. E em vez de começar do zero, sempre podemos desenhar pelo menos uma fatia Ou até mesmo empurre ainda mais o amargo ou faça com que um dos lados seja maior que o outro, como menos oito para o ângulo inicial E, novamente, poderíamos aumentar o número de fatias para tornar isso um pouco mais complexo. E aí está. Esse é o nosso esboço. Eu acho que ficou bom. Espero que você concorde. Obviamente, podemos atualizar a página para ver algumas variações e também podemos salvar a saída como imagem, assim como fizemos com o esboço Primeiro, precisamos voltar ao nosso terminal, pressionar Control C, Command C, seta para cima e abrir a saída, saída 02. E agora, de volta ao navegador, pressione Control S ou comando para salvar algumas variações. Obviamente, os números que eu estava usando aqui não são números finais. Eu estava apenas experimentando os valores. Eu encorajaria você a jogar com os números, experimentar valores diferentes, talvez até mesmo tentar linhas em formas diferentes. E na próxima lição, vamos começar um novo esboço. 12. Aprenda sobre objetos e classes: Talvez você se lembre, nas lições anteriores, que usei a palavra objeto em alguns tipos. É hora de examinarmos isso mais de perto. Primeiro, precisamos criar um novo esboço, ir até o terminal e inserir Canvas sketch, sketch 03 dot gs e Em seguida, abra o esboço 0.3 no editor e altere a dimensão para 1080 por 1080 Agora vamos falar sobre objetos. Não examinamos os objetos em detalhes até agora, mas os usamos esse tempo todo. O contexto é um bom exemplo de objeto. Ele tem propriedades como estilo de campo Context dot e métodos como Context dot feel rect, outro exemplo de um objeto muito mais simples do que Context é nossa configuração É um objeto com uma única propriedade chamada dimensões. Podemos dizer como um objeto porque ele começa e termina com os colchetes E dentro dela, encontramos um par de chave e valor. Lembre-se de que, para matrizes com colchetes, os valores são separados por vírgulas Seus objetos são semelhantes. Quando sempre temos um nome de propriedade ou uma chave, então Colin and a Vallow, vamos escrever um Ponto constante igual a chamar os colchetes, X 800 e Y 400. Este é um objeto simples com duas propriedades X e Y. Se você desenhasse isso como um pequeno ponto na tela, poderíamos fazer contexto dot start Path, depois contextualizar ponto arco, ponto X, ponto Y, raio dez, zero MPI Em seguida, defina o estilo do campo como preto e chame-o de preenchimento. Como somos nós que estamos abandonando esse objeto, não precisamos parar aqui Podemos dar a ele quantas propriedades quisermos. Por que não atribuir a ele também uma propriedade de raio? Agora, isso está se tornando um pequeno objeto útil. Se quiséssemos desenhar mais pontos na tela, poderíamos usar mais cópias dela, e isso nos leva a outro conceito de programação chamado classes. As aulas são receitas para criar objetos. Sempre que precisarmos de várias instâncias de um objeto com as mesmas propriedades, podemos usar classes para criá-las. Na verdade, mesmo quando não precisamos de várias instâncias, as classes ainda são úteis para organizar o código em entidades distintas. Vamos escrever uma classe para nosso pequeno objeto pontual. Podemos ir até o final da nossa aula de preenchimento e digitação. Abra e feche os colchetes encaracolados. Por convenção, o nome da classe geralmente começa com uma letra maiúscula Agora, um método muito importante de uma classe é o construtor Isso é o que vamos construir com um novo objeto quando o criarmos. E podemos passar parâmetros para o construtor. No nosso caso, quatro pontos, queremos X e Y e raio Agora precisamos definir a propriedade X, Y e raio. E para isso, precisamos de outra palavra especial chamada assim. A palavra isso significa que estamos nos referindo ao escopo dessa classe. Como sempre, faz mais sentido com um exemplo. Então, deixe-me digitar algo aqui. Esse ponto X é igual a X. Aqui estamos dizendo que o ponto da classe contém uma propriedade chamada X e estamos definindo seu valor para um parâmetro que vamos passar para o construtor Esse ponto X é apenas um valor, pode ser zero. Pode ser uma pizza, mas estamos configurando-a para o parâmetro X onde passamos. Caso isso ainda não esteja claro, fará sentido em um minuto quando criarmos um objeto usando nosso ponto de classe. Por enquanto, basta fazer o mesmo as outras duas propriedades que estamos passando. Agora, vamos criar um novo ponto. Em vez disso, vamos digitar um novo 0.800, 410. Os valores são os mesmos e os resultados são os mesmos. Mas desta vez criamos um ponto usando uma classe. Agora estamos prontos para criar mais pontos. Vamos renomear isso para o ponto A. E então criar um ponto B com X 300 e Y 700. E então duplique essas linhas e também desenhe o ponto B. Espero que esteja claro agora com este exemplo Estamos criando dois objetos que são extensores da classe de pontos e ambos têm a mesma propriedade e a mesma estrutura Com isso em mente, podemos começar a criar nosso esboço. Primeiro, quero mudar algumas coisas. Quero separar o ponto do ponto em que estamos desenhados na tela. Acho que esse ponto pode ser outra entidade com mais do que apenas uma posição e um raio Então, vou criar outra classe para ela e vou chamá-la de Agente. Sua primeira propriedade será uma posição ou apenas uma pausa, e a pose pode ser um novo ponto Eu acho que o ponto deveria ter apenas X em Y. Ele não precisa de raio lá Poderíamos trazer o raio para o agente e deixar o ponto apenas como dados de posição e , em seguida, usar o agente para qualquer coisa que quisermos desenhar Já podemos dar ao raio um valor de dez e, para as posições X e Y, podemos passá-los em parâmetros. Agora podemos renomear nossos pontos e chamá-los de agente A e agente B. E remover o terceiro perímetro porque não precisamos mais passar pelo raio Então, para nos afogarmos, podemos trazer esse código para nossa classe. Vamos copiar isso e criar um novo método em nossa classe de agente chamado draw. Podemos colá-la aqui e depois mudar X para esse ponto por ponto X, e conectar para esse ponto pos ponto y. E o raio para esse raio de ponto Também precisamos passar como parâmetro referências ao contexto. Depois, para desenhar os agentes, podemos excluir o que tínhamos antes e chamar o agente A dot draw e o agente B dot draw. Até agora, o visual não mudou, mas estamos configurando nosso código para poder fazer muito mais Vamos tirar mais cópias desses agentes. Podemos criar uma matriz vazia chamada agentes. Em seguida, crie um loop para preencher a matriz com, digamos, 40 agentes Agentes que enviam novos agentes X e Y. Precisamos criar X e Y, então conste X e CY, e eu quero que sejam valores aleatórios Então, precisamos da nossa função de ramificação aleatória novamente. Vamos importá-lo do Canvas sketch. Você também. Então X será um valor aleatório entre zero e largura, e Y entre zero e altura. E agora, para desenhar o agente, só precisamos de mais algumas linhas. Podemos examinar cada item em nossa matriz com o ponto do agente para H. O primeiro parâmetro é o próprio agente. E podemos chamá-la de linha de pontos envelhecida e passá-la com contexto. Ainda não estamos vendo nada, então deve haver um erro em algum lugar. Vamos dar uma olhada no console. Control Shift I ou comando shift I. Há um erro aqui que diz que a erva daninha não está definida e também diz que está acontecendo na linha 12. E isso porque Wt só é definido aqui. Ainda não temos a variável wit fora dessa função, mas essa é outra coisa boa do esboço compactado Essas propriedades iniciais também estão disponíveis na função de esboço Então, podemos simplesmente copiar esse parâmetro e colá-lo aqui. E agora vemos todos os nossos 40 agentes. Agora temos nossos 40 agentes na tela. Na próxima lição, mostrarei como animá-los. 13. Crie uma animação: Nesta lista, continuaremos desenvolvendo nossos agentes e começaremos a animá-los pela tela Antes de apresentarmos um pouco de comportamento aos nossos agentes, sugira algumas coisas. Primeiro, quero dar a eles um raio variável, um Vallow 4-12 aleatório E aqui, em vez de desenhar o arco na pausa X e na pausa Y, quero usar o que aprendemos na lição anterior e traduzir o contexto Então, context dot save, context dot translate, pause X e pause Y. então altere isso E não se esqueça de chamar Context dot restore no final. Também acho que os agentes ficariam mais bonitos com um traço preto e preenchidos com um branco Assim, podemos remover o estilo de preenchimento preto e manter o valor de branco que configuramos aqui. O traçado padrão já é preto, então só precisamos chamar fill e depois stroke. A última coisa aqui é tornar o traçado um pouco mais espesso com a linha de pontos de contexto e defini-lo como quatro Agora queremos fazer com que nossos agentes se movam. Podemos dar a eles uma nova propriedade chamada velocidade ou VL. Essa propriedade também precisa de um valor X e Y, portanto, pode ser outro ponto. Nesse caso, a palavra ponto não deve mais ser educada. Não há problema em chamar a posição de um ponto. Mas dizer que a velocidade é um ponto é um pouco estranho. Precisamos considerar outro nome para nossa classe. Acho que um bom nome para isso seria vetor. Isso é um pouco de refatoração. Precisamos mudar o nome em alguns lugares, e isso é bastante comum na programação. Não é um problema reavaliar seu código à medida que você progride e mudar as coisas que você escreveu anteriormente Agora podemos dar à nossa velocidade alguns valores aleatórios de X e Y. Ambos podem ser organizados de menos um para um. E então, para usar a velocidade, é bem simples. Só precisamos adicionar a velocidade à posição, e podemos fazer isso em um novo método chamado update Esse ponto x mais é igual a esse ponto l ponto X. E, novamente, o mesmo para Y. Agora, dentro do nosso Loop, pouco antes Agent Draw, chamamos de agent dot update Bem, mas nada está mudando. Isso porque desenhamos apenas um número primo em nosso esboço. Se você quiser animar, precisamos especificar isso na configuração Animate Agora, essa função aqui está ficando fria toda vez que o navegador está pronto para repintar a tela Devemos acontecer a 60 quadros por segundo. Essa propriedade animada é muito útil, como muitas outras coisas no Canvas Mas também quero mostrar como obter algo assim sem o Canvas sketch. Vou escrevê-lo como um exemplo rápido e podemos até mesmo excluí-lo depois. É só para você saber que ela existe. Vamos criar uma função fictícia e também chamá-la de animate. Dentro dele, vamos apenas registrar algo no console. Diga visual. E então precisamos chamar uma função de janela do navegador chamada quadro de animação de solicitação, que o navegador aciona sempre que estiver pronto para pintar outro Como parâmetro, passamos a função que queremos que seja chamada iver frame Nesse caso, será nossa função animate. Depois, basta ligar para o Animate uma vez e ver o que acontece Vemos o visual da mensagem sendo registrado várias vezes. Então, aqui o animate faz alguma coisa e, em seguida, solicita o próximo quadro, que então aciona o animate novamente. E isso cria um loop animado. Internamente, é isso que o Canvas sketch está fazendo quando passamos pela animação E a função que isso causa é essa aqui. Podemos excluir isso agora e voltar para nossos agentes. Ou se você quiser deixar aqui para uma referência, basta comentar na chamada para animar. Você deve ter notado que nossos agentes tendem a desaparecer da tela se deixarmos o esboço rodando por um tempo Isso porque eles não sabem nada sobre os limites da nossa tela. Poderíamos dizer a eles que se recuperem quando atingirem os limites Então, vamos criar um novo método para nosso agente chamado bounce. E precisamos passar com largura e altura. Em seguida, escrevemos uma condicional se esse ponto de pose X for menor ou igual a zero, ou se essas duas barras verticais significarem lógica ou algo assim, ou se esse ponto de pose de ponto x for maior ou igual O que queremos fazer é inverter a velocidade. Então, diabos, ponto x vezes é igual a menos um e, em seguida, exatamente o mesmo para Y Em nosso loop, logo após Update and brow, chamamos o agente toot Bounce Width Agora podemos ver que eles não funcionam mais de qualquer maneira e permanecem dentro do nosso esboço. Ok, agora temos agentes de mudança. Em seguida, vamos conectá-los com linhas. 14. Conecte agentes com linhas: Ah, nesta lista, vamos conectar nossos agentes às linhas e, para fazer isso, precisamos de um pouco mais disso Vamos revisitar uma fórmula familiar para encontrar a distância entre eles. O PitágorTom. Vamos precisar do Nistd for loop. Você deve se lembrar de ter escrito um em nosso primeiro esboço. Isso significa um para um loop dentro do outro. Para I igual a zero, I menor que o agent dot Link e, dentro do primeiro loop, queremos armazenar o agente como uma variável. Agente igual aos agentes, colchetes I. Em seguida, o segundo loop usando G como índice E também queremos armazenar o agente aqui como uma variável. Vamos chamá-lo de “ outro é igual a dois agentes”, G. Então, para cada agente, examinamos todos os outros Agora, para desenhar a linha, precisamos usar dois métodos. Mova dois e linha dois. Primeiro, começamos com um novo caminho, o caminho inicial do Contactt. Em seguida, movemos nossa caneta para o início da linha com o ponto de contexto e movemos dois. E vai envelhecer ponto a ponto e envelhecer ponto a ponto y. Então precisamos contextualizar ponto a linha dois e passar o final da linha, que será um ponto por ponto X. Outra pausa de ponto ou Y. E então entre em contato com Dot Stroke . E então entre em contato com No momento, temos 40 agentes. Então isso significa 40 vezes 40, o que é 1.600 iterações em cada quadro. Isso é bom. O computador pode fazer isso, mas é um desperdício porque estamos verificando cada par de agentes em termos de inteligência Por exemplo, quando I é zero, ultrapassamos G zero, um, dois, três, etc Quando eu sou um, continuamos novamente acima de zero, um, dois, três, então é importante. Apenas o par 01. Somos atraídos por uma linha em cima da outra, uma 0-1 e outra 1-0 E também estamos comparando zero contra zero e um contra um, o que é desnecessário. Podemos melhorar isso com cada mudança simples. Para um G em vez de começar em zero, ele poderia começar em I mais um. Então, agora, quando I for zero, G será um. Quando chegarmos a 38, G será 39, e esse segundo loop só será executado uma vez, porque todos os outros pares de agentes já teriam sido verificados no ponto. Com essa mudança simples, o número de iterações em seu quadro passou de 1.600 para 780 Isso é uma boa melhoria de desempenho. Agora é hora de melhorar o visual. Isso é um pouco intenso demais para o meu gosto. Quero traçar a linha entre os agentes, que estão próximos um do outro, não entre todos eles. Para isso, precisamos de um pouco de matemática. Teorema de Pitágoras, o nome é complicado, mas sua fórmula é muito simples mas Digamos que temos dois pontos no plano D, primeiro encontramos a distância entre eles no eixo X. Vamos chamá-lo de DX. Em seguida, encontramos a distância no eixo Y e a chamamos de DY. Isso nos dá um triângulo retângulo. E o que queremos encontrar é o potenus. pragors nos dizem que essa será a raiz quadrada de alguns dos quadrados dos lados Vamos usar isso em nosso esboço. Podemos adicioná-lo como um método da nossa classe vetorial. Chame isso de obter distância, e passamos em outro vetor. Vou chamá-lo de dx será esse X menos V ponto x dy será esse ponto Y menos V ponto Y. A distância real, que é o que queremos retornar, será MT ponto raiz quadrada, dx vezes dx mais dy vezes Agora, de volta ao nosso loop aninhado, podemos sair de um novo disco frio variável obter a distância entre a pose do ponto envelhecido e a pose do outro ponto Agora que temos a distância, podemos dizer que só queremos desenhar a linha se dist for menor que alguns números Digamos 200, ou podemos fazer o oposto e dizer que, se dist for maior que 200, preocupe com o resto do código dentro do loop Apenas continue. As instruções de continuar dizem: vá para a próxima iteração do loop Então, tudo depois de continuar é ignorado. Isso já parece muito melhor, mas ainda há mais uma coisa que eu quero fazer com isso, que é mudar a linha com ele, baseá-lo na distância. Quero que as linhas sejam grossas quando os agentes estão fechados e fiquem cada vez mais finas medida que se separam Para isso, podemos usar outra função útil do Utils chamada Isso espera uma chave de entrada e uma chave de saída e mapeia o valor entre as Então, mais uma vez, vamos importar o módulo matemático do esboço do Canvas para E então podemos definir a linha com ela com base na distância. De um intervalo de 0 a 200, quando a distância é zero, queremos que a linha seja 12 Quando for 200, queremos que seja um. E lá vamos nós. Eu já mostrei como exportar esboços como imagem, mas desta vez nosso esboço está se movendo, então precisamos exportá-lo como um vídeo E é exatamente isso que vou te ensinar na próxima lição. 15. Aprenda sobre a saída de vídeo: Nosso esboço está concluído e podemos clicar em Controles para salvar alguns quadros Mas como está se movendo, também seria bom exportá-lo como vídeo. Vamos dar uma olhada em como fazer isso com o Canvas sketch. A documentação nos diz que podemos exportar sequências de quadros ou usar o streaming FF NPH, que gera as sequências já codificadas como um Isso é o que queremos fazer. Então, primeiro, precisamos ter certeza de que temos o FF NPH e mantê-lo , e podemos copiar essa linha aqui e colá-la em nosso terminal Mais uma vez, pressione Control C para interromper o processo atual e colar o comando aqui. Global é o mesmo que G que vimos antes. Ele instala os pacotes globalmente, não apenas na pasta atual Quando terminar, seta para cima, mova a nova e a pasta aberta e, em seguida, definimos nossa pasta de saída com saída de traço igual à saída 03 E para streaming, precisamos adicionar o Dash Dash Stream. Agora, nosso esboço está sendo executado novamente e podemos pressionar Control Shift S ou Command Shift S. Isso é para começar a exportar os quadros Depois, aguarde alguns segundos e pressione o mesmo comando novamente. Controle a tecla Shift S para pará-la. Vamos dar uma olhada na pasta de saída e aí está nossa bela animação. Nossa coleção de esboços está crescendo e se tornando mais interessante Vamos criar um novo esboço na próxima lição. 16. Aprenda a criar uma grade: Nesta lista, vamos criar uma grade, mas de uma forma diferente da que fizemos antes Mais flexível e mais eficiente. O resultado final ficará assim. Vamos dar uma olhada. Primeiro, precisamos criar um novo esboço. No terminal, inserimos o Canvas sketch. Pegue 04 novos. Em seguida, divida a tela novamente. Espero esboçar 04 no editor e alterar a dimensão para 1080 por 1080 Podemos começar declarando algumas variáveis para descrever nossa nota Queremos quatro colunas e três linhas. O número total de células será chamado de linhas de vezes. Também pode ser armazenado em uma variável com largura da grade, que será 80% da largura da tela E o mesmo vale para a altura da grade, também 80% da altura da tela. Com isso, também podemos encontrar a largura e a altura de cada célula da grade Sell W é igual à largura da grade dividida pelo número de uma coluna. E a célula H é a altura da grade dividida pelo número de linhas. Também podemos encontrar a emergência ao redor da grade, que é a diferença entre o tamanho da grade e o tamanho da tela. Então Marge é igual a Wodith menos a grade W. E como há duas emerginas em uma à esquerda e outra à direita, queremos metade desse W. E como há duas emerginas em uma à esquerda e outra à direita, queremos metade desse valor. O mesmo vale para Marg Y t menos a grade H multiplicada Com isso estabelecido, agora precisamos examinar cada célula da grade para que possamos fazer algo com elas. E para isso, precisamos dos quatro loops. Em vez de usar dois para loops, como fizemos antes, um por coluna e outro para linhas, vamos usar apenas um e calcular coluna e linha com alguns cálculos matemáticos simples Eu sou igual a zero I menor que num sllsi mais mais. Para calcular a coluna, precisamos do operador restante Chamadas equivalem a I, chamadas restantes. Isso retorna o restante da divisão de I por chamadas. Vamos usar o console para testar alguns valores. Começa do zero e as chamadas são quatro. Então 44 é igual a zero, quatro é igual a um, depois E quando chegamos a quatro, o restante volta a zero. Em seguida, cinco de volta para um. Portanto, enquanto o valor de I está aumentando nas etapas de um, o valor do núcleo é modulado de 0 Então, será zero, um, dois, três, 01, dois, três, que é exatamente o que precisamos para encontrar as células da grade no eixo X. Agora, para encontrar a linha, a lógica é um pouco diferente. Pode ser tentador fazer algo semelhante e usar o operador restante novamente Desta vez, usando o número de linhas, mas elas apareceriam aqui Porque enquanto o I está aumentando, estamos nos movendo da esquerda para a direita. Então, para encontrar o final da linha, precisamos verificar os números das colunas. Podemos fazer isso com o fluxo de pontos matemáticos. Eu o divido por cols. Novamente, vamos usar o console para testar. 0/4 é zero, 1/4 é 0,25 e, em seguida, se reduzirmos o valor, ou seja, se o arredondarmos para o número inteiro mais próximo, isso o número inteiro mais próximo, Dois também dão 03. E então chegamos a quatro, isso nos dá um e cinco também é um. Isso nos diz que a cada quatro etapas, o valor da linha é aumentado em um, que é o que precisamos para encontrar as células de notas no eixo Y. A próxima etapa é encontrar os valores X e Y de cada célula usando linha e CO. X será chamada multiplicada pela célula , W e Y será multiplicado pela célula. Vamos desenhar uma linha dentro de cada célula, e eu quero que elas sejam um pouco menores que a Então, vou criar alguma outra variável para largura e altura. W será 80% da célula W e H 80% da célula agora que estamos prontos para desenhar. Comece com o salvamento do contexto e a restauração do contexto. Em seguida, traduzimos o contexto por X e Y. Em seguida, o contexto começa, o caminho e o ponto do contexto se movem dois, e queremos menos metade da largura da linha E então a linha de contexto dois, metade da largura da linha. E, finalmente, o contexto influencia. Podemos ver algo agora, mas ainda não parece certo. Precisamos levar em consideração nossas fusões ao traduzirmos os contextos Poderíamos adicionar março X e mar Y a X e Y. Ou poderíamos adicionar outro carvão para traduzir Isso é um pouco melhor , mas ainda não está certo. O problema é que estamos desenhando as linhas do centro de cada célula da grade, mas estamos apenas traduzindo a origem para o canto superior esquerdo de cada célula Portanto, também precisamos de outra tradução para o centro da célula. Tradução de pontos de contexto, célula W vezes 0,5 e célula H vezes 0,5. Agora, esse visual está certo. Aqui, estamos usando três chamadas para traduzi-lo, apenas para que eu possa mostrar o que cada etapa está fazendo. Mas se preferir, você também pode adicionar esses volumes diretamente a X e Y e chamar translate uma vez Vou deixar isso para você por enquanto. Agora que podemos ver nossa grade, vamos mudar a linha com ela para quatro e aumentar o número de linhas e colunas para dez Então, desta vez, usamos o método Smarter para criar uma grade, mas essa é apenas uma grade plana Na próxima lição, adicionaremos um pouco de aleatoriedade a ela 17. Manipulação de formas com ruído: Para tornar nosso esboço mais interessante, vamos adicionar alguma aleatoriedade a ele. Mas desta vez vamos usar números aleatórios diferentes, vamos usar ruído. A função Generate é uma ferramenta essencial no cinto de utilidades de um codo criativo Em essência, isso nos permite controlar a aleatoriedade. O algoritmo de ruído clássico foi saudado por Ken Perlin em 1983 e é conhecido como ruído Perlin Vou postar um link para a página com uma boa explicação de como funciona se você quiser saber mais sobre o algoritmo. O que vamos usar em nosso esboço é uma variação diferente chamada Simplex noise e publicá-la em 2001 Aqui vemos uma apresentação visual de um ruído, mais especificamente um ruído de três D em um plano de dois D. Os valores de cinza são números que variam 0 a 1, onde zero é preto e um é branco Podemos ver que as garrafas não são completamente aleatórias o tempo todo, como a estática da TV. Em vez disso, eles parecem fluir bem um para o outro. Neste exemplo, vemos Pa diferentes níveis de zoom do mesmo ruído. Eles estão todos se movendo na mesma velocidade, mas suas escalas são diferentes ou suas frequências são diferentes de muito granulares a muito suaves Agora que temos uma ideia do que é ruído, vamos usá-lo em nosso esboço Como você deve ter adivinhado com base no que vimos até agora, já existem bibliotecas de ruído que podemos transmitir em nosso código E, mais uma vez, o Canvas sketch já torna isso bastante conveniente para nós Se voltarmos para a página aleatória do Canvas sketch, diremos que podemos ver se você funcionará como ruído usando ruído simplex Uma dimensão, duas dimensões, três e quatro. Então, vamos voltar ao nosso código e verificar isso conforme o custo aleatório exige Esboço em tela, você cortará aleatoriamente. Então, podemos gerar um número aleatório e chamá-lo de N igual ao ruído de ponto aleatório dois D e depois passar X e Y. Podemos usar N para definir o ângulo de rotação das linhas em nossa grade Então, precisamos de outra variável chamada ângulo e, em seguida, defina-a como n vezes o ponto matemático PI. Ruído para D, retorne um número entre menos um e um. Então, quando multiplicamos pelo ponto matemático PI, obtemos o equivalente a 180 graus negativos a 180 graus positivos Para ver isso em ação, precisamos apenas girar nosso contexto por ângulo As rotações são um pouco caóticas, porque os valores de X e Y são muito grandes. A frequência é muito alta. Poderíamos multiplicar X e Y por um número minúsculo como 0,001 Por conveniência, também temos esse terceiro parâmetro opcional aqui chamado frequência, que faz exatamente o mesmo. Então as coisas ficam um pouco menos caóticas, outra coisa que poderíamos fazer é alterar a amplitude para um número pequeno, como Mas isso também mudaria N para estar na faixa de -0,2 e 0,2 em vez de menos um e um Eu quero mantê-lo como menos um para um ou não. Então, vou multiplicar o ângulo por 0,2 em vez disso. E com isso, vemos que as linhas começam a fluir bem Também poderíamos usar o mesmo ruído para alterar a escala das linhas. Vamos criar uma nova variável chamada escala. Novamente, aqui queremos multiplicar e por algum número como 30 O intervalo está entre menos um e um, mas não queremos uma escala negativa Então, aqui precisamos mapeá-lo para um intervalo de 0-1. Existem algumas maneiras diferentes de fazer isso. Uma simples é somar um e dividi-lo por dois. Então, aqui o intervalo seria de 0 a 2. E depois de dividir por dois, seria 0-1. Podemos testar isso rapidamente definindo a linha com ela para escalar. Outra forma que é praticamente a mesma é multiplicar N por 0,5 e adicionar 0,5 Não há diferença aqui. Ainda remapeia e menos um e um para zero e A outra maneira de fazer isso é, obviamente, com a função utilitária que vimos na lição anterior chamada alcance do mapa. Vamos importá-lo aqui do Canvas SketchuTlash. E então mapeie o intervalo, baseando-o em N de menos um e um a um e 30 Em essência, todas essas fórmulas estão fazendo a mesma coisa. O alcance do mapa talvez seja um pouco mais conveniente e também nos permita definir uma escala mínima. Agora vamos de 1 a 30, enquanto antes vamos de 0 a 30. A última coisa que quero fazer aqui é animar os nulos. Já sabemos como animar o esboço. Só precisamos adicionar animação à nossa configuração. Então, se verificarmos a documentação do esboço do Canvas, veremos que uma das propriedades que ela passa para a função de renderização é o número do quadro que está sendo renderizado Então, só precisamos declarar uma moldura aqui. E então podemos usá-lo em nossa função Nuss, T com X mais quadro Agora, isso está se movendo , mas muito lentamente. Podemos torná-lo mais rápido multiplicando o quadro por um número maior, como dez, por exemplo Esse esboço está ficando um pouco mais complexo. Agora, há uma regra para mais variação, e é isso que vamos explorar na próxima lição. 18. Crie slides de interface gráfica: Guarde a melhor parte do processo para o final. Vamos criar um painel de controle com um controle deslizante para ajustar os valores em nosso A biblioteca que vamos usar é chamada de tweak pane e foi desenvolvida por Hiroki Precisamos voltar ao terminal, recuperar a pegadinha e digitar PM I tweak PMI é a versão curta do PM e do SAL que usamos até agora Ambos os comandos são exatamente iguais. Depois de terminar a instalação, seta para cima e execute nosso comando Canvas sketch novamente. Sem D dash new e D dash open. Já que estamos aqui, podemos muito bem abrir uma saída igual às saídas 04. Assim, podemos exportar alguns PNGs posteriormente. Agora precisamos transmitir dor de ajuste. A dor do ajuste de custo é igual à dor de ajuste necessária. Depois de nossa função de esboço, criaremos uma nova função chamada quit pain Aqui podemos armazenar a dor como uma variável e configurá-la para o novo TwickPain dot pain pain Abra e feche parênteses. Então, para verificar se tudo está funcionando bem, precisamos chamar de esboço o quick pain, pouco antes da tela Se você ainda não vê a barra cinza, verifique toda a sintaxe do seu código e verifique também as letras Agora, vemos a barra cinza do Garth aqui no topo, o que significa que a tinta está lá, mas ainda está vazia Então, agora podemos adicionar componentes de interface de usuário a ele. A primeira será uma pasta, que também podemos armazenar como uma variável. Para isso, precisamos de um método de dor chamado Ed folder. Podemos passar um objeto com alguns parâmetros, e uma das opções é o título. Então, a pasta Pine Dot Ed e, em seguida, a grade de título , agora dentro desta pasta, quero adicionar alguns controles deslizantes Podemos fazer isso com um método chamado na entrada. E, como podemos ver aqui no exemplo, precisamos passar um objeto e o nome da propriedade do objeto. Então, primeiro, precisamos criar um objeto para armazenar nossos parâmetros. Vou criá-lo aqui. Fora da função do painel , para que fique visível para nossa função de esboço. Vou chamá-lo de perms, como no exemplo, mas em minúsculas É um objeto. Então , colchetes e, em seguida, as duas primeiras propriedades serão chamadas e linhas, ambas com um Vallo Em seguida, podemos voltar ao CretPN e digitar a entrada dot d da pasta Chamadas de parâmetros e, em seguida, um objeto determinando o intervalo. Vou definir no mínimo dois e no máximo 50 e uma etapa de um e, em seguida, exatamente a mesma para as linhas. Salve isso e teremos alguns controles deslizantes de 2 a 50. A última etapa é fazer com que nosso esboço use esses valores. Só precisamos atualizar nossas chamadas e linhas, variáveis para usar chamadas de pontos perimetrais e linhas de pontos de parâmetros. Agora, podemos modificar nossa grade em tempo real. E se podemos fazer isso com colunas e linhas, por que parar aqui e também adicionar mais controle deslizante para escala, mínima e escala máxima Então, primeiro, o parâmetro, defina o padrão para um e 30, como temos no momento. E então adicione a entrada, escala mínima e desta vez 1-100 E não precisamos especificar essa etapa porque a fração está de acordo com a escala. Copie isso para obter a escala máxima e substitua o valor em nossa função MA Branch. Também podemos manipular os valores de ruído, como frequência e amplitude Vamos criar outra pasta para isso. Ruído do título e, em seguida, adicione a entrada. Média esquisita -0,01, máx 0,01. Duplique a linha do mapa, máximo um e mínimo zero Crie as propriedades dentro dos perímetros. Portanto, o valor padrão de frequência para 0,001 e amplitude para 0,2 Em seguida, substitua-os dentro da função de renderização. Veja o que eles estão fazendo. É mais fácil entender se temos muitas linhas e cones. Isso parece interessante, mas está bem claro que algo está se movendo da direita para a esquerda. Isso porque estamos incrementando o valor de X em nossa função noise two D. Poderíamos substituir isso pela função noise three D e usar a moldura como a terceira dimensão. Vamos tentar isso. Comente isso com o ruído três D e passe o tempo de quadro dez como o terceiro parâmetro. E agora temos um movimento que é um pouco mais orgânico sem uma direção clara. Outra coisa que podemos fazer é definir o número do quadro manualmente para que possamos colocar a animação em um determinado quadro. Para isso, precisamos de dois componentes de interface do usuário. Uma é uma tabela para animar ou não, e a outra como um controle deslizante para definir o número do quadro Em terceiro lugar, primeiro os parâmetros, Animate definido como verdadeiro e o quadro definido como zero Em seguida, a entrada será apenas animada, sem nenhuma opção extra Twig Pain já entendeu que esse é um parâmetro verdadeiro ou falso E outra entrada para um quadro com zero mínimo e máximo 999 Onde usamos o frame? Aqui em cima, vou mostrar como escrever uma expressão condicional em uma única linha Vamos criar uma variável chamada F. Quero que o valor de F seja quadro quando parâmetro animado for verdadeiro ou seja quadro de pontos de parâmetros quando animado for Podemos fazer isso em uma única linha. Esse F é igual ao ponto perimetral animado. Quadro de ponto de interrogação, Collins, quadro de pontos permanentes. Essa é a condicional. Esse é o valor quando a condicional é verdadeira e esse é o s. Ou quando a condicional é Esse tipo de expressão é chamado de operador ternário. Agora, em vez de quadro, usamos F. Vamos tentar isso Até agora, nada mudou. Mas se ativarmos a animação, as notas começarão a usar o valor de um quadro definido pelo A última coisa que quero mostrar aqui é que, como estamos desenhando linhas, também podemos alterar a lacuna entre linhas. Há três valores possíveis: platina, redonda e quadrada. Para selecioná-los em nosso painel, precisamos de outro tipo de componente que é a lista de strings. Primeiro, criamos o parâmetro, chamamos de lacuna de linha e o definimos com o valor padrão, o que é ruim. Em seguida, adicione outra entrada e eu a adicionarei ao topo da pasta da grade. E como terceiro parâmetro, precisamos passar a opção como o painel de ajustes Exemplo, redondo e quadrado. Então, logo após a linha com ele. Definir lacuna de linha de pontos de contexto é igual a lacuna de linha de pontos do parâmetro. Agora temos um menu suspenso e podemos ver como fica com uma lacuna redonda ou quadrada. Espero que você concorde que é muito útil ter esse painel de controle aqui em vez de digitar valores e atualizar nosso esboço. Podemos simplesmente jogar com esse controle deslizante e fazer testes rapidamente Você pode tentar adicionar mais componentes para outros valores que estamos usando, como a velocidade de sua animação ou talvez o comprimento de cada traçado ou outra tabela que alterne entre formas diferentes Digamos que se você quisesse desenhar círculos em vez de linhas, você poderia ter uma tabela para alternar entre eles. Isso é para você explorar. Com um painel como esse, você está criando sua própria ferramenta para ter mais controle sobre seu esboço Um recurso adicional, você encontrará mais informações sobre isso com dor e outro componente. Sinta-se à vontade para usar mais deles e levar o esboço na direção que quiser 19. Aprenda a criar texto: Nesta lição, vamos criar um esboço como esse e, para isso, precisamos aprender sobre texto, como desenhar um texto, como medi-lo e como definir as propriedades de uma fonte Comece um novo esboço, vá até o terminal e digite telas, esboço, seção 05, seção 05, metade da tela para o navegador e metade para o editor de e metade para o Dimensão 1080 por 1080. Nosso objetivo é desenhar uma letra grande no meio do nosso esboço. Para isso, precisaremos de um novo método que ainda não usamos, chamado texto de campo e também de algumas propriedades de texto como essa, que definem a fonte do contexto. Vamos começar definindo o estilo do campo como preto. E então podemos definir a fonte de pontos de contexto igual a 400 pixels Em seguida, podemos usar o texto do campo, que usa três parâmetros. Cadeia de caracteres e coordenadas X e Y. Então, texto do campo de pontos de contexto, em maiúsculas, zero, zero Ainda não estamos vendo nada, e isso se deve a uma propriedade de texto de dados chamada linha de base de texto O valor padrão é alfabético, que significa que o texto está sendo desenhado na parte inferior Para que possamos vê-lo com essas coordenadas, precisamos mudar a linha de base do texto para o topo Ou, se quisermos isso no meio do esboço, precisamos mudá-lo para o meio e depois traduzir o contexto para o centro do esboço Nós já sabemos como fazer isso. Salvamento de pontos de contexto, restauração de pontos de contexto. E o contexto traduz largura vezes 0,5 e altura vezes 0,5. Agora, a letra parece estar centralizada verticalmente, mas não Portanto, precisamos alterar outra propriedade de texto chamada alinhamento de texto O valor que buscamos é o centro. Agora, o glifo parece estar centralizado. Vamos torná-lo maior. Vamos alterar o tamanho da fonte para 1.200 pixels Podemos ver que não está bem no centro. Na verdade, está um pouco errado . O problema é que as fontes são estruturas complexas. Definir a linha de base para o meio não garante que o corpo do glifo seja centralizado, como quando lidamos com a forma primitiva Para fazer isso corretamente, precisamos de mais informações sobre a fonte. Existe um método para isso chamado texto de medida, e a referência da bússola nas três escolas W nos diz que ela retorna a largura do texto Mas esse método realmente faz mais do que isso. Podemos ver que na página equivalente no NDM, aqui está escrito que o texto medido retornou um objeto chamado text Matrix, e a matriz de texto tem uma propriedade chamada largura, mas também tem várias outras Vemos que todas as outras propriedades, exceto Wd, têm esse texto de ícone de laboratório, o que significa que ainda são consideradas uma característica experimental desse objeto. Mas agora vamos rolar um pouco mais para baixo e verificar a compatibilidade do navegador. Mesmo com seu status experimental, maioria deles já é bem suportada pelos navegadores modernos. No início do curso, mencionei que você poderia escolher qualquer navegador que quisesse. E embora isso ainda seja verdade, se você escolher um navegador moderno, poderá ter uma vantagem aqui. Em um navegador antigo, você poderia obter uma boa aproximação, mas teria que julgar a olho nu ao compensar a tradução Em um navegador moderno, podemos ser muito mais precisos usando essas propriedades de matriz. Então, vamos fazer isso. Primeiro, queremos armazenar nossa carta em uma variável, que vou chamar de texto. Então, queremos medir o texto, que também vou armazenar em uma variável chamada matriz. Texto de medição de pontos de contexto, vamos dar uma olhada nos dados dentro da matriz com o console dot log dot Matrix. Os que nos interessam são quatro primeiros que descrevem a caixa delimitadora real Recebemos caixas desenhadas desde nosso primeiro esboço e sabemos que sua origem está no canto superior esquerdo Então, vou comentar o alinhamento do texto no centro e deixar o valor padrão, que é à esquerda, e também reverter a linha de base para o topo E também podemos comentar, traduzir por enquanto. Então, queremos nossas variáveis XY, W e H usuais , mas desta vez para matriz. Vou prefixá-los com X que será o ponto da matriz Caixa delimitadora real à esquerda vezes menos um. Meu sotaque real da caixa delimitadora vezes menos um. E W caixa delimitadora real à esquerda mais a caixa delimitadora real E, finalmente, MH, na verdade acento da caixa delimitadora mais a descida real da caixa delimitadora Vamos ver o que sai disso. Podemos desenhar rapidamente a caixa delimitadora com um contorno, ponto inicial de contexto Path, ponto de contexto g xMyNWH e traçado de ponto de contexto Agora, essa é a verdadeira caixa delimitadora ao redor do penhasco. Também podemos testar com outros penhascos. Para alinhar isso no centro do nosso esboço, podemos fazer algo semelhante ao que fizemos em nosso esboço de notas Custo X é igual a dois, fizemos menos NW vezes 0,5 menos x, e CY altura menos H vezes 0,5 menos Y. E então traduzimos o contexto para X e Y. E então temos então traduzimos o contexto para X e Y. E então fizemos menos NW vezes 0,5 menos x, e CY altura menos H vezes 0,5 menos Y. E então traduzimos o contexto para X e Y. E então temos. Eu centralizei adequadamente o glifo. , faremos mais com isso, Obviamente, faremos mais com isso, mas antes de prosseguirmos, talvez queiramos escolher uma fonte diferente ou talvez alterar o tamanho da fonte. Então, vamos arrumar um pouco aqui. Vamos mover a variável de texto para fora dessa função para o topo do arquivo e também declará-la com um let, caso queiramos alterá-la posteriormente e declarar mais duas O tamanho da fonte é igual a 1.200 e a família da fonte é igual a serf. A propriedade da fonte é uma única string, então precisamos constituir esses valores Vou te mostrar duas maneiras de fazer isso. Uma vez que já vimos em nossa primeira aula, precisamos apenas somar essas sequências de caracteres com os sinais de mais Tamanho da fonte mais espaço Px mais família de fontes. E a outra forma é com os literais do modelo, que nos permitem colocar variáveis ou expressões dentro das strings Vamos duplicar essa linha e retirá-la. Os literais de modelo não são definidos por códigos, mas por Bectis Então, Bectics, para a primeira variável, cifrão, colchetes, depois PX e, em seguida, alinha o cifrão e os colchetes. O primeiro é o tamanho da fonte e o segundo a família de fontes. O resultado é o mesmo. Mas a prática é usar modelos literais, mas agora você sabe que existem duas maneiras diferentes de fazer isso Sinta-se à vontade para alterar a fonte se não gostar da que viu no seu esboço E você também pode criar uma variável para o estilo ou a espessura da fonte. Vou usar a fonte Sara padrão por enquanto. Passe algum tempo escolhendo a fonte com a qual deseja trabalhar. E quando você estiver pronto, nos encontraremos na próxima lição. 20. Aprenda sobre o assíncrono: Agora desenhamos uma única letra em nosso esboço. Não seria ótimo atualizar isso e pressionarmos uma tecla em nosso teclado? É isso que vamos trabalhar nesta lição. Precisamos ouvir os eventos que estão acontecendo na janela do nosso navegador e aquela em que estamos interessados chamada Key. Também podemos usar a tecla Down, que é a tecla real pressionada, mas eu prefiro usar um aplicativo de teclas, que é acionado quando a tecla é liberada Precisamos de uma linha como essa. Documente o ouvinte de eventos de pontos, Key, e o segundo parâmetro é a função a ser chamada quando o evento acontece Vamos criar um chamado Key upp. Const em Key up. Ele obtém um objeto de evento como parâmetro. E, por enquanto, podemos simplesmente registrar esse objeto. Uma das propriedades do objeto de evento é uma string com uma tecla que está sendo pressionada. Poderíamos definir nossa variável de texto para essa chave. Então isso foi bem fácil. Mas nosso esboço não está mudando. Precisamos pedir que ele seja atualizado e renderizado novamente quando a variável de texto for alterada. Uma solução rápida aqui seria adicionar animate true à nossa configuração, como vimos antes Mas isso significaria atualizar o esboço em cada quadro quando, na verdade só precisamos fazer isso quando a tecla é Para fazer isso corretamente, vou ter que fazer um desvio e passar alguns minutos explicando outro conceito de programação, uma função sincronizada Até agora, todo o código que escrevemos se baseia em uma regra implícita, de que tudo funciona de forma que tudo funciona Assim que escrevemos uma linha de código, podemos assumir que o que escrevemos é verdadeiro e estabelecido no momento em que chegamos à próxima linha. Por exemplo, se dissermos que X é igual a cinco, na próxima linha, podemos ter certeza de que X mais um seria apenas seis. Digamos que quiséssemos que X me carregasse alguma imagem, que é uma função que não existe, é só um exemplo. Então, na linha a seguir, queremos tentar ler com a largura da imagem. Isso nos causaria um erro porque a imagem precisa de algum tempo para carregar. Quando o navegador estiver executando esse código, ele não vai parar nessa linha. Aguarde o carregamento da imagem e continue com o resto do código. Ele vai executar tudo de forma sincronizada. Ao carregar algumas imagens, é tarefa dos sincronizadores. Para gerenciar essa combinação de tarefas de sincronizadores N sincronizadores, temos um conceito em JavaScript chamado promise, que é O navegador diz: Ok, eu vou executar isso, mas vai demorar um pouco. Então, em vez do resultado, aceite a promessa de que eu lhe darei o resultado quando terminar. E, por enquanto, deixe-me continuar com o resto do código. Em seguida, poderemos obter a largura da imagem que estamos tentando carregar aqui. Só precisaremos escrever isso de uma forma um pouco diferente, carregar uma imagem para mim fazer algo com o ponto X com ela. Obviamente, isso não é um código real. Mas vamos prosseguir e realmente implementar essa função de carregamento de algumas imagens para que possamos ter um exemplo funcional. Podemos obter uma imagem aleatória do PiXM de extremidade inferior. Não nos importamos com a imagem , desde que tenha alguma. Em seguida, armazene essa variável chamada URL. E então me carregue alguma imagem. Tomando um real como perímetro, ele retornará uma nova promessa Na documentação, vemos que é necessária uma função com dois parâmetros resolver e rejeitar. Em seguida, uma flecha gorda e um suporte encaracolado. Dentro da promessa, vamos criar uma nova imagem e definir sua propriedade de origem, a fonte do RL, que estamos transmitindo Assim que a imagem tem uma fonte, o navegador já começa a carregá-la. Então, queremos definir outras propriedades antes da fonte. Eu quero mg dot load, que é uma função que o navegador chama quando a imagem termina de carregar, e isso resolveria nossa promessa e passaria o próprio objeto MG. E pronto, quero rejeitar nossa promessa. Então, poderíamos ter outra função chamada start, que seria o ponto de entrada do nosso código. Ignore o resto do nosso esboço por enquanto. Vamos voltar a isso em um minuto. Mas, por enquanto, finja que esse é todo o código que temos aqui Apenas essas duas funções dentro de start podem dizer carregue-me alguma imagem e, em seguida, nesta função desta promessa. E o primeiro parâmetro é o que estamos passando dentro de resolve. Então, EMG, flecha gorda, e então podemos registrar a imagem com ela e o ponto EMG com E primeiro, para ver a ordem em que esse código será executado, vamos também dar uma olhada em outra coisa logo após esse código, algo como essa linha. Depois, só precisamos executar o start e dar uma olhada no console. Portanto, o navegador executou essa linha primeiro, mesmo que ela apareça após o log anterior. E isso porque load Misumimage é uma promessa que só será cumprida algum Então, aqui temos uma função de sincronizadores e uma função Nsycronizer Mas e se quiséssemos que o navegador esperasse pela tarefa de sincronização N Podemos fazer isso com algo chamado esperar. Quando estamos executando algo dentro de uma função de sincronizadores, podemos dizer ao navegador que espere Ou, em outras palavras, podemos executar sincronização dessa tarefa de forma sincronizada Isso é confuso? Vejamos um exemplo. Vamos criar uma cópia da nossa função inicial. Comente um deles e deixe aqui apenas para referência. Em seguida, queremos converter o início em função assíncrona digitando uma sincronização na frente dela Agora, dentro dela, podemos alterar essa expressão para B ENG igual ao peso. Carregue-me alguma imagem e, em seguida, carregue a imagem com ela e registre esta linha. Vamos salvar isso e verificar o console novamente. Agora, a ordem dos registros está invertida ou, na verdade, é a mesma que temos no código Mesmo se estivermos carregando uma imagem, que é uma tarefa que não sabemos quanto tempo pode levar, o navegador agora está esperando por ela. Por que eu entrei em tudo isso? Porque o Canvas sketch é uma função sincronizada. Ele retorna uma promessa com algo chamado gerenciador de esboços Sempre que pressionamos uma tecla no teclado, queremos poder dizer ao gerente de esboços que renderize o esboço novamente Então, vamos voltar ao nosso esboço. Finalmente, podemos comentar todo esse bloco de código com estrela de barra frontal e, em seguida, no final, estrela e barra frontal, e deixar esses blocos aqui para referência Agora vamos encerrar. Nossa chamada para o Canvas é um esboço com função de sincronização chamada estrela assim como fizemos em nosso exemplo Com isso pronto, podemos então armazenar o escasso e uma variável para aguardar o esboço inverso Na verdade, queremos que essa variável seja visível fora do escopo dessa função. Então, vamos declarar isso aqui. E precisamos lembrar de chamar Star para correr imediatamente. Agora, dentro do Key App, depois de definir o valor do texto, podemos chamar o gerenciador dot render. E podemos ver que está funcionando, mas eu quero usar letras maiúsculas, então vou adicionar as duas E com isso, estamos de volta aos trilhos. Esse foi o fim do desvio. Parecia um pouco longo, mas era um conceito importante a ser abordado. Depois de se familiarizar com o peso do erro, você não precisa realmente escrever muito código para usá-lo. No final, tudo o que precisávamos fazer era agrupar uma função de canto em torno do código para criar um esboço em tela As promessas são mais do que as que abordei aqui. Como, por exemplo, o que acontece quando uma promessa é rejeitada e como capturar uma mensagem de erro. Vou postar um link com mais detalhes caso você queira ler mais sobre eles. Foi uma pequena jornada, mas agora terminamos com ela. Você aprende o conceito poderoso que definitivamente será útil ao usar JavaScript. Na próxima lição, voltaremos ao nosso esboço. 21. Criando um bitmap: Agora vamos analisar a leitura dos valores de cores dos pixels em nossa tela. Agora temos uma letra grande bem no centro do nosso esboço, e o efeito que buscamos é desenhar outras formas no formato dessa letra Podemos começar a pensar sobre isso que estamos vendo agora apenas como dados de posição e dados de cor. Isso nem precisa estar em nosso esboço. Tudo o que precisamos saber é onde temos pixels brancos e onde temos pixels pretos. Podemos pensar em nosso Canvas como um mapa de big data ou um mapa de bits. O Canvas é um bitmap. Há uma grade de pixels quando definimos a dimensão. Estamos dizendo que queremos tantos pixels dessa maneira e tantos pixels daquela maneira. Se chegarmos muito perto do pixel em nossa tela, veremos que é feito de nossos canais, RGB e A. Cada um desses números é de 0 a 255, que é a informação de cor de E a cor não é a única coisa importante aqui. Também é importante saber onde está o pixel. É a posição XN Y ou sua coluna e linha na grade. Já sabemos uma coisa ou duas sobre grades, então isso será útil aqui Em primeiro lugar, você precisa criar uma tela separada para nossa carta, uma menor que usaremos apenas para ler dados. Podemos criá-lo na parte superior do nosso arquivo. O tipo de custo Canvas é igual ao elemento dot quit do documento, Canvas, e então também precisamos do contexto. Portanto, o contexto do tipo C é igual ao tipo Canvas dot Get context. Depois, dentro da função SCAT, mas antes das funções de renderização porque só precisamos fazer isso uma vez Vamos definir as propriedades da grade do tipo Canvas e, para isso, precisamos de largura e altura. Assim, podemos copiar essas propriedades aqui e disponibilizá-las aqui. Sabemos que um pixel é sempre um quadrado, então podemos armazenar sua dimensão em uma única variável. Célula de custo, não precisamos separar valores de largura e altura e, em seguida, podemos simplesmente escolher um tamanho para nosso pixel. Digamos que serão 20. E então, para definir o número de colunas, precisamos fazer o inverso do que fizemos em nossa grade anterior E diga matemática, ponto, piso, largura dividida pela célula. Isso significa que para cada 20 pixels em nossa tela principal, teremos um pixel em nossa tela de texto. A largura do nosso esboço é 1080/20. Isso nos dá 54. Então, precisamos fazer o mesmo com as linhas. Piso matemático, altura dividida por célula, células entorpecidas serão as mesmas que fizemos da última vez, chamadas vezes cordas E com isso, podemos definir a dimensão do tipo Canvas. tipo Canvas com ele será o número de colunas e alturas. Será o número de colunas e a altura será o número de linhas. Em vez de nos basearmos no contexto, vamos nos basear no contexto de tipos. Então, basta selecionar todas as ocorrências de contexto e substituir pelo tipo contexto Podemos nos livrar dessas linhas que são comentadas e depois substituí-las por brasas e alturas por linhas Então, só para ver o que temos aqui, podemos desenhar o tipo Canvas em nosso esboço com o ponto de contexto, desenhar a imagem, digitar Canvas e, em seguida, X e Y zero e zero Ainda não estamos vendo nada, então vamos tentar entender o que está acontecendo. Uma maneira fácil de verificar se está tudo bem com tipo Canvas é definir a cor de fundo para preto. E a cor do texto para branco. Agora vemos um pequeno quadrado preto lá no topo. Mas onde está nossa grande letra A? O problema é que o tamanho da fonte agora é muito grande. Precisamos atualizá-lo com base no tamanho da nossa nova tela. Poderíamos simplesmente configurá-lo para ser igual à largura ou ao número de colunas, e aí está nossa tela de texto. Agora, o que queremos fazer é ler os dados de pixels dele. Para isso, precisamos de um método chamado get image data. Como parâmetros, espera-se X largura e altura da área da qual estamos lendo os dados. Podemos armazenar isso como uma variável chamada type data e definir dois tipos de contexto Get Image data, zero, zero, chamadas e linhas. Vamos ver quais tipos de dados internos usam no console. Dados do tipo log de pontos do console. É um objeto do tipo: dados de imagem têm largura, altura e dados, e os dados são uma grande matriz com mais de 12.000 itens Isso é um item para cada canal de cada pixel. Então, GBA, que tem quatro canais vezes a largura, que é 54 vezes a altura, que também é 54, já sabemos nossa largura e altura, então podemos definir nossa variável de dados de tipo para ser apenas a propriedade de dados desse objeto Agora, queremos ler esses valores de pixels e sabemos como ler dados de uma matriz. Precisamos de um loop de quatro para I igual a zero, I menor que NML, I mais mais O Canvas é um mapa de bits e um bitmap é uma grade. Já sabemos como encontrar colunas e linhas em uma grade. Então, vamos fazer isso mais uma vez. Constall é igual a duas chamadas restantes . Constru é igual ao piso de pontos matemáticos, eu divido Agora, eu quero usar X e Y, mas já os usamos como nomes de variáveis aqui. Então, vou renomeá-los para TX e TY. Agora, os nomes X e Y estão disponíveis novamente. O custo X é igual à célula de tempo frio. O custo Y é igual à célula de tempo bruto. Agora vamos desenhar um pequeno quadrado para cada uma dessas células. Salvamento de pontos de contexto, restauração de pontos de contexto. ponto de contexto traduz X e Y, e o ponto de contexto parece certo, zero , zero e L Tudo fica preto porque somos 54 vezes 54. Quadrados pretos em nosso esboço. O que queremos é alterar as cores desses quadrados com base nos dados da fita Queremos ler esses valores do GBA. Vamos criar uma nova variável chamada R e configurá-la para dados em fita. E entre os colchetes, queremos que o índice seja o primeiro canal do pixel em que estamos Sabemos que o índice de pixels é o índice do nosso loop. Então, a letra I, sabemos que RGBA tem quatro canais, então I vezes quatro, e sabemos que o vermelho é o primeiro canal, então mais zero, não precisamos adicionar zero a nada Estou apenas digitando aqui para explicar que estamos lendo o primeiro canal Agora, encontrar os outros canais, é muito fácil. Basta duplicar essa linha. Altere o nome da variável para G e o índice do canal para um. Depois B e dois, depois A e três. Na verdade, não precisamos do canal Alpha, mas podemos declará-lo aqui Agora, só precisamos alterar o estilo do campo de pontos de contexto e usar o modelo literal desta vez para compor uma única string Bectic RGB abre e fecha parênteses, depois colchetes senoidais do dólar, colchetes senoidal do dólar R, G e colchetes senoidais do dólar, B, e O Bectic RGB abre e fecha parênteses, depois colchetes senoidais do dólar, colchetes senoidal do dólar R, G e colchetes senoidais do dólar, B, e aí está. Versão pixelizada do nosso grande tipo. Isso é diferente de simplesmente desenhar algo pequeno e depois aumentar a escala para vê-lo pixelizado, porque agora podemos desenhar qualquer forma que quisermos para Por exemplo, vamos ver como isso fica com círculos em vez de quadrados. Caminho inicial do ponto de contexto, arco do ponto de contato 00 célula, zero ponto matemático pi vezes dois e preenchimento do ponto de contato, isso não está certo. Os rádios precisam ser metade da célula. Agora, está quase certo. Podemos ver um pouco do emergir aqui à direita e na parte inferior da grade. E isso porque o círculo é desenhado a partir do centro da célula, mas estamos apenas traduzindo para o canto superior esquerdo de cada célula Então, precisamos adicionar outra tradução para ver vezes 0,5 e ver vezes 0,5. Agora, esse alinhamento está correto. Estamos chegando lá. A verdadeira reviravolta vem em seguida 22. Aprenda sobre os glifos: Como nesta lista, vamos terminar nosso esboço Em vez de desenhar quadrados ou círculos, vamos desenhar outros glifos para cada pixel da nossa tela de texto Então, isso vai ser um pouco meta. Vamos desenhar pequenos glifos para formar um grande glifo. Em vez de arco, queremos contextos, campo de pontos, texto, texto 00. Essa pequena letra preta não é o que queremos. Então, vamos definir o plano de fundo como preto. Antes do loop, defina o estilo do campo de pontos de contexto para preto e desenhe um retângulo grande, preencha toda a tela Se você ainda quiser ver o pequeno tipo Canvas na parte superior, basta movê-lo após o preenchimento. Agora, talvez pudéssemos ter glifos maiores aqui. Vamos alterar o tamanho da fonte para o dobro do tamanho da célula. Fonte de pontos de contexto. Sinal de dólar. Venda a segunda vez. PX e família de fontes. Eu não quero desenhar o mesmo glifo o tempo todo. Eu quero um glifo diferente com base no brilho do pixel Por exemplo, poderíamos desenhar um ponto para cinza escuro, um traço para cinza médio Então, vamos criar uma nova variável chamada glyph e configurá-la para uma função que vamos criar em seguida chamada get E aqui, em vez de textos, vamos usar o Glyph Precisamos passar o brilho do pixel para obter o Glip e não precisamos de todos os nossos canais, já que você está desenhando uma letra branca e dois tipos de Canvas Qualquer um dos canais de cores que faremos. Eu só vou usar o canal vermelho. E, de fato, podemos usar o branco para desenhar esses glifos agora. Não queremos mais o cinza escuro. Você pode simplesmente definir o estilo do campo de pontos de contexto como branco. Agora vamos escrever a função get glyph. Depois de obter o glifo como parâmetro, obtemos o valor que vou chamar de V, e sabemos que V será um número de 0 a 255 porque esse é o intervalo do Dependendo do brilho do pixel, quero retornar glifos diferentes Então, direi que se V for menor que 50, retorne uma string vazia I V seja menor que 100, retorne um ponto. Nesse caso, não precisamos usar ou ver porque, assim que uma condição é atendida, já retornamos um valor e nem mesmo verificamos as outras condicionais. Então, pegamos um valor de 0 a 49. E isso nós pegamos 50-99. Duplique isso Se V for menor que 150, retorne um traço. E se V for menor que 200, retorne um sinal de mais. E se nenhuma dessas condições acima for atendida, significa que o pixel é muito brilhante, então podemos retornar nossa variável de texto original Podemos ver os pontos e os traços aqui, mas isso é um pouco estranho Acho que temos que ajustar a origem e o alinhamento novamente. Somos desenhados do centro da célula, mas você deve se lembrar que o texto é desenhado na parte inferior e alinhado à esquerda Preciso alinhá-lo no centro novamente. Desta vez, não precisamos de muita precisão se isso for suficiente para usar uma linha média baseada em texto. Alinhamento de pontos de texto Isso está começando a parecer interessante, mas o mesmo glifo repetido o tempo todo é um pouco O valor padrão aqui pode ser um glifo aleatório. Podemos fazer isso em duas etapas. Primeiro, escrevemos uma string com os glifos que trabalhamos. Glifos de custo, sinal de igualdade de sublinhado, espaço e barra frontal Em seguida, convertemos isso em uma matriz usando um método de uma string chamada split. Isso é útil quando queremos cuspir algum texto toda vez que encontramos um espaço ou uma vírgula Por exemplo, no nosso caso, queremos cuspir cada caractere Portanto, nosso delmeter será uma string vazia e, em seguida, escolherá aleatoriamente dessa matriz Podemos usar nosso amigo aleatoriamente do Canvas sketch, ETL novamente. Ele tem uma função chamada pick, que representa um elemento aleatório de uma matriz Então, vamos importar um aleatório mais uma vez do esboço do Canvas, etLH Em seguida, retorne o pico de pontos aleatório e passe os glifos da matriz Ok, glifos aleatórios, mas também podemos torná-los mais aleatórios usando tamanhos de fonte diferentes Eu quero dar aos glifos uma chance de dez por cento de serem muito maiores Duplique essa linha aqui e adicione a condicional na frente Se o ponto matemático aleatório for menor que 0,1, defina o tamanho da fonte para seis vezes o tamanho da célula. Podemos parar de desenhar a tela de texto pequeno aqui em cima e talvez também tornar essa fonte um pouco maior. Então, parece mais um esboço, digamos, chamadas vezes 1,2 e depois experimente com tudo Experimente diferentes glifos. Você pode até mesmo retornar algumas palavras aqui. Cabe a você experimentar outras variações a partir de agora. Até aqui, terminamos nossa primeira parte das aulas. Agora vamos descobrir coisas mais avançadas. 23. Desenhando retângulo: Vamos começar agora nossa seção avançada do curso. Vamos aprender nesta seção muitas técnicas diferentes, mais avançadas. No final desta lista, você terá algo parecido com isso Se você estiver acompanhando o curso usando um editor on-line, você pode acessar o modelo que criamos juntos na lição anterior e fazer uma cópia dele para esse novo esboço E garfo esse em vez disso. Se você estiver acompanhando o curso com uma configuração off-line, acesse o terminal e encontre a pasta na qual deseja salvar seus esboços meus são esboços de barra de documentos Java Visual Splash Quando você estiver na pasta certa, digite Canvas sketch, sketch skew, du Aqui estamos executando o comando Canvas sketch e passando um arquivo JavaScript chamado sketch skew, que ainda não existe Então, usamos os novos parâmetros para contar um esboço ao Canvas. Queremos que esse arquivo seja criado. E também podemos usar o Dd Open apenas por conveniência. É aberta uma nova guia e o navegador com um esboço recém-criado Agora, se abrirmos os QGs do sketch no editor e dividirmos a janela dessa forma, teremos uma visão muito semelhante tanto para a configuração online quanto para a offline A primeira coisa que gosto de fazer aqui é alterar a dimensão do esboço de 1080 por 1080 Gosto de trabalhar com essa dimensão. É conveniente postar no Instagram e acabei de adquirir o hábito de fazer isso. Em seguida, vamos desenhar um retângulo no meio da tela Vamos criar quatro variáveis para o retângulo, X, Y, W e H. Observe que eu as estou criando dentro da função de esboço, mas fora da função de renderização porque elas só precisam ser declaradas Nem sempre que o esboço é renderizado. Então, dentro da função de renderização, podemos definir seus valores. Vou usar os parâmetros de largura e altura que são passados aqui e definir X como metade da largura da tela e definir Y como metade da altura. Então W até 60% da largura e H dois 10% da altura. Agora, para desenhar o retângulo, primeiro definimos uma cor de campo ou uma cor de traçado Eu quero desenhar apenas um esboço. Então, vou definir uma cor de traçado usando uma propriedade de um contexto chamada estilo de traçado. Portanto, contextualize o estilo de traçado de pontos igual ao azul. E então, para realmente desenhar o retângulo, precisamos de uma função chamada stroKrpt São necessários quatro parâmetros: XY, largura e altura, exatamente o que temos aqui. Portanto, o traçado de pontos do contexto reaja X, Y, W e depois salve o fogo Isso desenha um retângulo começando do meio da tela e indo até algum lugar fora da tela Isso não é exatamente o que eu tinha em mente, então preciso fazer alguns ajustes. Quero desenhar o retângulo do centro, não do canto superior esquerdo Então, eu quero substituir esse X e Y aqui por menos metade da largura e menos metade da altura Ok, agora o ponto de ancoragem está no centro do retângulo, mas não estamos mais usando nossos X e Y. Poderíamos adicioná-los diretamente à função stroke wrect, mas há uma maneira mais simples de fazer isso usando uma transformação de fazer isso usando uma transformação Podemos traduzir todo o contexto para X e Y e depois começar a nos afogar a partir daqui Eu continuo trocando de guia aqui para mostrar a referência da API, mas não vou fazer isso toda vez que vemos algo novo O melhor é continuar usando a API. E se você precisar de mais detalhes sobre qualquer um desses métodos, recomendo que mantenha esta página aberta e dê uma olhada nas coisas em seu próprio ritmo. Agora, de volta para traduzir no contexto. Usamos Context dot translate X e Y. Sempre que transformamos o contexto, é uma boa prática restaurá-lo ao estado anterior para que não estraguemos nenhum comando desenhado que possa vir após a Para fazer isso, primeiro chamamos Context Dot save para salvar o estado atual. E então, quando terminamos, chamamos de restauração de pontos de contexto. Como eu disse, essa é uma boa prática. Devemos nos acostumar a fazer transformações em blocos como esse. Isso foi fácil. Agora vamos desenhar o mesmo retângulo, mas de uma maneira diferente Vamos abrir o método de destruição de traços e desenhar a forma ponto por ponto Começamos com Context dot start path e, em seguida, movemos para o canto superior esquerdo do retângulo com um movimento dois menos a metade da largura e menos a metade Imagine que estamos movendo uma caneta virtual para essa posição e, em seguida, desenhamos uma linha a partir daí para o próximo canto do retângulo como uma metade positiva da largura e ainda a metade negativa da Ainda não terminamos, mas se você quiser ver como isso se parece, podemos chamar Context Dot stroke. Agora, de volta ao afogamento. Precisamos de uma linha de onde deixamos a caneta virtual até metade de W e metade e outra até menos metade de W e metade para fechar o retângulo, podemos chamar de contexto ponto de fechamento de caminho e temos nosso retângulo A diferença é que desta vez estamos desenhando ponto por ponto, que significa que podemos mover esse ponto para qualquer lugar que quisermos. Vamos ajustar nosso código um pouco mais. Talvez seja mais fácil pensar na coordenada do retângulo a partir de sua posição superior esquerda e em toda sua largura e altura, em vez de todas essas meias-dimensões aqui Podemos usar outro contexto para traduzir para menos metade de W e menos metade de H e, em seguida, desenhar de zero, zero a zero, depois H e para zero H. A saída visual não mudou, mas o código parece mais nativo Esse era apenas um retângulo que é mais comum na próxima lição 24. Desenhando um retângulo inclinado: Nosso objetivo é desenhar um retângulo scud. Precisamos mover o canto de acordo com um ângulo e, para isso, precisamos de um pouco de trigonometria Vamos esconder nosso retângulo por um momento e comentar esse trecho de código Para explicar a próxima parte, quero desenhar apenas uma única linha, começando com o caminho inicial do contexto, depois o movimento do contexto para o início da linha em 00 e, em seguida, a linha até, digamos, 200 e zero. Vamos colocar 00 de volta no meio da tela e comentá-la no segundo contexto que traduzimos. Eu quero que você imagine essa linha dentro do círculo. O centro do círculo está em 00. E o raio do círculo é 200. Se o círculo for um relógio, a linha será apontada às 3:00. O que precisaríamos fazer para levar essa linha às 4:00? Onde estaria o final nas posições X e Y? Já temos o raio do círculo. O que precisamos é de um ângulo, e podemos assumir que 3:00 está a zero graus, quatro estaria às 35 às 66 horas estaria a 90 graus e assim por diante Então, vamos escolher 30 graus para as 4:00. Para encontrar a querciina, coordenar X e Y com o raio e o ângulo, a fórmula é a seguinte X é o cosseno do ângulo vezes o raio, então o ponto matemático, o ângulo do cosseno vezes o raio e Y é o seno do ângulo, o Podemos declarar uma variável para essas palavras, basta digitar. Vamos fazer isso aqui em cima junto com as outras variáveis. E então defina o raio para 200 e o ângulo para 30. Agora 30 é o valor em graus, mas o cosseno de pontos matemáticos espera um valor em brilho Então, precisamos converter isso primeiro. Poderíamos escrever uma função para converter entre graus e radiância, mas essa é uma operação muito comum, e há uma biblioteca que podemos usar para isso A que vou sugerir aqui é uma biblioteca complementar para Canvas sketch chamada Canvas Sketch UTL Ele tem várias funções utilitárias para matemática, cores aleatórias e geometria Já sabemos como fazer isso na primeira seção da aula. Estamos apenas revisitando isso. Agora, vamos usar alguns ao longo do curso, por enquanto, aquele em que estamos interessados, de grau a vermelho, que faz parte do objeto matemático Esboço em tela TL math. Agora podemos converter nosso ângulo brilho usando Matt dec para vermelho Agora só precisamos usar os valores X e Y que calculamos aqui. E aqui está nossa linha agora apontando para 4:00. O valor real de X e Y são números de 0 a 200. Não faria muito sentido tentar encontrar essa coordenada sem usar ângulos É mais fácil pensar nessas linhas horizontais como zero graus e nessa diagonal como 45 graus. Isso é como 90 graus e assim por diante. Agora que sabemos disso, vamos voltar ao nosso retângulo em vez de usar essas variáveis X e Y. Vamos manter isso organizado e criar novas variáveis chamadas Rx e E, na verdade, não precisamos raio porque vamos usar W, que é a largura do retângulo ângulo pode ficar como está, e então x será o cosseno do ângulo vezes W e RY seno do ângulo vezes W. Essa linha pode ir e podemos movê-la e então x será o cosseno do ângulo vezes W e RY seno do ângulo vezes W. Essa linha acima do código Nós comentamos anteriormente. Essa tradução de contexto agora se torna R x vezes -0,5 e, entre parênteses, RY mais O segundo movimento pode ficar em 00. E a primeira linha agora vai para RX e RY, a segunda para RX e RY plus e a terceira pode ficar em zero e H. Agora, salvamos isso e há um retângulo de quatro scud Também podemos experimentá-lo com outros ângulos. A última coisa a fazer aqui é converter o que acabamos de fazer em uma função. Vou criar um na parte inferior do arquivo logo após a função de esboço e chamá-lo de drawSkdrt Para o parâmetro, podemos passá-los um por um ou passar um único como um objeto com várias propriedades. Eu vou continuar com isso. Portanto, colchetes e propriedades serão contexto, W H e graus O contexto é onde somos desenhados. W e H são a largura e a altura do retângulo e diminuem o ângulo de sco e expressam em graus, não em brilho Podemos dar a eles valores padrão como 600 para a largura, 200 para a altura e -45 para o ângulo Agora podemos simplesmente mover todo esse pedaço de código dentro da função esperando essa linha com o estilo de traçado que pode ficar aqui Como esse bloco agora está fora do escopo da função de esboço, as variáveis precisam ser declaradas novamente. Podemos usar const desta vez porque eles não mudam dentro da função E como você está traduzindo o contexto, lembre-se de que eu disse que é uma boa prática sempre restaurar o estado do contexto depois de transformá-lo Portanto, precisamos envolver esse bloco com o cofre Context Dot e o restaurador de pontos de contexto Vamos ver se isso está funcionando e chamar Drous Code rect, passando o contexto como parâmetro e deixando os outros com seu valor padrão E então chamando o traçado Context Dot. Aí está de novo. Nesta escuta, aprendemos como importar e instalar uma biblioteca externa, como encontrar coordenadas cartesianas com base em um ângulo e raio e como desenhar um retângulo Na próxima lista, vamos desenhar um hub. 25. Aprenda a criar distribuição: Agora que temos uma função para desenhar um retângulo de esquadrão, vamos desenhar vários deles. Essa parte é fácil. Tudo o que precisamos é de um loop. Podemos armazenar o número de formas que queremos em uma variável. Chame-o de NAM e defina-o para 20. Em seguida, enrolamos um laço de quatro voltas ao redor do carvão para desenhar um retângulo. Pois se I é igual a zero, I é menor que um I mais O resultado são 20 retângulos desenhados um em cima do outro. Podemos espalhá-los pela tela usando uma posição aleatória. E para isso, podemos usar outro módulo do Canvas Sketch ut Já o estilizamos, então só precisamos importá-lo, então só precisamos importá-lo, hospedar aleatoriamente é igual a exigir o Canvas sketch Utl Na documentação, novamente, vemos várias funções úteis assim como fizemos com o módulo matemático O que nos interessa é o intervalo de pontos aleatório. Passamos um valor mínimo e um valor máximo e recuperamos um número aleatório entre eles. Podemos usar isso para alterar o X e o Y para cada retângulo. X pode ser qualquer número entre zero e ponderado. E por quê? Um número entre zero e altura? Por que não fazer o mesmo com a dimensão do retângulo? W pode ser 200-600 e H 40-200. O ângulo é o mesmo para todos eles, então podemos armazená-lo em uma variável aqui em cima e agora passar esses valores como parâmetro. Isso está se tornando mais interessante, mas há um problema com essa abordagem. Ter essas chamadas aleatórias aqui dentro da função de renderização significa que toda vez que o esboço é renderizado, os retângulos ficam diferentes. Isso é realmente uma coisa boa. Queremos esse elemento de aleatoriedade, mas também queremos ter controle sobre ele Digamos que pressionamos Control S ou Command S para salvar esse quadro antes de fazer isso, vamos escolher um retângulo que possamos reconhecer posteriormente. Eu diria que esse. Agora estou pressionando o Control S e vou baixar a pasta e verificar o quadro de saída Podemos ver que nosso retângulo de referência não está aqui. A imagem saiu diferente do que estávamos vendo na tela, e isso porque a função de renderização foi chamada durante a captura do quadro e acabou usando números aleatórios completamente diferentes O mesmo aconteceria se animássemos o esboço adicionando animated true ao cenário Agora, a função de renderização é executada em todos os quadros que criam essa bagunça de desconexão que estamos vendo Há duas maneiras de resolver esse problema Vamos começar com uma delas e abordaremos a outra mais tarde. Podemos armazenar as propriedades do retângulo fora da função de renderização Vamos criar uma nova matriz chamada rects e vamos preenchê-la com objetos que representarão os dados do nosso retângulo X, Y, W e H são apenas dados. Podemos copiar o início do nosso loop onde definimos o valor dessas variáveis e trazê-lo até aqui. Em seguida, vamos inserir na matriz reg, um novo objeto que contém essas propriedades Então rex dot push, que está dentro dos colchetes Curl, X, Y, W e H. Ainda não terminamos. Mas se executarmos isso, obteremos um erro no console que diz que a largura não está definida. Temos acesso às mesmas propriedades da função de renderização aqui dentro da função de esboço Só precisamos declará-los. Então, copie esse parâmetro e cole-o aqui. Agora, precisamos usar nossa matriz Rex. Em vez disso, não precisamos mais disso para o loop aqui, pois temos uma matriz de objetos que podemos usar para cada loop, que é uma função da matriz, então rex dot para cada um. E o primeiro parâmetro é o item sobre o qual estamos iterando, podemos chamá-lo de rect Agora, poderíamos substituir esses valores pelo reto X ou pelo ponto reto Y, etc. Existe uma forma inter pela qual não precisaremos mudar nada do que tínhamos antes Isso é destruir o objeto direto. Fazemos isso com colchetes const open coll, todas as propriedades que queremos destruir e, em seguida, fechar colchetes é igual a rect. O resto pode ficar como está, e nosso esboço está funcionando novamente. A diferença agora é que as chamadas aleatórias acontecem somente uma vez dentro da função sketch Portanto, todas as propriedades dos retângulos permanecem as mesmas para cada chamada da função de renderização Podemos testar isso definindo animate como verdadeiro. Seu esboço agora está animado, mas nada se move porque as posições e os tamanhos permanecem os mesmos em cada quadro É isso que queremos porque agora mesmo que a composição seja aleatória, se encontrarmos uma que gostemos, podemos salvá-la com Control ou Command S, e a saída será a mesma Como estamos vendo na tela aqui. Agora sabemos como usar valores aleatórios para alterar a composição quando atualizamos a página e também sabemos onde usá-los no código Na próxima escuta, adicionaremos algumas cores. 26. Aprenda sobre como adicionar cores: Já estamos randomizando posições e tamanhos, e também podemos ter cores aleatórias Vamos ver como fazer isso de forma estruturada. Podemos começar adicionando propriedades de cor ao objeto destruído Estou declarando duas novas variáveis chamadas fill and stroke. Por enquanto, podemos definir o campo como azul e o traçado como preto. Em seguida, estruturamos essas propriedades e definimos o estilo de traçado Context Dot para traçar e duplicar a linha, alterá-lo para o estilo de preenchimento e configurá-lo para preenchimento Depois da chamada para contextualizar Dot stroke, chamamos Context dot fill. E agora temos vários retângulos azuis. Estamos randomizando posições e tamanhos. Então, por que não randomizamos as cores também? A propriedade do estilo do campo, exceto cor nomeada, como a que estamos usando agora. Mas isso também pode estar em forma hexadecimal. Também pode ser uma correção RB, como RGB 002 55 ou o prefixo RGBA em que o último valor é a opacidade 0-1 Esses números são mais fáceis de randomizar do que hexadecimais ou nomes. Então, vamos nos ater a esse formulário. Primeiro, precisamos mudar a string de códigos únicos para beptis para que possamos usar variáveis dentro dela Agora podemos dizer que queremos que um canal azul do GBA seja um número aleatório de 0 a O próximo passo natural é também randomizar os canais vermelho e verde Então, vamos fazer isso. copiar a mesma expressão e colá-la duas vezes, garantindo que mantenhamos o coma entre elas. Agora, as cores são um tópico subjetivo. Você pode gostar do resultado, mas, na minha opinião, isso não parece ótimo. Não acho que a pura aleatoriedade funcione quando se trata de cores Há 16 milhões de valores possíveis aqui, e isso é muita escolha. É melhor reduzir essas opções para apenas algumas cores que gostamos e que achamos que funcionam bem juntas Existem alguns blocos de cores famosos que podemos usar, como riso e colors Que é uma lista de cores populares para impressoras gráficas Rizo A lista que vemos aqui também está disponível no JSofma, o que é perfeito para Está empacotado como uma biblioteca chamada Rizo Colors, e podemos instalá-lo com o MPM Assim como fizemos com outras bibliotecas, mais uma vez, se você for editor online, vá até o campo de dependência e insira as cores do Rizo Se você estiver usando o terminal, pressione Control C para interromper o processo e inserir PMI Rizo Em seguida, seta para cima para executar nosso esboço novamente. Agora podemos importar cores de refrigerantes a partir de cores de refrigerantes e, para escolher cores aleatórias dessa lista, podemos usar outra função do modelo aleatório chamada Ele escolhe um valor aleatório de uma determinada matriz. Portanto, o preenchimento é igual ao ponto aleatório P, portanto, cores e os mesmos quatro traços O valor de retorno é um objeto, portanto, se quisermos usá-lo como estilo de campo ou estilo de traçado, precisamos especificar isso. Queremos a propriedade hexadecimal. Agora isso parece melhor? Na minha opinião, ainda não. Ainda temos muitas opções, muitas cores conflitantes Precisamos de um subconjunto ainda menor de cores. Acho que ficaríamos bem com apenas três. Então, vou criar outra matriz chamada cores destruídas e preenchê-la com três cores riso aleatórias Então, em vez de definir o estilo do campo para escolher aleatoriamente de todo o conjunto de cores do riso, vou defini-lo como bicado a partir de cores destruídas Ok, agora eu acho que isso está começando a ficar bem. Podemos tornar o traçado muito mais espesso para que possamos vê-lo corretamente com uma linha de pontos de contexto Igual a dez, também podemos alterar a cor de fundo. Vamos criar uma nova variável chamada BAG color e configurá-la novamente para um ponto aleatório p, recolorir o ponto x. E aqui, em vez de um estilo de campo branco, usamos a cor BG Bem, isso não é ótimo. Talvez fique melhor se abrirmos a opção para a cor de fundo e escolhermos todo o conjunto de cores do resultado. Isso é melhor. Agora vamos desenhar algumas sombras Podemos usar uma propriedade do contexto para D chamada cor da sombra. Antes de chamar preenchimento e traçado, definimos a cor da sombra do ponto de contexto e, por enquanto, vou defini-la como preta. Em seguida, a sombra de pontos de contexto do conjunto X, que vou definir como menos dez, e a sombra de pontos de contexto do conjunto Y, que será 20 Desde então, temos sombras duplas, e isso porque elas estão sendo desenhadas tanto para preenchimento quanto para traçado Então, vamos reverter a cor da sombra para nula após o preenchimento e antes Esse é um efeito interessante. Talvez possamos tornar as sombras um pouco mais suaves com uma opacidade menor e usar LGB A 0,0, 0,0 e LGB Está tudo bem. Mas em vez de ter o mesmo tipo de cinza para todas as sombras, eu quero que elas sejam uma versão um pouco mais escura da cor do campo Em outras palavras, quero pegar a cor do campo e reduzir seu brilho ou luminosidade. A melhor maneira de fazer isso é converter a cor de LGB em outro espaço de cores chamado HSL, que é t para saturação Aqueles que usam o Photoshop ou outro software de edição de imagens provavelmente já estão familiarizados com ele A operação de conversão entre RGB e HSL não é das Mas, felizmente para nós, existe um modelo Oma sketch rooter, que podemos usar O método que queremos agora é offset HSL. Lembre-se de que a ferramenta de esboço COVA já está disponível, então só precisamos transmitir cores com uma cor por Kc igual à cor de barra da ferramenta de esboço CVA. Agora podemos declarar uma nova variável chamada Shadow Color. E defina-o para HSL com deslocamento de pontos de cor. O primeiro parâmetro é a cor de entrada que vai cair. A segunda é o quanto queremos compensar a propriedade U, que será zero, depois a saturação do conjunto, que também é E, finalmente, a propriedade luminosa , que é o que queremos Queremos uma versão mais escura do preenchimento. Então, isso vai ser -20. Agora, para usar a cor da sombra, precisamos converter o valor novamente uma intensidade de estilo com um estilo de ponto colorido, e a entrada pode ser qualquer propriedade do objeto colorido resultante. Vou usar o ponto de cor de sombra RGBA. Começamos perdendo o valor Alpha no processo, mas podemos recuperá-lo facilmente editando o último elemento da matriz RGBA e configurando-o de volta para 0,5 Deixo que você decida se prefere sombras como essa ou a versão simples de 50% preta Meu objetivo aqui foi mostrar como manipular o valor da cor com a cor UTL É mais um para o nosso cinto de utilidades. Um efeito interessante que eu coloquei em jogo com o esboço foi desenhar outro contorno, um mais fino em cima da Portanto, defina a linha de contexto com 22, estilo de traçado como preto e chame o traçado novamente. Já que você está falando sobre cores, há um conceito a menos que eu quero apresentar aqui, que é o modo planejado. Na API Canvas, elas são chamadas de operação composta global O valor padrão é uma fonte acima, o que significa que o próximo comando desenhado ou a fonte será sobre o que já está lá no destino. Em outras palavras, o que for retirado primeiro está na parte inferior e o que for retirado depois vai para o topo. Algumas das operações possíveis, novamente, podem ser familiares para aqueles que usam software de edição de imagem como sobreposição, por exemplo Vamos usá-lo em nosso esboço. Em qualquer lugar antes de chamarmos fill, definimos a operação de composição global de pontos de contexto como sobreposição O esboço da cena parece ter desaparecido. Portanto, antes de desenhá-la, precisamos redefinir a operação composta de volta à fonte Parece bom, mas acho que ficaria melhor se tivéssemos alguns retângulos misturados com sobreposição e outros apenas com sobreposição e outros apenas com Assim, podemos criar uma nova propriedade para nosso destruído chamada blend e atribuir ela um valor que depende um número aleatório maior que 0,5 Se for, ele retorna sobreposição ou então retorna a fonte Nós o adicionamos ao objeto com estruturas dentro da função de renderização e aqui usamos blend em vez de overlay Vamos aumentar o número de retângulos para 40, torná-los maiores com W entre 600 e largura E agora talvez ainda haja muitas cores. Então, vou excluir uma dessas linhas de cores vermelhas e manter apenas duas. Ok, eu gosto mais disso. Espero que você goste também. Caso contrário, sinta-se à vontade para experimentar os valores, talvez alterar a cor das sombras, alterar o modo de mesclagem, apenas para brincar com um esboço e, na próxima lição, finalizaremos as coisas com uma máscara de recorte 27. Criando máscara de recorte: Gosto do padrão criado por esses retângulos, mas acho que falta algo e essa é uma oportunidade de examinar mais alguns tópicos Uma ideia que tive ao experimentar esse esboço foi enquadrar esse retângulo dentro Podemos começar desenhando um triângulo. Na parte inferior da função de renderização, depois de desenhar todos os retângulos, iniciamos um novo bloco de código com um salvamento de pontos de contexto e uma restauração de pontos de contexto Vamos mover a caneta para o centro da tela com um contexto traduzido W vezes 0,5 e altura vezes 0,5. Em seguida, começamos a desenhar uma forma com o ponto de contexto, iniciar o caminho, mover para cima. Para X zero e Y -300, desenhe uma linha para X 300 e Y 200 e outra linha para -300 e Y para Em seguida, feche o caminho, defina a linha com ela como dez, defina o estilo do traçado como preto e, finalmente, chame o traçado para desenhar a forma. E esse é o nosso grande triângulo. Agora, vamos mover todo esse bloco de código antes do loop em que desenhamos os retângulos E aqui vamos chamar context dot clip. Tudo o que é desenhado após um clipe aparecer dentro do triângulo. Em outras palavras, o triângulo está agindo como uma máscara de recorte A máscara de recorte faz parte do estado do contexto. Então, quando restauramos o estado, a máscara desaparece. Mas, nesse caso, também traduzimos o contexto para o centro da tela. Portanto, os retângulos estão todos deslocados e não vemos muitos deles Como queremos a máscara e não podemos restaurar o contexto, a única opção é traduzi-la de volta. Com o contexto, traduza largura vezes -0,5 e altura vezes 0,5 Ok, agora estamos chegando aqui, mas nosso triângulo não é muito simétrico Quero mostrar outro método de desenhá-lo, que podemos usar para desenhar qualquer polígono regular com qualquer número de lados Vamos declarar uma nova função chamada draw polygon. E o parâmetro será um objeto com o contexto de propriedades, raio com um valor padrão de 100 e lados com um valor padrão de três Agora, se imaginarmos um triângulo que se encaixa perfeitamente dentro do círculo, podemos dizer que ele divide o círculo em três fatias iguais O ângulo de cada uma dessas fatias é a circunferência total dividida pelo número de lados Depois de conhecermos o ângulo e o tamanho da fatia, podemos encontrar as bordas do polígono Vamos começar com uma variável chamada slice. Que é o ponto matemático Pi vezes dois dividido pelos lados. Em seguida, iniciamos uma nova forma com um ponto de contexto, o caminho inicial e, em seguida, o ponto de contexto move dois X zero e Y menos o raio Então, precisamos de quatro voltas começando em um e iterando ao longo do número de lados Aqui, precisamos de um ângulo baseado em I para que possamos declarar uma nova variável para ele Vou chamá-lo de Theta e configurá-lo para I time slice. Em seguida, podemos desenhar as linhas da nossa forma com um ponto de contexto, a linha dois. X será o cosseno do raio de Heta e o seno y do raio de Heta Se você se lembra do ponteiro do relógio que vimos na primeira lição, o princípio aqui é o mesmo Então, fora do circuito, fechamos o caminho. Agora podemos substituir nossa seiva de bacalhau extraída aqui por essa nova função Então, desenhe um polígono e nós o passamos no contexto. Raio, digamos, 400 e tamanho três. Bem, algo não está certo, e isso é porque eu decidi começar a desenhar a forma de cima e essa não é a posição de zero grau. Como você deve se lembrar, o grau zero é às 3:00, mas eu quero usar o 12:00 no O que precisamos fazer é subtrair 90 graus de Heta ou menos o ponto matemático pi vezes 0,5. Isso é melhor. Vamos tentar passar em cinco lados. Ou seis. Qualquer número maior que três funcionaria aqui. Agora, eu não gosto disso. O traçado do polígono aparece atrás do retângulo, então preciso separar o clipe e a máscara do contorno do polígono , o que significa que preciso chamar draw polygon duas vezes, uma com o clipe de pontos de contexto e outra com o traçado de pontos de contexto, clipe de pontos de contexto e outra com o traçado de pontos de contexto pois ambos os polígonos terão pois Já aprendemos que a melhor forma de lidar com esse cenário é armazenar as propriedades em um objeto. Então, vamos declarar um novo objeto aqui no topo chamado máscara As propriedades serão o raio, que eu quero definir para 40% do casamento e depois os lados, que serão três E já que você está criando um objeto, por que não armazenar também as propriedades X e Y? Então X casado vezes 0,5 e Y altura vezes 0,5. Agora, antes de desenharmos o triângulo, podemos traduzir para mascarar o ponto X e mascarar o ponto Y e, em seguida, desenhar o polígono passando pelo raio do ponto da máscara e pelo tamanho do ponto da máscara E então só precisamos da chamada para contextualizar o clipe de pontos. Essa outra linha está aqui que podemos cortar e vamos movê-la para a parte inferior da função. Pouco antes de fazermos isso dentro do loop retangular, também podemos usar o objeto de máscara para essa segunda tradução Desta vez, para menos mascarar o ponto x e menos mascarar o ponto. Agora, no final da função, após o loop, é onde estamos desenhando o contorno do polígono Para uma boa prática, começamos com o salvamento de pontos de contexto e a restauração de pontos de contexto e , em seguida, traduzimos o contexto novamente para corresponder ao ponto g e ao ponto y. Cole as linhas que copiamos acima e aqui também podemos copiar a chamada para desenhar o polígono E aí está nosso esboço. Agora, aparecendo na frente dos retângulos, o triângulo não está realmente centralizado verticalmente, e existem algumas maneiras de Mas acho que podemos nos safar com um truque rápido e simplesmente alterar a propriedade Y da máscara para alto vezes 0,58 Talvez a cor do contorno também possa vir das cores retas e ter o dobro da espessura da linha 20, e poderíamos até usar outro modo de mesclagem Desta vez, vou continuar com a operação global de compostos. Pássaro colorido. Com esse modo de mesclagem, acho que seria melhor se os contornos estivessem dentro do triângulo para que pudéssemos alterar o raio para mascarar o raio dos pontos Menos a linha de pontos do contexto W. Ok, isso cria algumas variações interessantes Este é o nosso esboço, mas há mais um tópico que quero abordar antes de fecharmos este, que é a semente aleatória 28. Faça uma semente aleatória: Você deve se lembrar de nossa aula sobre distribuição, que eu disse que havia duas maneiras de ter algum controle sobre valores aleatórios. A primeira era criá-los uma vez e armazená-los. Agora vamos dar uma olhada no segundo, que é definido em uma semente aleatória. O conceito aqui é que, depois definir uma semente para sua função aleatória, todas as chamadas subsequentes para random sempre retornarão a mesma sequência de valores. Existe um método chamado set SED parênteses. O modelo aleatório do Canvas sketch UTL vamos usá-lo aqui na primeira linha da função de esboço Vou definir minha semente para 555, depois o console registrar um valor aleatório três vezes seguidas e abrir o console, e o número que estou vendo aqui deve ser o mesmo número que você está vendo na sua máquina, independentemente de você estar no PC ou no MC usando a configuração offline ou a configuração online Na verdade, se você esboçar tiver o mesmo número de chamadas aleatórias que o meu, e na mesma ordem, deverá ser vista exatamente a mesma saída visual E a semente não precisa ser um número. Pode ser força. Vamos tentar com um parafuso. Mesmo quando atualizamos a página, o resultado ainda é o mesmo Portanto, se você conhece a semente, pode reproduzir o mesmo esboço constantemente toda vez que executar Se você ainda quiser obter variações aleatórias, ao atualizar a página, você pode fazer com que a semente em si seja um valor aleatório Vamos secretar uma variável chamada SID e configurá-la para datar um ponto agora Essa é a hora atual em milissegundos. Portanto, esse número sempre será diferente. Uma alternativa é usar outro método do Canvas sketch Uto chamado Get random set Se você encontrou o resultado que você gosta, pode registrar o valor do assento e anotá-lo em algum lugar. Ou, se você estiver usando a configuração off-line, poderá alterar o nome do arquivo salvo ao pressionar Control S. Vá até a configuração e use o nome seed. Clique no navegador, pressione Control S ou Command S para salvar o esboço e você poderá copiar a semente do nome do arquivo Cole-o aqui para recriar exatamente o mesmo slide de esboço. É isso para o nosso primeiro esboço. O resultado ainda é bem simples, mas espero que você concorde que ele nos permitiu abordar muitos tópicos que podem ser úteis no futuro quando você estiver criando algo que parece completamente diferente. E a seguir, escute, vamos começar um novo esboço. 29. Crie uma curva qudrática: O esboço anterior foi divertido. Aprendemos muito com isso, mas agora vamos fazer algo diferente e aprender uma nova técnica. Como desenhar curvas dinâmicas. Antes de tudo, precisamos começar um novo esboço. Se você estiver usando stack builds ou for chamado de Sandbox, basta bifurcar o modelo padrão como você E se você estiver executando coisas a partir do terminal, pressione Control C para interromper o processo atual e inserir as curvas de traço do Canvas sketch, a introdução e, em seguida, o novo traço introdução e, em Em seguida, abra o arquivo JavaScript no editor e altere a dimensão 1080 por 1080, assim como fizemos em nosso primeiro Antes de começarmos a trabalhar nos visuais que queremos criar, quero usar essa introdução para falar sobre curvas Podemos começar desenhando uma linha reta. Nós inserimos o ponto de partida do contexto Path. Em seguida, o ponto de contexto move dois. Ainda não vou usar nenhuma transformação de contexto. Vamos manter a coordenada a partir de 00 no canto superior esquerdo Então, o ponto de contexto move dois, X 200 e Y 540 Em seguida, contextualize a linha de pontos dois, 880 e ainda Y 540. E, finalmente, contextualize o traço. Então, aqui começamos uma nova forma, movemos uma caneta virtual até esse ponto e, em seguida, dissemos à API Capace que queríamos pintar o pixel daqui até aqui em uma linha reta A função que calcula quais pixels precisam ser pintados está oculta para nós. É parte da implementação da API no navegador. Portanto, a linha dois é um método de conveniência. Para desenhar curvas, temos dois desses métodos: curva mais ocupada do que curva não Com a curva de Bezier, temos dois pontos de controle, e com a curva quádrica, temos Vamos desenhar uma curva quádrica a partir do mesmo ponto em que começamos antes, 200 e 540 Vamos digitar a curva quádrica de pontos de contexto dois. Os dois primeiros argumentos são X e Y do ponto de controle, e os dois últimos são X e Y do ponto de entrada ou do ponto final Podemos manter o endpoint onde estava em 800 8.540. Agora, digamos que queremos controlar um ponto por aqui, que eu diria que está em torno de X 400 e Y 300. Agora temos uma linha que está se misturando em direção a essa área. Podemos imaginar um ponto por aqui. Na verdade, devemos desenhar esses pontos para que possamos vê-los. E poderíamos dar a eles cores diferentes para sabermos quais são pontos de controle e quais são pontos de ancoragem Para manter o código organizado, podemos tratar o ponto como uma entidade separada e criar uma classe para ele Na parte inferior do arquivo, inserimos a classe point e, no construtor, passamos um objeto com três propriedades, X, Y e control, cujo padrão é falls Em seguida, armazenamos esses valores em propriedades numéricas com esse ponto X igual a X, esse ponto Y igual a Y. E esse controle de ponto é igual a controle Sabemos que queremos desenhar os pontos, então já podemos sair de um método chamado draw, que precisará de um único parâmetro, o contexto em que somos atraídos. Como de costume, começamos com o salvamento de pontos de contexto e a restauração de pontos de contexto. Então traduzimos o contexto para esse ponto X e esse ponto y, o ponto pode ser desenhado como um círculo, então o ponto do contexto começa o caminho e depois o arco do ponto do contexto e já estamos em X e já estamos em X e Y porque o contexto não é traduzido, então isso é zero, zero. raio pode ser dez, o ângulo inicial zero e o ângulo final Pi vezes dois, depois o preenchimento de pontos de contexto E podemos usar o controle de propriedade para decidir sobre o estilo do campo. Portanto, o estilo do campo é igual a esse controle de pontos. Se for verdade, use vermelho ou então use preto. Vamos ver o que isso faz em um minuto. Primeiro, precisamos usar nossa classe de pontos. Então, aqui na função de esboço, vamos cortar uma matriz chamada pontos e já preenchida com Novo ponto X 200 Y 540, próximo ponto X 400, Y 300. E desta vez o controle é verdadeiro. E o último ponto X 880 e Y 540. Agora podemos trocar esses valores codificados pelos pontos em nossa matriz Primeiro, ponha o colchete zero X, depois 0,0 Y. Aqui pontos, um X, pontos, um Y, e o mesmo com pontos, colchetes Para finalmente desenhar todos os pontos, podemos usar o ponto para cada um e podemos chamar a variável de ponto. Então, dentro da função, chamamos point dot draw e passamos no contexto. Agora podemos ver claramente o que o ponto de controle está fazendo. Sinta-se à vontade para experimentar coordenadas diferentes para ver como esse efeito ocorre Esse não é o resultado visual que buscamos. Estamos apenas trabalhando em uma nova técnica. Vamos ver nosso visual em breve. Mas quero aproveitar esta oportunidade para falar sobre outra coisa que faça sentido aqui, mesmo que não a usemos em nosso esboço final Estou falando sobre interação com o cursor, isso é o que virá na próxima lição. 30. Crie uma interação com o cursor: Vamos ver como usar o cursor para interagir com o elemento em nosso esboço. clique do mouse é um evento que o computador não sabe quando você pressionará botão do mouse ou o trackpad, mas pode reagir quando isso Existem dezenas de tipos de eventos, e o navegador conhece todos eles, mas não está passando essas informações para o Sketch, a menos que perguntemos também. Portanto, antes de podermos reagir a qualquer tipo de evento, precisamos adicionar um ouvinte de eventos Essa função informa ao navegador nosso código deseja ouvir um evento e deseja que uma função específica seja código quando isso acontecer. Um ouvinte de eventos pode ser adicionado a toda a janela do navegador ou a um elemento específico Por exemplo, se tivéssemos um botão, poderíamos usar o botão dot Ed Event Listener Esse não é o nosso caso. Temos apenas um único elemento na página, que é o elemento Canvas. Então esse será o alvo do nosso ouvinte. O evento em que estamos interessados se chama Mouse Down, e a função que chamaremos estará em Mouse Down, que vamos declará-la daqui a pouco Observe que não podemos simplesmente adicionar um ouvinte a esse círculo ou a esse círculo Essas não são entidades independentes que diz respeito ao navegador . O navegador conhece apenas um elemento na página, que é o mapa de pixels. O que desenhamos nesse mapa depende de nós. Então, se quisermos que cada ponto reaja à interação do cursor, precisamos escrever um pouco mais de código. Vamos começar declarando a função on mouse down que mencionamos no ouvinte Ele recebe um parâmetro que é o objeto do evento. Estamos chamando isso apenas de E. O que eu quero fazer sempre que o mouse estiver pressionado poder arrastar esse ponto. E quando o mouse é solto, eu quero parar de arrastar Para isso, precisamos de mais dois ouvintes, que podemos declarar aqui Isso pode ser adicionado a todas as janelas do navegador porque, neste momento, já sabemos que o mouse foi pressionado enquanto estava sobre a tela. Então, window dot d even listener on Mouse Move, que é a função que estamos criando um bit e Window doted Event o mouse para cima e para cima, vamos declarar essa função ao mover o mouse, que também recebe um evento de mouse, e com o mouse para cima, que não precisa de nenhum parâmetro A funcionalidade principal acontecerá internamente com o mouse pressionado e movido o mouse. Mas já podemos implementar no Mouse up porque a única coisa que precisamos aqui é remover o ouvinte adicioná-lo com o mouse para baixo Agora, esse padrão aqui de adicionar esse ouvinte com o mouse para baixo e removê-lo com o mouse para cima não é estritamente necessário Você poderia simplesmente adicionar todos os três ouvintes na função de esboço e as coisas funcionariam bem Gosto da maneira como fizemos isso aqui porque mesmo que o cursor esteja se movendo o tempo todo, o esboço está intrigando o ouvinte do Bowe A menos que o mouse esteja abaixado, é uma pequena otimização, mas se puder ser útil, estou aproveitando esta oportunidade aqui para falar sobre isso. Agora, finalmente, percebendo o movimento do mouse, precisamos descobrir onde está o cursor. O objeto do evento vai nos dizer isso. Vamos registrar o console E do conjunto x e o ponto e do conjunto Y. Em seguida, mude para o navegador, abra o console e clique e arraste o mouse. Esses valores estão em pixels e já estão compensados pela posição do nosso elemento Canvas na página Se você subir aqui perto do canto superior esquerdo do nosso esboço, veremos um número próximo de zero, zero, e se formos para o canto inferior direito, veremos um número próximo a 1080 por 1080, mas ainda não precisamos fazer alguns ajustes Dependendo do tamanho da resolução da tela, você pode realmente ver 1080 por 1080 ao virar Não sei porque minha resolução não é alta o suficiente. Por padrão, o esboço do Canvas recita a tela para que possamos ver toda Mesmo que você tenha criado um esboço de 4.000 pixels, ainda vemos o esboço inteiro dentro Essa escala é o que precisamos levar em consideração quando tentamos descobrir onde o cursor está usando o conjunto X e o conjunto Y. A matemática é simples Só precisamos de uma referência ao elemento Canvas que podemos acessar dentro dessa função. Vou declarar uma nova variável chamada Canvas e defini-la o parâmetro Canvas que obtemos na função sketch Agora, dentro do movimento do mouse, podemos usar um inverso para calcular as coordenadas proporcionais X e Y. Vamos começar com X. custo X é igual entre parênteses E o deslocamento do ponto X dividido pela largura do deslocamento do ponto Cvas, a largura do deslocamento é a largura real do elemento Canvas na tela após a O custo X é igual entre parênteses E o deslocamento do ponto X dividido pela largura do deslocamento do ponto Cvas, a largura do deslocamento é a largura real do elemento Canvas na tela após a escala. Então, o deslocamento X dividido pela largura do deslocamento nos dará um número Então, só precisamos multiplicar essa largura binominal da tela, que é Canvas, largura do ponto Agora duplique a linha e faça exatamente o mesmo para Y, substitua-a por ela pela altura Vamos registrar X e Y, no canto superior esquerdo, manter um número próximo de zero, zero e, agora, no canto inferior direito, finalmente mostrar um número próximo a 1080 por 108 Essa pequena fórmula aqui nos fornece valores de proporção X e Y, independentemente de onde a tela esteja na tela ou de quão grande ela seja. Agora, como podemos saber se o cursor está pairando sobre um ponto ou Como eu disse, o navegador não sabe que há um círculo aqui, mas nós sabemos. Então, precisamos calcular isso nós mesmos. Precisaremos verificar ponto por ponto e fazer um teste de acerto com base na distância do cursor até a posição do ponto. Vamos adicionar uma nova função à nossa classe de pontos chamada teste de acerto, que usa dois parâmetros, X e Y. Aqui, precisamos de uma mão de Pitágoras Vamos fazer uma rápida recapitulação da fórmula. Pegue dois pontos em um plano de dois D, sendo a distância entre os pontos DX e DY Nós obtemos um triângulo retângulo, e a distância real entre os pontos é a hipotens do A fórmula para encontrar o hipotenso é a raiz quadrada da soma do quadrado dos lados Na verdade, isso é muito simples de escrever em código. Temos dx, que é esse ponto x menos X, então o delta entre o X que foi passado e o X do ponto é o mesmo para E então a distância real que estou chamando de DD é uma raiz quadrada de um ponto matemático. O X vezes o X mais dy vezes dy. teste Had retornará verdadeiro ou cairá dependendo se a distância for menor do que alguma coisa. Sabemos que o raio do nosso círculo é dez, então vou tornar a área atingida um pouco maior e retorná-la se DD for menor que 20 Agora podemos usar o Hit test internamente com o mouse pressionado. Também precisaremos das posições X e Y ajustadas aqui. Então, basta copiá-los de um movimento do mouse e colá-los aqui e, em seguida, percorrer todos os pontos com ponto para cada um e criar uma nova propriedade no ponto chamada É dragão, que é igual ao ponto, ponto atingido pelo texto X e Y. Essa nova propriedade armazenará o valor que podemos usar no insight ao mover o mouse Caso você não goste do nome dragão, sinta-se à vontade para usar outra coisa, como pressioná-lo ou pressioná-lo para baixo ou pressionar como preferir. Agora, com o movimento do mouse, precisamos de outro loop, então aponte um ponto para cada um e, se o ponto for um dragão, queremos definir a posição do ponto para a posição do cursor. Ponto x igual a X e ponto Y igual a Y. Só mais duas coisas antes de podermos ver isso em ação precisamos de um esboço animado Então, dentro da configuração, adicionamos T animado e precisamos que a variável de ponto seja visível em todo o esboço Então, precisamos declarar isso aqui. Agora podemos clicar em nossos pontos e modificar a curva quádrica em tempo real Ainda estamos em uma aula sobre as curvas, mas vamos recapitular nossa introdução sobre a interação do cursor Sempre que quiser a interação do mouse em seu esboço, você precisa primeiro adicionar ouvintes de eventos, declarar os manipuladores de eventos ou as funções que são chamadas quando o Calcule a posição correta do cursor, baseie-o na escala da tela e faça o que for necessário com essa posição, seja para desenhar com o mouse ou clicar em alguma forma, como fizemos aqui. A interação com o cursor ainda será útil para nós na próxima lição, qual continuaremos aprendendo sobre a maldição 31. Crie vários pontos: Este ainda não é nosso esboço principal. Há mais um aspecto que eu quero abordar, e é mais fácil explicá-lo dessa forma isoladamente. Vamos ver nossos recursos visuais na próxima lição. Neste caso, vamos examinar curvas sem costura. Vamos adicionar mais dois pontos à nossa matriz. Agora podemos nos livrar desse controle e, em seguida, duplicar a última linha e alterar X para 600 e Y para 700 Outra duplicata, X 640 e Y 900. Agora podemos desenhar outra curva duplicando essa linha e alterando os dados para três e quatro Na verdade, poderíamos reescrever isso para trabalhar com qualquer número de pontos em vez de digitar os índices manualmente. Fazemos isso com quatro voltas, com I começando em um, subindo até pontos de comprimento de ponto e sendo incrementado em dois em cada iteração Em seguida, pegamos apenas uma dessas linhas e curva quadrática da linha até I mais zero E eu mais um, obviamente não precisamos adicionar zero a nada. Isso é apenas para tornar o código mais simétrico e talvez mais legível O resultado é o mesmo, mas agora podemos adicionar mais pontos à nossa matriz, se quisermos. Com cinco pontos, fica bem claro que estamos desenhando duas curvas e não uma única curva E se quiséssemos desenhar uma única curva contínua usando todos esses pontos Há uma técnica para fazer isso, que aprendi há muito tempo um artista chamado Eric Nazi, que cria sua arte usando código e usa muitas curvas A técnica envolve pontos médios. Precisamos pensar em tudo isso como pontos de controle. Os pontos de ancoragem estarão no meio de dois pontos consecutivos Fará mais sentido quando o virmos. Então, precisamos escrever o código primeiro. Vamos tentar desenhar linhas retas entre os pontos. Podemos duplicar esse bloco de código porque ele será semelhante Em vez da curva quadrática dois, usamos a linha dois com apenas X e Y. Altere o incremento para um ou apenas I mais, que é a mesma coisa, e defina o estilo do traçado para 999, que é Vamos comentar as curvas por enquanto. Talvez seja um pouco mais fácil imaginar agora que o ponto no meio dessa linha seja a primeira âncora Sendo este o ponto de controle e o meio da próxima linha sendo o próximo ponto de ancoragem Vamos desenhar esses pontos médios. Começamos de novo para um loop subindo até o comprimento do ponto menos um. Queremos duas variáveis. Um para o ponto atual é índice I mais zero e um para o próximo ponto, que é o índice I mais um. Para o ponto médio, também podemos usar duas variáveis. Vou começar com a posição X e chamá-la de X. É o X atual mais a diferença entre o próximo X e o X atual dividido por dois ou multiplicado por 0,5 Essa é a posição atual mais metade da distância até o próximo ponto. Duplique essa linha e troque X por Y. Agora podemos desenhar esse ponto médio com o caminho inicial, depois arcar X e Y, dar a ele um raio de cinco, começar no ângulo zero e terminar no ângulo e terminar no Vamos definir o estilo do campo como azul e chamar o preenchimento. É um pouco mais fácil imaginar o que vamos fazer com as curvas agora, então vamos desenhá-las. Podemos usar o mesmo loop e iniciar uma nova forma antes do loop com o caminho inicial do ponto de contexto. Podemos comentar esse ponto médio apenas para focar na curva Curva quadrática de pontos de contexto dois. O ponto de controle será o X e Y atuais, e o ponto de ancoragem será X e Y. Depois do loop, chamamos traçado de ponto de contexto, mas antes disso, podemos definir a linha com ela muito longe e definir o estilo do traçado Agora vemos uma curva contínua usando todos os nossos pontos. A curva não passa pelos pontos, é usá-los como pontos de controle. O primeiro é começar como uma linha reta antes da curva, mas podemos corrigir isso com condicionais simples Se I for zero, contexto move dois, X e Y, ou então impulsiona a curva Agora, todos os pontos se comportam da mesma maneira, caso desejemos que o primeiro e o último ponto sejam âncoras. Podemos mudar nossas condições para acomodar isso. Se I for zero, mova dois pontos curvos X e Y. Isso faz com que a curva comece no primeiro ponto e a torne um pouco mais longa que o outro Podemos fazer o mesmo com a largura do último ponto. contrário, se I for igual ao comprimento do ponto menos dois, ponto de contexto, curva quadrática dois, ponto coalhado g, recorte Y, próximo ponto g e NxDTY próximo ponto g e NxDTY Essa é uma técnica bastante simples que nos permite desenhar curvas com qualquer número de pontos Na verdade, podemos facilmente adicionar mais pontos para ver isso em ação. Vamos rolar para baixo até nossa função mais baixa. Antes do loop, criamos uma nova variável chamada hit e a configuramos como dobras. Em seguida, adicionamos uma condicional que eu acerto ainda está dobrada, e se o ponto for um dragão, ou seja, se a linha acima simplesmente retornar verdadeira, defina hit como Isso nos dirá se algum ponto foi atingido na maioria das vezes. Caso nada tenha sido atingido, criamos um novo ponto na posição do cursor. Então, se não houver pontos de vida, dot-push , new point, X e Y. Agora, se clicarmos no ponto, ainda podemos arrastá-lo como antes Mas quando clicamos fora de qualquer ponto, criamos um novo. Assim, podemos clicar e continuar estendendo a maldição. Agora sabemos o suficiente sobre curvas para começar a criar com elas. Você pode manter esse esboço Enter como referência para interação com o mouse e curvas multipontos, caso precise de uma dessas técnicas no futuro 32. Aprenda sobre como criar uma grade: Aqui é onde vamos usar o que aprendemos sobre curvas Vamos criar uma grade de pontos e desenhar curvas entre eles. Vamos deixar as curvas como um esboço separado e criar um novo Se você estiver usando o editor on-line, basta fazer outra cópia do modelo padrão. Se você estiver usando o terminal, pressione Control C para interromper o último processo e, em seguida, insira Canvas, sketch, sketch curves Abra o arquivo da curva de esboço no editor e, como de costume, altere a dimensão 1080 por 1080 Como eu disse, vamos criar uma grade de pontos e podemos avançar, começando copiando a classe de pontos. Criamos no esboço de introdução das curvas. Basta copiar a classe inteira e colar aqui na parte inferior do arquivo. Agora podemos simplificar as coisas. Não precisamos mais da função de teste de acerto e não precisamos da propriedade control. Para o estilo do campo, escolha a cor desejada. Eu vou usar vermelho. Agora vamos até a função de esboço e começamos a definir a grade Precisaremos de algumas variáveis. Os dois primeiros são os números de colunas e linhas na grade. Então, as chamadas são iguais a 12 e as linhas são iguais a seis. Também é útil armazenar o número total de células, que são linhas Calt. Em seguida, precisamos de mais duas variáveis para a largura e a altura da grade. A largura da grade ou GW será a largura da tela em tempo 0,8, o que significa 80% da maior largura da GH vai ter 80% da altura. Ainda não temos essa propriedade com altura e altura aqui, mas sabemos que elas estão disponíveis Eles também são passados para a função de esboço, então só precisamos declará-los Em seguida, faça a dimensão de cada célula, a célula arborizada ou CW é a largura da grade dividida pelo número de colunas e CH é a altura da grade dividida pelas Também podemos encontrar a fusão ao redor da grade. A mesclagem no eixo X é a diferença entre as larguras da tela e as larguras da grade. Dividido por dois, e o mesmo para a fusão no eixo Y. Todas essas são propriedades de que precisamos para definir uma grade. Mas agora podemos colocar nossos pontos, primeira matriz para armazenar todos os pontos. Em seguida, para o loop, percorra todas as células da grade, onde vamos inserir um novo ponto na matriz de pontos. E passe X e Y. Agora só precisamos definir X e Y. X será o resto O operador restante manterá o número em 0-11 Toda vez que eu alcanço um múltiplo de 12 volta a zero. Para obter a posição, basta multiplicá-la pela largura da célula Y será o piso de pontos matemáticos. Eu o divido por carvão, então começo do zero e depois aumento um, dois, três, quatro, etc., até chegar a 12 Essa divisão retorna zero, algo que somos flúor, então zero, algo se torna Então 12-23, isso será um e assim por diante. Isso nos dá o índice da linha e, para obter a posição Y, precisamos multiplicá-la pela altura da célula Agora vamos esboçar esse ponto. Vou mudar a cor de fundo para preto e iniciar o cor de fundo para preto e iniciar bloco de transformação com um salvamento de pontos de contexto e uma restauração de pontos de contexto. Em seguida, traduza os contextos para Mx e MY, que são as margens superior e esquerda E, finalmente, desenhe os pontos com um ponto para cada um. Contexto de desenho de pontos e pontos. Agora podemos ver a inclinação, mas o alinhamento está errado. Isso porque os pontos são colocados no canto de cada célula. Para movê-los para o centro das chamadas, podemos adicionar outro ponto de contexto traduzido para metade da largura da célula e metade da altura da célula. E aí está nossa nota dinâmica. Podemos alterar o número de colunas ou linhas e tudo simplesmente fica em um lugar. Agora vamos desenhar linhas entre esses pontos. Primeiro, deixe-me definir o estilo do traçado, vou usar o vermelho novamente e depois definir a largura da linha para quatro. Queremos uma linha por linha, então precisamos de 24 loops O primeiro percorrerá as linhas, para que possamos nomear a variável R para as linhas. O segundo a percorrer as colunas, então nomeamos a variável C para colunas. Devemos iniciar uma nova linha em cada linha, então o ponto de contexto começa o caminho no início do loop e, em seguida, o traçado do ponto de contexto no final do loop. Dentro do segundo loop, precisamos de uma posição para cada ponto. O ponto de custo é igual aos colchetes de dois pontos. O índice do ponto dentro do loop será o índice da linha multiplicado pelo número das colunas mais o índice da coluna. Então, precisamos do ponto de contexto para mover dois, ponto X e ponto Y, o ponto ponto, que só precisa acontecer no primeiro ponto, para que possamos preparar a condicional se não houver C ou se C for zero Ou então, para cada outro índice de coluna, contextualize a linha dois, X e Y. Com isso em vigor, se movermos os pontos, as linhas seguirão Então, vamos fazer isso usando a função de ruído. Mais uma vez, o Canvas Sketch UT será útil porque já tem alguma função de ruído no módulo aleatório Se você estiver usando a configuração local e estiver seguindo o curso cronologicamente, você já tem o Canvas Sketch UT instalado porque o instalamos na lição anterior Se você estiver usando um editor online, basta digitar Canvas sketch UTL na caixa devanta C. Então, precisamos exigi-lo com iguais aleatórios para exigir que o Canvas sketch TL seja Canvas sketch A função de ruído retorna um número que vamos armazenar em uma variável chamada N. O ruído é ótimo para dar uma sensação orgânica a estruturas como nossa grade, que são muito retas e precisas. É diferente de uma pura aleatoriedade. Se alimentarmos a função de ruído com números sequenciais, ela nos dará números aleatórios que fluem uns para os outros Vamos usar o ruído de ponto aleatório dois D e passar X e Y e, em seguida, adicionar o número às nossas posições X e Y. Nada realmente muda no visual porque N é um número muito pequeno. Mas podemos mudar isso usando o último parâmetro do ruído para a função D, que é amplitude. Vamos declarar variáveis para esses dois parâmetros, que vou deixar como um, e a amplitude, que vou definir como dint Agora podemos ver o que o ruído está fazendo, mas ainda parecem números aleatórios porque a frequência é muito alta. Vou alterá-lo para um número minúsculo como 0002. Agora ainda parece bastante aleatório, mas flui muito melhor. Algumas delas até parecem curvas, mas se escondermos os pontos, podemos ver que ainda são apenas linhas retas Portanto, há um pouco mais de trabalho a fazer aqui. Isso será muito parecido com o que fizemos na lição anterior. O circuito interno vai parar na Colts Mines 1. Então, em vez de um ponto, queremos fazer uma curva, que é o ponto atual, e queremos fazer essa exploração adicionando zero ao índice Em contraste com o próximo ponto, basta duplicar a linha e alterar o índice dois mais um Podemos nos livrar das linhas retas e da próxima parte praticamente idêntica à que fizemos na introdução das curvas, possamos trapacear e copiá-la É possível excluir a parte de saída do comando e só precisamos alterar o iterador de I para C e alterar o comprimento dos pontos dos pontos para chamadas E aí está nossa grade de curvas. As grades são graduadas e geralmente são usadas como base para coisas que queremos criar com código Foi bom para nós dedicarmos um tempo para aprender a criar uma grade dinâmica. Na próxima lição, vamos ser mais criativos com isso. 33. Aprenda a criar segmentos: No momento, temos uma curva por linha da grade. Em vez disso, quero pequenos segmentos curvos. Para cada coluna, podemos fazer isso movendo o comando do caminho inicial e o comando stroke dentro do loop. Sei que acabamos de escrever essas linhas no final da lição anterior, mas já vamos mudá-las. Para a próxima etapa, sinta-se à vontade para comentá-los ou se livrar deles. Só queremos a última linha sem usar no início. O resultado é interessante, mas não é o que eu procuro. Eu ainda quero o segmento completo, então precisamos começar cada caminho no ponto médio anterior Precisamos armazená-lo em uma variável, que os vários persistam após cada iteração do loop Vamos declarar duas novas variáveis chamadas último X e último Y. Antes da curva, movemos o último X e o último Y e, no final da iteração, definimos o último x para x e o último Y para Y. Isso está quase aqui. Agora, as curvas começam onde a última terminou Só precisamos lidar com uma exceção para o primeiro ponto de cada coluna. Se C zero, o último X é X e o último Y é o corte Y. Agora vemos as curvas completas novamente, mas desta vez estamos desenhando-as em segmentos, o que significa que podemos dar propriedades supert a cada segmento e podemos instalar essas propriedades diretamente no ponto e o último Y é o corte Y. Agora vemos as curvas completas novamente, mas desta vez estamos desenhando-as em segmentos, que significa que podemos dar propriedades supert a cada segmento e podemos instalar essas propriedades e podemos instalar essas propriedades . Aqui em cima, preencheremos a matriz de pontos. Podemos declarar uma nova variável chamada largura da linha e configurá-la para qualquer número por enquanto Digamos dez, passe-o para o construtor de pontos e seguida, role para baixo até a classe de pontos Certifique-se de armazenar a nova propriedade como uma variável numérica com essa largura de linha pontilhada igual à largura da linha De volta à função de renderização, podemos definir a largura da linha de pontos de contexto, igual à largura da linha de pontos da curva Ainda não muito, mas sabemos que podemos variar a linha e baseá-la no valor do ruído que calculamos anteriormente. Sabemos que N é um número que varia dentro da amplitude ou, na verdade, varia entre amplitude negativa e amplitude positiva. Assim, podemos mapear isso para um intervalo diferente para a largura da nossa linha. Mapear um intervalo de valores em outro é uma operação muito comum e, mais uma vez, podemos contar com o Canvas sketch UTL para nos ajudar com O intervalo do mapa faz parte do módulo matemático, então precisamos importá-lo primeiro. A matemática de custos exige o Canvas sketch TL math. A largura da linha será Branch do mapa de pontos matemáticos. O valor é N e a faixa de entrada vai de amplitude negativa para amplitude, e a faixa de saída pode ir de 2 a Isso está começando a parecer interessante. Podemos alterar mais propriedades, como a cor. Mostrarei outra biblioteca de cores diferente da que usamos na lição anterior, chamada mapa de cores. Ele tem várias paletas de cores que são úteis para visualizar uma variedade de valores, que é muito bom para nós. Então, vamos instalá-lo. No editor on-line, acesse as dependências e insira o Mapa de cores No terminal, interrompa o processo com um Controle C ou Comando C e insira o mapa de cores NPM I. Depois que a instalação estiver concluída, pressione a seta para cima, remova o traço aberto e o novo Execute o esboço novamente. Precisamos dividir a biblioteca em nosso código. Portanto, mapa de cores Const, requer mapa de cores. Agora vamos voltar para a página do mapa de cores e ver o exemplo de uso, e vamos seguir isso e armazenar as cores nas variáveis. Cores iguais ao mapa de cores e , em seguida, abra colchetes frios para definir as propriedades O primeiro, como vemos no exemplo, também é chamado de mapa de cores. E é o nome da paleta que podemos escolher nesta lista Eu vou escolher MA GMA. Em seguida, para o número de etapas de cores que usamos e tonalidades, que no nosso caso será amplitude. Para ver isso em ação, criamos uma nova variável de cor resfriada e fazemos o mesmo que fizemos com a linha com ela, passando-a para o construtor de pontos e armazenando-a como uma variável numérica na classe point Na função de renderização, definimos o estilo de traçado do ponto de contexto para a cor do ponto c. Agora, para escolher uma cor da lista, podemos usar novamente o intervalo MAP para que a cor seja igual às Colchetes, ramificação matemática do mapa de pontos e amplitude negativa para amplitude positiva e, em seguida, zero para amplitude A diferença aqui é que estamos usando esse número como um índice para a matriz de cores, que significa que ele precisa ser inteiro Então, precisamos envolvê-lo com o piso de pontos matemáticos. Vamos ver como isso fica com mais linhas. Digamos 48, isso não é ruim, mas podemos continuar brincando com o esboço. Obviamente, podemos tentar outra paleta de cores. Vamos ver como isso fica com a salinidade, mas esse não é o único recurso com o qual podemos jogar Como criamos um sistema, podemos simplesmente experimentar valores. Por exemplo, o que aconteceria se multiplicássemos esse valor por zero ponto oito em vez de 0,5 ou este por 5,5 Ok, está bagunçado, mas o que mais poderíamos tentar? E se adicionarmos números ao último X e digamos, 250 ou subtrairmos 250, se nem sempre for 250, mas um aumento no valor dependendo de C e talvez fizéssemos a mesma coisa com o último Y. Usando linhas, talvez torne as linhas mais finas com a faixa de saída variando de 0 a E como isso ficaria com mais colunas? Digamos 72 linhas e menos. Ok, isso é bom. Eu gosto disso. Aqui na gravação da tela, pode parecer que eu fui direto para esse resultado. Mas quando eu estava preparando o material para o curso, eu não tinha um objetivo claro. Eu apenas experimento com os valores até encontrar algo que eu goste E isso faz parte do processo. Depois de escrever a lógica, podemos ser criativos com ela e também fazer experiências com ela. Estou curioso para ver quais variações você vai criar. E na próxima lição, usaremos o ruído para animar nossas curvas 34. Crie animação de grade: Essa vai ser curta. Mostrarei como animar a grade e como exportar a animação como um vídeo Você deve se lembrar de nossa primeira lição sobre o Canvas sketch que podemos adicionar uma propriedade da configuração chamada animate e defini-la como verdadeira Isso faz com que a função de renderização seja chamada repetidamente sempre que o navegador estiver pronto para repintar a tela Podemos usar isso para alterar valores ao longo do tempo e vamos mudar a posição dos nossos pontos. Assim, podemos rolar para baixo até a classe de pontos e armazenar os X e Y iniciais e X e Y. Então, em vez de definir a posição do ponto apenas uma vez no início, podemos copiar essas linhas para usá-las na função de renderização E saindo desses dois, primeiro começamos um novo loop com ponto para cada um. Então, podemos colar essas linhas aqui. E em vez de apenas X e Y, usamos o ponto x igual ao ponto Ix, que é o X inicial mais N e o mesmo para o ponto Y. N também usará o ponto x e o ponto Isso não vai fazer nada porque os valores são os mesmos para cada quadro. Portanto, precisamos de variáveis que mudem com o tempo, e já vimos isso na lição anterior. Temos acesso a um chamado frame. Tudo o que precisamos fazer agora é adicionar quadro a X ou Y. Vou adicioná-lo a X. Ele está se movendo um pouco devagar para que possamos acelerá-lo e multiplicar o quadro Se você gosta disso, pode clicar no navegador e pressionar Control ou Command S para salvar alguns quadros. Mas você também pode querer salvar isso como um maçom. Então, deixe-me mostrar como fazer isso. Isso só funciona com a configuração offline porque precisamos FFMPH e precisamos acessar o sistema de arquivos local Então, primeiro de tudo, precisamos instalar o FFMPH e podemos copiar essa linha da documentação ou simplesmente digitá-la NPM, eu no instalador do FPH FFmphg. Estamos usando o G, o que significa que o estamos instalando globalmente. Quando a instalação estiver concluída, executaremos o Canvas sketch, sketch curves Mas desta vez, precisamos acrescentar a traço igual às curvas de saída, que é a pasta para a qual queremos que o arquivo exportado vá, e também precisamos acrescentar o fluxo do traço que é a pasta para a qual queremos que o arquivo exportado vá, e também precisamos acrescentar o e Quando esse esboço é executado com fluxo de traço, podemos pressionar Control Shift S para iniciar o gravador e a animação e seguida, pressionar o mesmo Control Shift S novamente para Agora, dentro de esboços, curvas de saída, vemos um arquivo MP four com nossa animação Na documentação, você também pode encontrar mais informações sobre como exportar animações, incluindo sequências de imagens Então vá em frente e experimente o que vimos até agora. Estou ansioso para ver suas animações na aula do projeto Esta lição foi sobre curvas, mas também aprendemos sobre interação com o cursor, grades dinâmicas e como importar esboços animados E na próxima lição, examinaremos a visualização de áudio 35. Crie o jogo prensado: visualização de áudio consiste em extrair dados de uma fonte de áudio e usá-los para gerar algo Vamos começar de forma simples com um círculo que nos puxa de acordo com uma fonte de áudio Este é um esboço simples e vamos criá-lo do zero Mas há alguns conceitos por trás disso que precisamos examinar primeiro. E começaremos com a forma de tocar música no navegador da web. Vamos começar um novo esboço. Você já sabe o Se estiver usando um editor on-line, basta fazer uma nova cópia do modelo e pronto. Se você estiver usando o terminal, controle C se ele estiver executando outro esboço e, em seguida, Canvas sketch, sketch audios Altere as dimensões para 1080 por 1080. Para reproduzir algum áudio, precisamos de pelo menos três linhas de código. Primeiro, precisamos criar um elemento de áudio HTML. Podemos armazená-lo em uma variável chamada audio e criá-lo com um elemento dot quit audio do documento. Ele não precisa ser adicionado ao corpo do documento. Eu só precisava existir como uma entidade. Em seguida, precisamos fornecer uma fonte com a fonte de pontos de áudio igual e depois passar para um arquivo de áudio que veremos em um minuto. E a terceira linha é uma chamada para audio dot pla para o arquivo de áudio, se você tiver alguma música, salve-a no seu computador, você pode usá-la. Existem poucos formatos de arquivo suportados , incluindo o muito popular P three. Portanto, se você tiver qualquer arquivo MP de três , eles devem funcionar aqui. Se você não tiver nenhum ou se preferir baixar um arquivo de demonstração, posso recomendar o artlest dot, onde você pode baixar músicas isentas de direitos autorais O download dos arquivos é gratuito, mas se você não tiver uma licença, eles virão com uma marca d'água de áudio, o que, no nosso caso é bom porque estamos interessados em aprender a técnica aqui, sempre podemos trocar os arquivos posteriormente Depois de baixar o arquivo, eu recomendei movê-lo para sua pasta de esboços No meu caso, vou criar uma subpasta chamada audio e colar o arquivo MP three dentro dela Isso serve para manter nossos arquivos organizados, mas também para facilitar a referência a eles em nosso código. Por exemplo, agora posso voltar para a linha que estava digitando anteriormente e inserir fonte de pontos de áudio igual à barra de áudio e depois o nome do arquivo Se você estiver usando um editor on-line, precisará inserir uma URL e ela deverá apontar para um arquivo p three hospedado publicamente. Novamente, você pode usar um do artlest DoTo e este é bem longo para você Mas vou disponibilizá-lo na nota abaixo do vídeo. Se você salvar um esboço, perceberá que o áudio ainda não está sendo reproduzido, e isso se deve à política de reprodução automática Podemos adicionar uma propriedade ao objeto de áudio chamada autoplay e defini-la como verdadeira Mas isso ainda não garante que o áudio comece a ser reproduzido e por um bom motivo, que está bem explicado nesta página. Resumindo, não queremos que as páginas da web comecem a fazer barulho repentinamente sempre que quiserem E por causa disso, a reprodução automática de áudio é bloqueada por padrão. Portanto, essa linha aqui não é suficiente para começar a reproduzir áudio. Dependendo da sua configuração, o áudio pode realmente ter começado a ser reproduzido porque o URL que você está usando foi listado como permitido pelo navegador. Mas isso nem sempre é garantido. Precisamos de pelo menos algum tipo de interação do usuário com a página como uma espécie de declaração de intenção. Em essência, basta clicar em qualquer lugar da página. Portanto, precisamos de um ouvinte de eventos do mouse. Vamos criar uma função chamada Ed Listeners. Estamos interessados em clicar em qualquer lugar da janela, então a janela adiciona um ouvinte de eventos, e o tipo de evento pode ser quando o botão do mouse é solto, com o mouse para cima, a função handle pode ser chamada de função como usamos na lista anterior e pode ser uma função anônima embutida como esta Agora, dentro dele, podemos finalmente chamar a reprodução de pontos de áudio. Podemos remover essas duas linhas daqui de cima e também tornar a propriedade de áudio visível para todo o esboço, declarando-a aqui em vez de dentro da função Agora, só precisamos cantar para o ouvinte em algum lugar, e eu vou fazer isso na parte inferior da linha, pouco antes do Canvas Em seguida, salve a página e clique em qualquer lugar. E como temos algum controle agora, podemos converter isso em um botão dizendo, se o áudio for colocado, se o áudio for colocado, chame play ou então chame audio dot post Agora podemos clicar para jogar e clicar novamente para pausar. É disso que precisamos se tudo queremos é reproduzir um pouco de áudio, mas queremos ler os dados de áudio para que possamos visualizá-los Veremos isso na próxima lição. 36. Crie um analisador: Queremos visualizar uma fonte de áudio. Precisamos dos dados de áudio e, para isso, precisaremos da API de áudio da web. A API de áudio da web tem pelo menos um conceito em comum com o IPI da bússola, que é que ela também tem um contexto Estamos usando nosso contexto de renderização em dois D para fazer todo o drone e precisaremos de um contexto de áudio para qualquer coisa relacionada ao som. A forma como funciona é com nós, como podemos ver neste gráfico. Dentro do contexto, teremos uma entrada ou uma fonte, como um elemento de áudio com um arquivo livre de MP, e vamos conectá-la ao destino, que normalmente é o alto-falante do sistema. E nesse meio tempo, podemos conectar vários outros nós, que na verdade não teremos tempo de abordar aqui. A API de áudio da web é muito rica e poderíamos fazer um curso inteiro sobre ela. Vamos nos concentrar em um nó chamado Analyzer, que é o que precisamos para extrair dados de uma fonte de áudio Voltando ao nosso esboço, precisamos criar um contexto de áudio. Para manter as coisas organizadas, podemos escrever uma nova função chamada ret audio e mover essas linhas dentro dela Vamos precisar de algumas novas variáveis que podemos declarar globalmente aqui Deixe o áudio contextualizar o nó da fonte de dados e o nó do analisador De volta à função, vá para o contexto de áudio, igual ao novo contexto de áudio. Então, para nosso primeiro nó, precisamos de uma entrada ou fonte de áudio. Esse será o nó de origem que é igual ao ponto de criação do elemento de mídia do contexto de áudio. E aqui estamos passando os elementos de áudio que criamos. Então, a fonte será nosso arquivo MP três, e precisamos conectá-lo ao destino do contexto de áudio, que é a fala. Agora é hora do nó do analisador, que é o audiocontext dot create Analyzer, e então também precisamos conectar o nó de origem ao nó do Não precisamos conectar o analisador ao destino porque a fonte já está conectada a ele Em seguida, precisamos de uma matriz para armazenar os dados de áudio e ela precisa ser digitada como matriz Mais especificamente, uma matriz float 32. Precisamos especificar o comprimento e podemos usar a propriedade do nó do analisador chamada contagem de frequência Se você está curioso sobre essa propriedade, podemos verificar a página do MDN A contagem de feixes de frequência é propriedade somente de leitura da interface do nó do analisador Geralmente, isso equivale ao número de valores de dados a serem usados na visualização, que é exatamente o que precisamos Isso é para a função de saída de áudio, mas de onde a chamamos? O contexto de áudio também é restrito pelas mesmas regras da reprodução automática Podemos até mesmo criá-lo fora da interação do usuário, mas ele permaneceu em um estado suspenso, o que só poderia ser alterado após algumas interações do usuário. Portanto, é melhor já criá-lo dentro de um manipulador de interação, como nossa função de aplicativo de mouse aqui, mas só precisamos fazer isso uma vez Nem toda vez que há um clique do mouse , podemos adicionar uma condicional na frente dessa linha dizendo apenas chame quit audio se não houver contexto de áudio No primeiro mouse para cima, a propriedade audio context, ela ficará indefinida Em seguida, seremos criados internamente, saia do áudio. E então, para qualquer mouse subseqüente, isso terá um valor e a condicional será falsa O áudio ainda está sendo reproduzido como antes. E agora vamos desenhar alguma coisa. Este será um esboço animado. Portanto, adicione True animado à configuração. Em seguida, dentro da função de renderização, precisamos ler os dados de áudio do nó do analisador em cada quadro com ponto do nó do analisador. Obtenha dados de frequência flutuante e passe-os em nossa matriz de dados de áudio Se tentarmos executar isso agora, haverá um erro no console, que diz que Cantad properties of defined Isso porque o nó do analisador não é criado até que haja um clique Então, precisamos levar isso em consideração e pular qualquer coisa que tenha a ver com o contexto de áudio até que ele seja criado Uma condição simples que eu faria se não houvesse contexto de áudio, retornaria. Agora, vamos dar uma olhada nos dados. Primeiro, vamos ver o tamanho dessa matriz. Podemos adicionar um rápido registro do console aqui em Quit Audio e verificar o tamanho dos dados de áudio, que é o mesmo que a frequência que está sendo contada. Podemos clicar em qualquer lugar e ver que é 1024. Caso um número diferente apareça para você, não há nada com que se preocupar. O que queremos é uma média de todos esses valores dentro dos dados de áudio. Eles são todos valores numéricos, então só precisamos somá-los e dividir a soma pelo número dos valores Vamos criar uma função para isso chamada get average. Ele recebe um parâmetro chamado data, que sabemos que será uma matriz de valores. Então, precisamos de uma variável chamada soma, que começa em zero, e então, para cada item dentro dos dados, vamos somar mais colchetes de dados iguais Depois que o loop terminar, podemos retornar a média, que é a soma dividida pelo comprimento dos pontos dos dados Agora, dentro da função de renderização depois de extrairmos as frequências do nó analisador, podemos armazenar a média em uma variável chamada AVG, que é igual a obter a média e passar na matriz de dados de áudio Agora, com esse valor, podemos finalmente desenhar nosso círculo. Começamos com o salvamento de pontos de contexto e a restauração de pontos de contexto. Em seguida, traduzimos o contexto para o centro da tela. E defina a linha com ela para dez. Em seguida, para a forma, ponto de contexto começa Path , o arco do ponto de contexto começa no meio em 00 e o raio será AVG Mas como o AVG pode ser um número negativo, precisamos agrupá-lo com um ponto matemático aBS, que nos dá o valor absoluto sem o lado Então, ele converte um número negativo em positivo e o ângulo inicial zero e o ângulo final ponto matemático Pi vezes dois e, finalmente, o traçado do Context Dot Há algumas coisas a serem melhoradas aqui que vamos analisar. A mais óbvia é que, quando publicamos o áudio, não colocamos o esboço Para controlar o estado de reprodução do esboço, precisamos acessar algo chamado gerenciador de esboços Há um exemplo de como obtê-lo aqui, e podemos ver imediatamente que é por causa de uma sincronização e um peso. Demos uma olhada antes de qualquer aula anterior e mencionei que elas seriam úteis, e é aqui que precisamos delas. Em vez de apenas copiar o exemplo, vamos escrevê-lo nós mesmos. Começamos declarando uma variável global chamada manager e, em seguida, precisamos trazer essas duas chamadas para uma função de sincronização, que chamarei de start A chamada para o Canvas é sketch return, uma referência ao gerenciador de esboços, que vamos armazenar em nossa variável de gerenciador, e precisamos preparar o peso para essa Essa é uma função de sincronização. Depois de termos o gerenciador, já podemos iniciar o esboço no estado oposto à pose de pontos do gerenciador, e reproduziremos o esboço somente quando o áudio Podemos controlar isso dentro do nosso manipulador de mouse up e adicionar algumas linhas aqui Baixa reprodução de pontos de áudio, adicionamos o gerenciador de reprodução de pontos. Abaixo da pose de pontos de áudio, adicionamos a pose de pontos do gerenciador. Nada está acontecendo ainda porque esquecemos de chamar nossa função inicial. Então, vamos fazer isso. Agora é jogar quando clicamos e pausar quando clicamos É um bom começo. Vamos nos aprofundar um pouco mais na próxima lição. 37. Aprenda a criar frequências: Chegamos a esse ponto sem mencionar um termo chave para análise de áudio. É FFT FFT significa transformação rápida de Fourier e é um algoritmo que converte um sinal contínuo como uma onda sonora, em um componente de frequências diferentes Essa é a função principal do nó do analisador, e podemos alterar o tamanho do FFT para ler mais ou menos dados e retornar mais ou menos desses componentes O valor padrão é 2048 e o motivo pelo qual a frequência contada é 1024 porque é sempre a metade do tamanho do FFT Se quisermos menos grãos, podemos definir o tamanho do FFT como 512 Por exemplo, esse valor sempre precisa ser uma potência de dois. Agora, vamos dar uma olhada no que está dentro da matriz de dados de áudio. Há muitos dados bloqueados em cada quadro. Então, vou pausar o esboço e dar uma olhada em um desses Agora existem 256 Vallos. E se olharmos para os primeiros cem, podemos ter uma ideia do alcance desses vals. Podemos ver que estão todos abaixo de zero. Por que isso? Para entender isso, precisamos examinar mais de perto o nó do analisador, partindo dos dados de frequência flutuante G. Cada item na matriz representa um valor de discípulo para uma frequência específica Então, o valor que estamos vendo aqui é indiscípulo. Podemos ter uma ideia do intervalo desse valor se voltarmos uma página e verificarmos essas outras propriedades do nó analisador Discípulo principal e discípulo máximo. O mínimo padrão é -100 e o máximo padrão é -30 Essas propriedades estão aqui para outro método chamado get byte frequency data, que retorna o valor em bytes mapeado para esse intervalo, mas estamos usando get float frequency data, que não é afetado por esse mínimo e máximo, ainda podemos usá-los como uma Podemos esperar valores aproximadamente entre -100 e -30. E é por isso que todos os números que vemos são negativos. É também por isso que, quando fazemos um esboço, o círculo parece encolher sempre que há um som alto, porque o número absoluto fica menor É melhor remapear esse valor para algo mais fácil de usar, como um intervalo de 0 Mais uma vez, podemos contar com o Canvas sketch UTL e usar a função de intervalo de mapas do modelo matemático No modo offline, já o instalamos. No editor on-line, você precisa pará-lo novamente como uma dependência para cada esboço, e você já sabe como fazer Basta inserir Canvas sketch Util na caixa de dependência e, em seguida, exigi-lo com math require Cv sketch Agora podemos criar uma variável mapeada e atribuí-la ao ponto matemático Maprench De discípula mínima e discípula máxima a zero e um. E, nesse caso, queremos que o último parâmetro seja verdadeiro porque queremos restringir esses valores de 0 a E o raio do nosso círculo agora será mapeado vezes 200. O círculo agora está ficando maior sempre que o som está mais alto, mas, na maioria das vezes, não vemos o círculo Então, o que está acontecendo aqui? Vamos registrar o valor de Map para descobrir. Parece ser zero na maior parte do tempo. Precisamos verificar os dados de áudio novamente. A maioria desses valores é, na verdade , tão baixa que eles são essencialmente silenciosos. Eles estão diminuindo nossa média e nem vemos o círculo, mesmo que ainda possamos ouvir a música. Portanto, a média não é realmente muito útil para a visualização Podemos encontrar valores mais úteis perto do início da matriz se trocarmos a média por um único valor, digamos, índice 12 Então o círculo está de volta. A maior parte da energia está concentrada no início da matriz de dados de áudio. E para explicar por que esse é o caso, precisaríamos de uma aula muito mais longa. Mas deixe-me dar uma versão curta. Eu tenho outro esboço aqui mostrando uma contagem de feixes de frequência de 32 em vez de 256 Cada viga é representada por uma barra vertical e a altura da barra é um mapa de valor indiscutível até a metade da altura da tela No lado esquerdo, temos as frequências baixas, começando em zero hertz e no lado direito, a alta frequência até cerca de 22.000 hertz, a alta frequência até cerca de 22.000 hertz, que está aproximadamente alinhada com a O intervalo entre os nós de baixa frequência em uma escala é muito menor do que nos nós de alta frequência. Os nós são espaço logarítmico e as curvas FFT são espaçadas Quando obtemos os dados de frequência do nó do analisador, obtemos muitas frequências baixas, agrupadas em algumas ligações, enquanto as frequências mais altas são distribuídas em vários compartimentos enquanto as frequências mais altas são distribuídas em Portanto, esse lado da carta sempre tenderá a ter valores mais altos. Há mais detalhes aqui, que estou omitindo, mas espero ajudar a entender um pouco dos dados com os quais estamos lidando. E agora podemos voltar ao nosso esboço. Não estamos criando uma ferramenta para exibir dados de áudio precisos. Podemos usar nosso próprio critério e escolher valores que pareçam bons Como fizemos aqui com esse índice 12, eu diria, vamos fazer o mesmo com mais alguns valores. Vamos sair de uma matriz chamada Beans inicializá-la com três valores Vou usar quatro, 12 e 37. Então, dentro da função de renderização, podemos sair de um loop de zero até Bin dot Link. Mova todo esse código para o loop. Podemos nos livrar da média e criar uma nova variável chamada Ben, que são colchetes I. Em seguida, na ramificação MA, usamos colchetes de dados de áudio Ben e aumentamos o raio um pouco, aumentamos e criar uma nova variável chamada Ben, que são colchetes I. Em seguida, na ramificação MA, usamos colchetes de dados de áudio Ben e aumentamos o raio um pouco, aumentamos para 300. No momento, quais são as frequências reais que estamos visualizando aqui? Na verdade, eu não sei. Precisamos saber? Eu acho que não. Como eu disse, estamos atrás de algo que achamos que parece bom. E temos a liberdade de escolher qualquer parte dos dados de áudio que seja adequada para nós. 412 e 37 são apenas números aleatórios que escolhemos. Sinta-se à vontade para escolher qualquer número que quiser e ver como é. Se você achar que o círculo está muito irregular, você pode alterar a constante de suavização Do valor padrão, que é 0,8 para algo maior, vou tentar 0,9. Agora que sabemos um pouco mais sobre os dados que estamos usando, é hora de mudar o foco para o visual na próxima lição 38. Aprenda a criar áudio para arcos: Com o nó analisador, obtemos que todos esses valores representam as diferentes frequências da fonte de áudio Eles mudam com o tempo, o que é ótimo para animação. O que resta a fazer é desenhar algumas formas interessantes para acompanhá-las. Uma das coisas que eu gosto de fazer para inspirar é folhear alguns pôsteres clássicos Gosto de imaginar como eles ficariam se fossem um reator de áudio Esta série de Jessica Swenson combina muito bem com isso. Nesta lição, vamos tentar recrutar esse. Você pode ver que há vários círculos constantes e eles são cortados de uma forma mais ou menos organizada Quanto maior o círculo, mais grossos são os arcos. Então, temos uma sensação de profundidade. Mesmo que tudo o que temos sejam duas formas D bastante simples. De volta ao nosso esboço, podemos começar declarando algumas variáveis num círculos, que eu vou definir para cinco e num fatias, que vou definir para nove O valor de cada fatia e brilho será matemático Pi vezes dois, que é o círculo completo dividido pelo número de E então o raio base do nosso primeiro círculo será 200 Eu também quero mudar a cor de fundo para algo branco como EEA e zero. Podemos pular a parte de áudio por enquanto e comandar essas linhas para focar no desenho Vamos precisar de dois para fazer loop mais um com a letra I, fazer loop e lançar o número de círculos. E dentro dele, precisamos de outro loop com a letra G, faça um loop e lance o número de fatias de cada círculo. Podemos mover, salvar e traduzir fora desses loops porque só precisamos traduzir o contexto uma vez E então, dentro do segundo loop, podemos usar essas linhas para desenhar nossos arcos. Mas em vez de desenhar um círculo completo de zero a Pi vezes dois, desenhamos um arco de zero a fatia E podemos nos livrar do resto do circuito antigo. Não precisamos mais disso. Isso é desenhar todos os arcos um em cima do outro Precisamos compensá-los radialmente girando o contexto em cada fatia Portanto, precisamos de outro bloco de salvamento de pontos contexto e restauração de pontos de contexto para cada círculo. E para cada fatia, precisamos de uma rotação de pontos de contexto Slice This é melhor, mas ainda precisamos deslocar o círculo de acordo com o raio Poderíamos fazer algo como raio mais I vezes 50, mas isso seria uma escala linear E se olharmos para a referência original, podemos ver que a escala definitivamente não é linear Não sei exatamente o que impulsiona a escala aqui, mas parece que os arcos crescem exponencialmente, e isso me leva a outra técnica muito útil para codificação criativa Normalmente são usados para animação, mas também podem ser usados para qualquer valor numérico Digamos que você tenha uma escala 0 a 5 e a divida em cinco etapas Com uma função linear, todas as etapas são iguais. Então, na primeira etapa, estaríamos em um. Na etapa dois, estaríamos em dois, etc. Com funções diferentes como esta, na primeira etapa, ainda estaríamos em algum lugar próximo de zero. Na segunda etapa, um pouco mais acima. E então, em algum momento por volta das etapas três e quatro, o valor aumentaria rapidamente Algumas dessas funções são bem conhecidas e documentadas por Robert Penn. Eu mencionei que nossos círculos cresceram exponencialmente, mas talvez esse não seja o caso Talvez tenham crescido quadraticamente, cubicamente ou talvez acordo com uma função diferente, que não está aqui Mas certamente uma delas servirá para nós , como seria de esperar, já existem bibliotecas com função ESN que podemos usar, e aquela que estou sugerindo se chama ESIS No editor on-line, basta digitar ESS. Na caixa de dependência do terminal, pressione Control C, PMI ESS E quando a instalação estiver concluída, Canvas, esboço de áudio para executar um esboço novamente. Em seguida, no topo. Es é igual a exigir Ess. E antes de usá-lo, vamos dar uma olhada em nossa referência. Podemos ver os arcos crescerem junto com o raio. Se dissermos que os arcos são linhas , o raio varia acordo com a largura das Isso significa que podemos usar nossa função de atenuação para definir a linha com ela e apenas calcular o raio a partir delas Então, vamos criar uma nova variável chamada linewid e uma nova linha de código variável com ela Em seguida, um laço para cada círculo. Para a função EM, precisamos de um número 0-1, que vou armazenar em uma variável chamada T e defini-la como dois Eu dividi por um círculo menos uma linha, com e dot expo e T vezes o maior valor possível que vou definir como 100 e, em seguida, empurrar linewid para dentro da linha com Agora podemos substituir nossa linha definida como dez por linha com ela. I e o raio mais a linha de pontos de contato com ele. Isso ainda não está certo. O problema é que as linhas são desenhadas a partir do centro do traçado. Precisamos de apenas metade da linha para o arco e precisamos compensar o raio pela linha completa ao lado dele. Podemos fazer isso fixando o raio em outra variável que vou chamar de raio C, e ela é definida como o raio base no início de cada quadro, depois incrementada pela linha atual com E podemos desenhar o arco usando o raio C mais a largura da linha de ponto de contato vezes 0,5 Agora temos um ajuste perfeito e parece que a Expo foi uma escolha extrema para uma função Eason Então, vamos tentar com o Quag. Isso parece melhor. Também notei que falta o primeiro círculo porque a menor linha possível com ele é zero, então podemos ter um valor mínimo aqui e adicionar algo como 20. Isso parece bom. Agora vamos trazer de volta os dados de áudio. No momento, temos uma matriz para nossos feijões com três tamanhos arbitrários e de tamanho de prato Queremos um feijão por fatia, então vamos remover isso. Crie uma variável chamada bin e precisamos de uma nova iteração de loop em todos os círculos, tempo e todas as fatias Então, o índice do compartimento pode ser qualquer número dentro de um determinado intervalo. Fizemos algo assim antes de usar o modelo aleatório Chrom Canvas sketch Então, vamos usar isso novamente. Precisamos exigi-lo primeiro. Em seguida, defina bin como um limite de intervalo de pontos aleatório porque queremos apenas números inteiros ou números com piso porque queremos apenas números inteiros ou e o intervalo pode ser o que você quiser Vou configurá-lo para 4-64. Em seguida, empurre ben para a matriz Bins. Podemos comentar essa linha porque estamos usando os dados de áudio novamente. E dentro do segundo loop, recebemos uma amostra de Bins Colchetes I vezes a fatia NAM mais G. A primeira parte é para cada círculo e a segunda parte é para cada fatia Os dados precisam ser mapeados novamente, assim como fizemos antes Eu só quero escrevê-lo de uma forma mais organizada. Agora vamos declarar mais algumas variáveis. Aqui, adicionamos mapeado e aqui visível a todo o esboço, adicionamos DB médio e DB máximo. Eles são apenas mais curtos para serem gravados, e podemos configurá-los como apenas um áudio interno para sair. O DB médio é igual a analisar um nó. Muitos desabilitam o máximo de dB, analisam um nó, o máximo de decibéis analisam um nó, o máximo De volta à função de renderização, definimos Mapped equals para mapear a ramificação do mapa de pontos, dados de áudio, colchetes de DB médio e DB máximo para zero e um, e fixamos o valor com verdadeiro Esse valor pode ser usado para conduzir a linha com ele. Então, linha com ela é igual a linha com ela. Colchetes I vezes mapeiam, então só precisamos definir a linha de pontos de contexto com ela para alinhá-la novamente. Ok, isso está meio que funcionando. Vemos cada fatia ser construída de acordo com uma frequência diferente nos dados de áudio, o que é bom. O. Mas isso ainda precisa de alguns ajustes. Às vezes, a largura da linha é um número inválido, então o contexto se apega ao número válido anterior, o que faz com que alguns dos arcos pisquem de uma forma estranha Podemos corrigir isso com uma condicional. Se a linha wd for menor que um, continue e pule o resto do código abaixo A outra coisa é que o círculo está cheio. Estamos desenhando todas as fatias, mas ficaria melhor se desenhássemos apenas algumas delas aleatoriamente. Podemos usar nossa matriz de beans para isso. Adicionamos outra condicional aqui. Se foi é zero, continue. E então dentro do loop onde definimos os compartimentos. Podemos definir alguns deles como zero aleatoriamente. Se o valor aleatório for maior que 0,5, igual a zero. Agora está melhor. pode testá-lo com outros audiófilos, se quiser Esse é o nosso esboço. Espero que você goste. Como um bônus, veremos uma variação disso na próxima lição. 39. Aprenda sobre a criação de pôster: O pôster que inspirou nosso esboço foi baseado em outro pôster, um clássico do designer suíço Joseph Mueller designer suíço Joseph Mueller Isso é de 1955 e inspirou muitas pessoas Existem dezenas de remixes e variações online. Vamos criar nossa própria versão aqui, com base no código que escrevemos até agora. Eu sugeriria fazer uma cópia do esboço antes de começar Vou chamar meu sketch Audio two e depois executá-lo via terminal Não vou mostrar o editor online desta vez porque você já sabe o que fazer. Vamos começar alterando o número de fatias para apenas uma. Em seguida, declare uma nova variável chamada PHI, que é uma letra grega para armazenar o ângulo da fatia Podemos excluir essa linha que define alguns beans como zero e rolar para baixo até a função de renderização, também podemos remover essa condicional E essa linha, que está mudando a linha com ela, então vamos definir pi como tempos de fatia mapeados E onde estamos desenhando o arco, vamos trocar a fatia por Ok, isso já não está muito longe de nossa referência, mas precisamos deixar uma lacuna entre os arcos e podemos fazer isso adicionando alguns pixels ao raio Ou, na verdade, nesse caso, é melhor incrementarmos o raio antes da função arco E então, no final, incremente-o novamente na outra metade da largura da linha Agora só precisamos deslocar esses arcos que não estejam todos alinhados no início Podemos criar uma nova matriz aqui chamada deslocamentos de rotação Precisamos de um valor por círculo novamente para que possamos até mesmo usar esse loop. Vamos criar um novo para a rotação para manter as coisas separadas. Rotação de set dot push, chave de pontos aleatória, ponto matemático Pi vezes -0,25 e ponto matemático Pi vezes 0,25 Isso nos dará um ângulo aleatório entre -45 graus e mais 45 graus. Agora podemos girar o contexto uma vez por círculo logo após salvar o ponto do contexto, inserimos Rotação do ponto de contexto, rotação dos colchetes definidos I Se quisermos olhar ainda mais perto do pôster de referência, podemos subtrair 90 graus Então, menos o ponto matemático pi vezes 0,5. E se você não gostar do movimento no sentido horário, pode simplesmente espelhar todo o esboço no eixo Y definindo a escala para um e menos um Ajuste final, defina a primeira linha com este 210. E aí está nossa humilde homenagem à peça clássica de um design gráfico Você pode tentar usar um número diferente de círculos ou fatias ou um es diferente na função, ou pode até tentar adicionar pouco de cor com base nas delícias que vimos nas lições anteriores Outra ideia é que você encontre suas próprias referências de design e tente recrutá-las e torná-las também reativas ao áudio Jim. Nesta lição, aprendemos como acessar dados de áudio para criar imagens reativas de áudio Nós apenas analisamos a superfície da API de áudio da web. Espero que você tenha achado interessante e talvez tenha deixado você curioso para continuar investigando e aprender mais sobre o assunto Agora vamos sair do áudio e começar algo diferente na próxima lição. 40. Desenhe uma única partícula: Nesta lição, vamos criar nosso último esboço, e o tema é partículas Não há nada de especial nas partículas afogadas. Eles podem ser apenas pequenos círculos. A parte interessante é como eles se comportam. Como fizemos até agora no início de cada aula, precisamos criar um novo esboço No editor on-line, crie outra bifurcação do modelo padrão mais uma vez No terminal, insira Canvas, traço esboço, partículas de esboço, traço novo, abra o arquivo JavaScript no editor e altere as dimensões Vamos começar de forma simples e desenhar uma única partícula. Mas primeiro, precisamos definir o que é partícula. Na parte inferior do arquivo, vamos criar uma nova classe chamada partícula no construtor, um objeto com três propriedades X Y e raio com um valor padrão Em seguida, armazenamos essa propriedade como variáveis numéricas com esse ponto X igual a X, esse ponto Y igual a Y e esse raio de ponto igual ao raio Por enquanto, precisamos apenas de uma função para desenhar a partícula, que usa o contexto como parâmetro Essa parte deve ser muito familiar agora. Começamos com Context dot save e context dot restore, depois traduzimos o contexto para esse ponto x e esse ponto Y, depois iniciamos uma nova forma com context dot start Path e desenhamos um círculo com arco de pontos de contexto, x0y0 Esse raio vai de zero à matemática Pi vezes dois, então chamamos preenchimento, e podemos definir o estilo do campo para Y dessa vez, volta ao topo do arquivo ucrite e raio Para armazenar outros objetos de partículas, então, dentro da função de esboço, podemos declarar X Y e Agora, para preencher a matriz, precisamos de quatro loops, e vou definir isso para apenas uma iteração por Podemos aumentar os números mais tarde. X estará no meio da tela, então vezes 0,5 e Y de altura vezes 0,5. Lembre-se de que esses valores estão disponíveis na função sketch, mas precisamos declará-los antes de usá-los Agora, a partícula pode ser uma nova partícula passando em X e Y, e podemos deixar o raio como o E então empurre a partícula para dentro da matriz de partículas. Até a função de renderização, altere a cor de fundo para preto e crie o loop para cada partícula chamado ponto de partícula w, passando pelo contexto E aí está nossa partícula, ajuste... no meio da tela e não é muito Para torná-lo mais interessante, precisamos adicionar mais propriedades a ele e vamos emprestar alguns nomes da física X e Y podem ser rotulados como posição. Então, precisamos de mais duas propriedades para aceleração, AX e AY. Mais dois para velocidade, VX e VY, e mais dois para a posição inicial, Ix e IY, que são essencialmente cópias de X e Y. Então, precisamos de uma nova função chamada update, que vamos chamar em cada quadro do esboço para que possamos ir até a configuração e definir Então, pouco antes de chamarmos o desenho de pontos de partículas, também chamamos de atualização de pontos de partículas Dentro da atualização, vamos incrementar a velocidade pela aceleração com esse VX mais igual a esse machado e o mesmo para VY e Vamos incrementar a posição pela velocidade com esse ponto X mais igual a esse ponto x e esse Y mais igual a esse ponto y. Com isso no lugar, tudo o que resta fazer é aplicar alguma força Podemos fazer isso incrementando a aceleração, exatamente como por enquanto, em um número minúsculo como Isso faz com que a partícula acelere gradualmente e saia da tela Na próxima lição, veremos maneira mais interessante de aplicar forças à partícula 41. Aprenda sobre a aplicação de forças: Vamos fazer com que a partícula se afaste do cursor Precisamos revisitar um tópico que abordamos anteriormente, que é a interação do cursor Esta parte será familiar e você pode abrir curvas de esboço para copiar algum código a partir daí, se quiser Ou podemos simplesmente digitá-lo novamente, pois não há muito o que digitar. Começamos com uma variável global chamada I Canvas. E defina-o como Canvas, que é uma propriedade que também precisamos expor no perímetro da função de esboço Em seguida, adicionamos um ouvinte de eventos ao Canvas. Para pressionar o mouse, chame o manipulador com o mouse para baixo após a função de esboço. Declaramos uma nova função chamada com o mouse para baixo, tomando o objeto de evento E como parâmetro Aqui, adicionamos dois novos ouvintes à janela, um para mover o mouse e outro para cima Estou me movendo um pouco mais rápido desta vez porque já vimos isso antes. Declare ao mover o mouse também com E como parâmetro e ao mover o mouse para cima sem parâmetro Aqui sabemos que podemos remover o ouvinte de eventos, nós o adicionamos com o mouse para baixo. Voltando ao movimento do mouse, podemos calcular a posição do cursor proporcional à escala do esboço com a mesma fórmula que usamos na curva de esboço entro X igual a entre parênteses, E desligue X dividido por L Canvas, ponto, largura do deslocamento e, em seguida, multiplique isso pela largura da Em seguida, duplique a linha e troque X por Y e Largura por Desta vez, não precisamos copiar essas linhas e colá-las dentro do Mouse down. Em vez disso, podemos delegar a lógica ao movimento do mouse chamando-a do mouse para baixo. Agora precisamos armazenar a posição do cursor em um objeto que seja visível em todo o esboço Então, vamos criar um aqui em cima. Chame-o de cursor e atribua a ele duas propriedades, X e Y. Começando com o mesmo número grande e, em seguida, com o movimento do mouse, configuramos o cursor X igual a X e o cursor Y igual a Y. Com o mouse para cima, podemos redefinir esses valores para um número grande novamente, apenas para garantir que eles não estejam nem perto da partícula quando não estivermos arrastando o Agora podemos registrar esse objeto para ver se ele está funcionando corretamente. E deveríamos ver um número próximo de zero nessa esquina e um número próximo a 1080 nessa esquina Agora precisamos calcular a distância entre o cursor e a partícula Já fizemos isso antes em nossa função de teste de TI. Desta vez, vamos fazer isso dentro da atualização. Vamos declarar algumas variáveis. DX DY, DD e esse Delta. DX é a diferença entre esse ponto x e o ponto do cursor X. DY é a diferença entre esse ponto y e o ponto do cursor E DD é a hipotensão que é a raiz quadrada do ponto matemático, dx vezes dx mais dy vezes Então, precisamos de uma condicional se DD for menor do que algo, e isso também pode ser armazenado em uma propriedade Então, vamos criar um aqui em cima. Chame-o de Min dist e defina-o para 100. Agora, de volta à condicional, se DD for menor que esse ponto Min Dist, e aqui é onde vamos definir a aceleração Queremos um valor proporcional ao inverso da distância, o que proporcional ao inverso da distância, o significa que é mais forte quanto mais próximo o cursor estiver da partícula E é por isso que precisamos de uma variável chamada Delta, que será uma distância mínima menos a distância atual DD Então Ax pode ser definido como DX dividido por DD multiplicado por esse E o mesmo para AY. Agora, se clicarmos e arrastarmos o cursor para perto da partícula, ela será disparada na direção oposta A força de impulso é muito forte. Precisamos multiplicar o que calculamos por um pequeno número, que podemos armazenar em uma nova propriedade chamada fator de impulso Vou configurá-lo para 0,02 e depois multiplicar AX e AY por Essa é a força de impulso e também queremos puxar a força. Isso trará a partícula volta à sua posição inicial Agora vou escrevê-lo antes da força de impulso, porque ele age constantemente na partícula independentemente de onde o cursor esteja Desta vez, dx é esse ponto x menos esse ponto X, e Dy é esse ponto ay menos esse ponto y. Ax será Dx vezes esse fator de atração do ponto, que vamos declarar daqui a E AY é DY vezes o fator de atração. Vamos declarar o fator de tração aqui, configurando-o para 0,004 Agora, sempre que entrarmos nessa condição, a força de impulso substituirá a força de tração, mas queremos que elas sejam adicionadas, então precisamos de mais iguais Isso faz com que a partícula tente voltar à sua posição original, mas nunca para de verdade. Ele continua ganhando impulso e ultrapassando o alvo. Precisamos acalmá-lo com um fator de dumping, que vou definir para 0,95 E usamos isso depois de calcular a velocidade, então multiplique VX e VY por esse fator de ponto Dam Agora, o comportamento está muito mais sob controle, e podemos sentir as duas forças agindo sobre a partícula quando tentamos afastá-la e ela tenta voltar à sua posição original Isso é divertido, mas é só uma única partícula. Vamos fazer mais deles na próxima lição. 42. Como distribuir as partículas: Vamos criar várias partículas e, como fizemos anteriormente no curso, as distribuiremos pelo Canvas usando uma função aleatória. Vamos usar uma função diferente do Canvas sketch UTLT time chamada Inside Mais uma vez, se você estiver usando o editor on-line, vá até a caixa de dependências e digite CasketchTo Você precisa portar o módulo aleatório na parte superior do arquivo. Esboço em tela UT aleatório. Em seguida, podemos criar uma nova matriz para armazenar as posições aleatórias chamadas pose. Altere nosso loop for 1-200 e, em seguida, chame um ponto aleatório dentro do círculo, e o primeiro parâmetro é o raio que estou configurando para 400 E o segundo parâmetro é a matriz para X e Y aleatórios, que será pose. Então, essa função preenche a matriz com um X aleatório e um Y aleatório. Já temos X e Y no meio da tela, então só precisamos adicionar o colchete de pausa de zero a X e colocar o colchete um a Y. E agora temos nossas partículas distribuídas aleatoriamente dentro do círculo. E agora temos nossas partículas a matriz com um X aleatório e um Y aleatório. Já temos X e Y no meio da tela, então só precisamos adicionar o colchete de pausa de zero a X e colocar o colchete um a Y. E agora temos nossas partículas distribuídas aleatoriamente dentro do círculo. Já usamos uma distribuição aleatória antes e, embora funcione e tenha uma aparência muito boa, às vezes também é um pouco preguiçosa Podemos encontrar outras formas interessantes de distribuir as partículas e, mais uma vez, podemos encontrar alguma inspiração em alguma referência existente Pesquisei um pouco e encontrei essa imagem de Paul McNeil. Acho que vamos tentar recriar isso em um código, eu trato esses pontos como uma Vou ajudá-lo na lógica por trás da recriação desse layout de partículas Mas a intenção aqui é fazer com que você pense sobre a lógica por trás de qualquer arranjo ou layout que você queira criar. Fazendo uma análise rápida desta. Eu vejo um círculo concêntrico começando do centro e crescendo À medida que ficam maiores, abrem espaço para mais pontos, e os pontos parecem manter uma certa distância um do outro Portanto, quanto menores os pontos, mais afastados eles estão Isso nos dá um ponto de partida. Precisamos descobrir quantos desses pontos podemos encaixar ao longo das circunferências desses círculos Você deve se lembrar que a fórmula para as circunferências do círculo é dois Pi R. Então, se pegarmos um círculo com um raio de 100, as circunferências seriam duas vezes três pontos, 14 vezes O que é aproximadamente 628. Podemos abrir o círculo e representar as circunferências como uma única linha Então, para encontrar o número de pontos, dividimos isso pela largura de cada ponto Digamos que se a largura de cada ponto for 60, então seis a 8/60 é dez Pontilhe algo com um número de pontos no chão, o que significa que podemos colocar dez pontos inteiros ao longo das circunferências Espero que essa explicação tenha sido feita agora, vamos escrevê-la em código. Começamos com alguns novos círculos numéricos variáveis definidos em 15, depois o raio do ponto, que é igual a 12, depois o raio do círculo, que pode começar em zero, depois o raio de ajuste, que é igual ao raio inicial do Pode comentar os quatro ciclos que escrevemos anteriormente e escrever um novo de zero a um círculo. Dentro dele, precisaremos de outro loop com a letra G indo de zero a NumFit Num fit é o número de pontos que podemos colocar ao longo do círculo e ainda precisamos calculá-lo Primeiro, precisamos das circunferências, que são o ponto matemático Pi vezes duas vezes o raio do círculo, do NumFit, que são as circunferências divididas pela largura do ponto, que é o que Não queremos nenhuma infração, então precisamos reduzir esse valor e também levar em consideração o primeiro ponto quando o raio do círculo é zero, então precisamos de uma exceção Podemos escrevê-lo como uma única linha aqui. Se eu usar essa fórmula, L é definido como nu fit como um. Então, quando I for zero, inapto será um. Caso contrário, será calculado com base nas referências do circo A última variável aqui será o tamanho da fatia. Depois de dividirmos o círculo por não ajustado, então o ponto matemático Pi vezes dois dividido por nu fit. Agora, dentro do loop interno, podemos calcular o ângulo de cada ponto e começar em uma nova variável chamada Teta, que é fatia ajustada vezes G. Para encontrar a posição X e Y, usamos uma fórmula que vimos antes , em usamos uma fórmula que vimos antes X é o cosseno de teta vezes o raio do círculo e Y é o seno do Teta vezes o próxima parte é a mesma antes: partícula igual à nova partícula, X e Y e partícula ponto-empurra partículas E agora a parte fundamental é continuar aumentando o raio do círculo em cada iteração Então, o raio do círculo mais é igual ao raio dos pés vezes dois. Vamos fazer isso e chegamos a algum lugar, mas ainda não chegamos lá. Precisamos mover o círculo para o centro do esboço, então precisamos adicionar largura vezes 0,5 e altura vezes 0,5 a X e Y novamente. Os pontos estão muito próximos, então precisamos adicionar algumas lacunas, uma variável para as lacunas entre o círculo, que vou definir como oito e depois adicioná-la ao raio do círculo no final do loop Também precisamos de uma variável para a lacuna entre cada ponto, que vou definir como quatro e adicionar à largura do ponto aqui. Agora, para tornar alguns desses pontos menores, definimos o raio da partícula para o raio No final do loop, podemos alterá-lo com base na divisão por um círculo vezes o raio de ajuste Na verdade, precisamos do oposto, um menos dividido por um círculo, e estamos quase lá Essa linha é uma alteração no tamanho dos pontos usando uma função linear Como vimos na lição anterior, também podemos usar a função ESN. Então, vamos importar o mesmo modelo. ESS, novamente, não se esqueça de instalar a dependência se você estiver usando um editor online, então o custo ss é igual ao requisito de ESS e podemos usá-la aqui como um menos Est quad out, eu divido por Isso é mais elegante. E embora não seja exatamente como a referência, acho que é bem parecida e parece melhor do que pura aleatoriedade. Agora, para tornar o comportamento mais interessante, podemos entrar na classe de partículas e randomizar os valores Em vez do fator de impulso de 0,02, podemos ter um intervalo aleatório entre 0,01 e 0,02 O mesmo para o fator de tração com uma faixa entre 0,002 e 0,006 Um fator de despejo pode variar entre 0,90 e 0,95. A distância mínima também pode variar 100 a 200. Vamos executar isso. Acho que está tudo bem. As partículas ainda se comportam da mesma forma que antes, mas de alguma forma é melhor examiná-las com esse layout. Temos o comportamento das partículas e temos uma distribuição interessante, e na próxima lição vamos trazer algumas cores 43. Como modificar escala e cores: Dentro da função de atualização, temos acesso a alguns valores que podemos usar para afetar o visual. Por exemplo, podemos aumentar a partícula mais longe ela estiver de sua posição inicial Vamos criar uma nova propriedade chamada scale e defini-la como uma. Em seguida, na função de desenho, multiplicamos o raio pela escala Na atualização em que estamos calculando DX e DY para a posição inicial, também podemos calcular o Hypotens e Baseie-o aqui para obter o DD. Em seguida, com base no DD, podemos mapear a escala a organizada e sabemos exatamente qual modelo precisamos para isso. Então, vamos importá-lo. É o modelo matemático do Canvas SkettL e, em seguida, voltando à escala, vamos mapear o intervalo com base no DD 0-200 Altere a escala da partícula de 1 a 5 salve o arquivo, e isso parecerá bem interessante Você poderia usar a mesma ideia e alterar mais propriedades das partículas, como as cores? Essa é outra boa opção para a biblioteca de mapas de cores, nós a usamos em curvas de esboço Já o temos sem estilo, mas se você for um editor on-line, precisará fazer isso para cada Então, insira o mapa de cores para desestilizá-lo. E, em seguida, exija um mapa de cores, um mapa de cores frontal. Declare uma nova variável chamada cores, defina-a como mapa de cores, abra colchetes e, para o mapa em si, usarei Varies Então, para o número de tons, vou usar 20. Podemos excluir esse outloop comentado porque não vamos mais usá-lo e, em seguida, rolar para baixo a classe de partículas e declarar uma nova propriedade chamada color, que pode ser definida como colchetes coloridos Na atualização, queremos outro intervalo mapeado, assim como temos para a escala Mas desta vez para o índice da matriz de cores, podemos criar uma variável para o índice de cores e defini-la como base de pontos matemáticos porque o índice deve ser um intervalo de mapa de pontos matemáticos inteiro DD de zero a cem a zero e comprimento de ponto colorido Menos um. Nesse caso, também queremos definir o grampo 22 como o último parâmetro Em seguida, atualize a propriedade de cor para cores, colchetes e a cor Na função de desenho, podemos atualizar o estilo do campo para essa cor de ponto. Isso parece bom, mas talvez seja um pouco estranho ver partículas pequenas na frente das grandes. Eles são desenhados na mesma ordem. Eles foram criados. Então, se você quiser que as partículas grandes apareçam na frente, precisamos alterar sua ordem na matriz. Podemos fazer isso com uma função da matriz chamada sort. Ele funciona comparando pares de valores e classificando as matrizes em um local Acontece que temos um valor numérico apropriado para classificação na forma de nossas propriedades de escala Essencialmente, queremos que escalas menores sejam desenhadas primeiro e maiores que a escala seja desenhada por último. A matriz pode ser classificada por uma ordem ascendente de escalas com uma classificação por pontos de partículas, A e B, e retornar na escala menos a escala Isso parece mais natural agora. Usamos um mapa de cores para atribuir cores às partículas, mas há outra técnica para atribuir cores a elas, que veremos na próxima lição 44. Criando dados de imagem: Esta é nossa última lição, então vamos tentar algo um pouco mais avançado. Vamos definir a cor da nossa partícula, baseá-la em uma imagem e depois misturá-la com as cores de outra imagem Precisamos de algumas imagens para trabalhar. Vou escolher dois do nsplash.com. Eles podem ser baixados gratuitamente e geralmente têm uma licença amigável. O primeiro que vou escolher será este retrato de Art Huntington E também estou escolhendo essa cor para o balão de Jess Gardner Nós realmente não precisamos de imagens de alta resolução. Na verdade, melhor ainda se forem Les. Estou arrastando-os para o Photoshop, cortando-os em um formato quadrado e reduzindo-os para 64 por 64 pixels Estou salvando-os como imagem. 01 e a imagem 02 ficam ao lado uma pasta chamada imagens que eu criei dentro dos esboços Agora, de volta ao código. Vamos criar uma nova função de sincronizadores chamada carregar imagem Ele usa um URL como parâmetro e retorna uma nova promessa. Com determinação e rejeição dentro da promessa, podemos criar um novo objeto de imagem. Então, quando a imagem é carregada, retornamos a resolução e passamos o objeto da imagem. Caso haja um erro, rejeitamos a promessa e, em seguida, definimos a fonte da imagem como a URL que passamos. Essa é uma função de sincronização e queremos que nossa imagem seja carregada antes de começarmos a desenhar Portanto, precisamos fazer algo semelhante ao que fizemos no esboço de áudio e criar uma função de início de sincronização dentro dele Podemos carregar nossa primeira imagem com Emga equals to await E aqui, a URL para mim será a imagem 01. Esse caminho é relativo à pasta de esboços, portanto, se você estiver usando um nome diferente ou uma pasta diferente, certifique-se de usar a correta Se você estiver usando um editor on-line, novamente, precisará de uma URL hospedada publicamente, assim como o arquivo de áudio da lição anterior. Esse da splash, você encontra nos links abaixo do vídeo E somente para o editor on-line, você também precisa definir a origem cruzada como anônima. Caso contrário, você não conseguirá ler os dados de uma imagem proveniente de um domínio diferente. Aqui nós o usamos EMGA, que ainda não declaramos. Então, vamos fazer isso na parte superior do arquivo. Nosso objetivo é extrair dados da imagem, mas podemos fazer isso diretamente do objeto da imagem. O que precisamos fazer é desenhar a imagem em uma tela primeiro, e ela não precisa ser a mesma tela que estamos usando para nosso Então, vamos criar uma nova tela e armazená-la como EMGA Canvas, que é igual ao ponto do documento Create Element Compass E também armazene o contexto EMGA, que é Emga Canvas, canvas dot G Context two D. As dimensões dessa nova tela são as mesmas da imagem que acabamos Então MGA com uma altura ENGA, e só precisamos de uma coisa desse contexto, que é desenhar Imagem Emga X zero e Y zero Se quisermos ver o que há nessa nova tela, podemos desenhá-la em nossa tela principal com uma imagem de desenho de contexto, Emga Canvas 00 E aí está nossa pequena imagem no canto superior esquerdo. Ver isso aqui pode parecer familiar para você. Agora, para extrair as cores da imagem obteremos os dados da imagem. Vamos armazenar em uma variável chamada dados EMGA, que é o contexto AMGA Obtenha dados de imagem de X zero e Y zero até largura e altura MGA. Esse retorno de um objeto do tipo image data e propriedade em que estamos interessados também é chamado de data. Então esse é o que estamos armazenando aqui. É uma grande matriz com valores LGBA sequenciais. Então, para cada pixel da imagem, obtemos quatro itens na matriz. O próximo passo é encontrar o pixel na imagem que corresponde às posições X e Y de cada parte. A imagem equivalente X será X dividido pela largura, multiplicado pela largura da imagem Isso precisa ser um número inteiro, então precisamos envolvê-lo com um piso de pontos matemáticos, depois duplicar a linha e trocá-la por Y Agora, para encontrar o índice dessa posição na matriz de dados da imagem, usaremos algo semelhante ao que vimos antes em nossa lição sobre dados de grade e áudio. O índice é AY vezes a largura da imagem mais X e, como a matriz tem quatro itens por pixel RGBA, precisamos multiplicar isso por O valor vermelho do pixel são dados Emga, colchetes, índice mais zero, verde é índice mais um e azul é índice mais dois Então, podemos construir uma string colorida chamada A, Bectis para strings literais, depois RGB, e entre parênteses definimos Vamos declarar essa variável que acabamos de citar. Em seguida, passe cool A para a nova partícula, declare-a no construtor e podemos atribuí-la à nossa propriedade de cor existente e comentar ou excluir essas linhas da atualização Agora podemos ver que nossa partícula está usando a cor da imagem Ainda não está ótimo, então vamos diminuir as lacunas e usar mais círculos. Digamos que 30. Também podemos preparar a partícula com base no brilho do pixel ou em um dos canais de cores Podemos mapear o raio até a faixa do canal vermelho de zero e 255 a um e 12 O efeito é interessante, mas há mais uma técnica que eu quero abordar antes de terminarmos. Semelhante ao que fizemos com o mapa de cores, vamos mudar as cores com base na distância da partícula até suas posições iniciais e vamos usar as cores de uma segunda imagem Em todo lugar no código em que temos o EMGA, também teremos o EMGB Na função inicial, EMGB é igual a carregar imagem, imagem 02 e, aqui em cima, declarar EMGB e duplicar todas essas linhas e trocar A por B, EMGB Canvas, contexto EMGB, largura e altura, desenhar imagem, dados EMGB e aqui declarar a chamada B. Então, dentro do loop, se ambas as imagens tiverem a mesma largura e altura que as minhas, você não precisará calcular o declarar EMGB e duplicar todas essas linhas e trocar A por B, EMGB Canvas, contexto EMGB, largura e altura, desenhar imagem, dados EMGB e aqui declarar a chamada B. Então, dentro do loop, se ambas as imagens tiverem a mesma largura e altura que as minhas, você não precisará calcular o indexe novamente e você só precisa duplicar RG e B e ler os dados EMGB e, em seguida, definir a chamada B. Desta vez, não precisamos passar Cd B para a Cd B para a Em vez disso, vamos passar um novo objeto, que é a interpolação entre a chamada A e a chamada B. Para isso, precisamos de uma nova pintura chamada Interpolação de cores Você já conhece a rotina. Vá até a caixa de dependência e digite Crawler Interpolate. No terminal, controle C para interromper o processo PMI, Crawler Em seguida, seta para cima e execute as partículas de esboço novamente. Importado como interpolação da interpolação Crowler. Estamos ficando sem nomes de variáveis para cores aqui, então vamos chamar esse mapa de chamadas e configurá-lo para interpolar entre colchetes, chamado A e chamado B. Esse é o objeto que estamos passando para a nova partícula em vez de chamado A. Podemos começar como uma cor de conjunto de propriedades para chamar Podemos começar como uma cor de conjunto de propriedades para Então, na atualização, faremos a mesma coisa que estamos fazendo para dimensionar e definir cores para resfriar o mapa e organizar com base em DD de zero e 200 a zero e um com a fixação definida como verdadeira Agora, à medida que nos movemos, o cursor vê as partículas tirando cores das duas imagens. E aqui está um exemplo com um par diferente de imagens. Foi uma longa lição, mas espero que você goste do que criamos. Nós cobrimos muitas coisas e vimos muitas técnicas. Agora é sua vez de usar todas essas técnicas que aprendemos para fazer suas próprias artes visuais. Obrigado por participar do curso e espero que tenha sido útil para você. 45. Projeto de curso: Olá, pessoal. Para o projeto de aula, quero que você acesse a Internet e pesquise algumas referências de arte de artistas famosos de sua preferência ou de qualquer outro artista e tente imitar a arte codificando-a no estilo Java e tornando-a estática como um pedaço de um pôster ou tente animá-la ou tentar torná-la visualizadora de áudio Experimente usar sua imaginação e criar sua própria obra de arte exclusiva É isso mesmo. Estarei esperando sua criação artística a apresente na forma de uma aula. 46. Aprenda as dicas finais: Olá, pessoal. Espero que tenham gostado da viagem. Trabalhamos em algumas composições juntos, mas a parte mais importante foi a técnica que aprendemos, porque agora você pode transferi-las, respondê-las em outro lugar e criar algo diferente. Embora tenhamos abordado muito, sempre há mais sobre o que falar. Então, preparei uma pequena lista de dicas para esse vídeo final. Bibliotecas. Usamos alguns ao longo do curso, mas existem mais 1.000 por aí. Algumas pessoas gostam de fazer tudo sozinhas, mas às vezes é como tentar reinventar a roda Sempre que você precisar de algo específico, eu recomendaria verificar primeiro o MPM Talvez outra pessoa já tenha resolvido o mesmo problema. Se você precisar ler dados de um arquivo CSV, há uma biblioteca para isso Se você precisar operar com os vetores ou converter entre espaços de cores ou carregar arquivos de fontes, também há uma biblioteca para isso Construindo um site. Um esboço pode viver sozinho. Você pode exportar sua composição e imprimi-la ou publicá-la em algum lugar. Mas se você quiser compartilhar seus esboços on-line, você também pode fazer isso com um comando build Gere arquivos JavaScript e HTML estáticos, que podem ser hospedados como uma página da Web normal em qualquer lugar Caso você precise que seu esboço seja integrado a um site existente, lembre-se de que estamos sempre usando a API do Canvases Pode copiar as partes válidas do seu código em outro projeto e executá-lo sem o Canvas sketch, Muitas pessoas entram na codificação criativa com o processamento de p five dot gs, e isso faz muito sentido Existem ótimas ferramentas. Estou acostumado a trabalhar com uma API nativa. Mas se você já está confortável com cinco DOTGs, você pode usá-lo junto Há um exemplo básico no sistema respiratório que mostra como fazer isso. Documentação. Essa é óbvia. Certifique-se de verificar a documentação que não é apenas para Canvas sketch ou para a API do Canvas, mas para qualquer API com a qual você esteja trabalhando, alguém dedicou um tempo para organizar e documentar seu código, que possamos tirar proveito Está lá para nos ajudar. Então é isso para mim. Estou curioso para ver o que você criou com o que aprendeu no curso. Lembre-se de postar sua composição no fórum da turma. Estou ansioso para vê-los.