Atualizações Puppeteer v4.0.0

Puppeteer é uma biblioteca Node que fornece uma API de alto nível para controlar o Chrome ou Chromium sobre o protocolo DevTools. Por padrão, o Puppeteer é executado headless.

A maioria das coisas que você pode fazer manualmente no seu navegador, pode ser realizada com Puppeteer.

O Puppeteer recentemente lançou uma atualização com significativas mudanças. A mudança mais impactante é:

O Puppeteer não utiliza mais a biblioteca EventEmitter no Nodejs:

Como o trabalho é tornar o Puppeteer uma ferramenta que seja independente do ambiente de desenvolvimento, foi removida a biblioteca EventEmitter no Nodejs, em favor de um emissor de eventos que não esteja vinculado ao Node. Por baixo dos panos, é utilizado o Mitt, com funcionalidades adicionais para corresponder aos métodos gerais que o EventEmitter do Nodejs fornece. Então, vários métodos foram removidos do Puppeteer, métodos esses que estendiam o EventEmitter:

  • eventNames();
  • getMaxListeners();
  • listeners(eventName);
  • prependListener;
  • prependOnceListener;
  • setMaxListeners(n);
  • rawListeners(eventName).

 

E os métodos estáticos na classe EventEmitter também não são mais suportados, como por exemplo:

  • listenerCount(emitter, eventName);
  • defaultMaxListeners;
  • errorMonitor;

O EventEmitter do Nodejs emite um evento newListener quando um ouvinte for adicionado e um removeListener quando um ouvinto foi removido. Estes eventos não são mais suportados pelo Puppeteer e não serão emitidos.

 

Novos recursos e melhorias:

  • Os logs de depuração de envio e recebimento agora são divididos em canais separados. Isso torna os logs muito mais claros e permite uma melhor visualização;
  • Agora você pode chamar o método isJavaScriptEnabled() em uma página do Puppeteer para descobrir se o JavaScript está habilitado na sua página.

Correções de Bugs:

  • Agora, o Puppeteer está muito melhor em encerrar os processos remanescentes do navegador, especialmente quando você sai de um teste utilizando o comando Ctrl-C.

 

Por baixo dos panos:

  • A equipe do Puppeteer começou a trabalhar em um novo sistema de documentação. Esse novo sistema utiliza o TSDoc para gerar a documentação a partir do código-fonte de sua aplicação, e tendo transportado a documentação para o código de acordo.

 

Gostou desta notícia? Comente abaixo!

Referências: https://github.com/puppeteer/puppeteer/releases/tag/v4.0.0

Deno: algumas funcionalidades

Com a evolução e mudanças que a linguagem JavaScript sofreu, e as novas adições como o TypeScript, a criação de projetos do Node acaba se tornando um árduo esforço, que envolve o gerenciamento de sistemas de construção e outras ferramentas pesadas que tiram a diversão dos scripts de uma linguagem dinâmica.

Considerando que o cenário do JavaScript e infraestrutura de software mudaram o suficiente para que valesse a pena desenvolver uma simplificação, o Deno foi criado para buscar um ambiente de desenvolvimento divertido e produtivo para ser utilizado em uma ampla variedade de tarefas:

O Deno possui algumas funcionalidades:

Um Web Browser para Scripts Command-Line:

A mais nova runtime para execução de JavaScript e Typescript fora de um navegador.

O Deno provê uma ferramenta independente para criação de scripts de funcionalidades complexas. O Deno é um único arquivo executável. Como um navegador, ele sabe utilizar buscas para código externo. Um único arquivo pode definir um comportamento arbitrariamente complexo sem nenhuma outra ferramenta:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";

for await (const req of serve({ port: 8000 })) {
  req.respond({ body: "Olá Mundo!" });
}

Esse é um módulo completo de servidor HTTP, acionado com a dependência em uma única linha. Não há instalação a ser feita com antecedência. Para inicializar, utilize o código:

deno run exemplo.js

Suporte à TypeScript de primeira classe:

O Deno é aplicável a vários dominios problemáticos. Desde pequenos scripts até a uma ampla lógica de negócios complexa. O Suporte ao TypeScript permite uma forma de verificação de tipos. O deno types fornece declarações de tipo para tudo o que é fornecido pelo Deno.

Estabilidade:

A promessa de uma API estável do Deno é tratada com extrema importância. O Deno possui muitas interfaces e componentes, por isso, é importante a transparência no quesito estabilidade.  As APIs JavaScript foram cuidadosamente examinadas e não serão realizadas alterações incompatíveis. Quaisquer correções emitidas serão correções de bug, e não alterações na interface.

Você pode verificar as outras novidades e também as limitações do Deno diretamente na documentação e blog da Versão 1 da Runtime

Gostou desta notícia? Comente abaixo!

Referência:https://deno.land/v1

 

jQuery: Utilizando o plugin Mask

Neste artigo, aprenderemos a importar e utilizar o Mask, criado por Igor Escobar e usa como base o jQuery.

O Mask permite que você crie máscaras personalizadas para os seus campos de input. Isso auxilia no formato dos seus dados. Por exemplo, se você quiser criar uma máscara para o seu input que captura a data, você consegue personalizar criando algo no formato (’00/00/0000′).

Download do plugin:

Você pode realizar o download do Mask no site:

http://igorescobar.github.io/jQuery-Mask-Plugin/

Após o download, você deve inserir a biblioteca no seu HTML utilizando a tag <script>.

Você também pode utilizar diretamente o CDN para importar sua biblioteca ao seu projeto, utilizando o seguinte comando:

<script src="hhttps://cdnjs.com/libraries/jquery.mask"></script>

É importante salientar que você precisa importar o jQuery no seu <head> do seu projeto. Você pode importar o jQuery do seu projeto utilizando o CDN:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

Como é a sintaxe?

É uma sintaxe simples, onde primeiramente é passado o seletor, seguido do .mask e o parâmetro que será utilizado. Por exemplo, no seu arquivo HTML você tem um campo de input para receber uma data:

<label>DATA</label>
<input type="text" class="date">

No seu arquivo de scripts, tudo o que você precisará para fazer a máscara funcionar é:

$(document).ready(function(){
    $('.date').mask('00/00/0000')
});

E com isso, já obtemos todas as vantagens do plugin. Essa seria a sua saída:

Mas o plugin não se aplica somente a datas. Com a utilização do Mask, podemos criar máscaras de input para CEP, CPF, Telefones e tantas outras possibilidades. Tudo que precisamos fazer é criar uma classe para cada tipo de input que utilizaremos na nossa página e utilizar essa classe no nosso script jQuery, como fizemos no exemplo anterior. Veja:

HTML:

<label>DATA</label>
<input type="text" class="date">
<label>HORAS</label>
<input type="text" class="time">
<label>CEP</label>
<input type="text" class="cep">
<label>TELEFONE</label>
<input type="text" class="phone">
<label>CPF</label>
<input type="text" class="cpf">
<label>DINHEIRO</label>
<input type="text" class="money">

E o nosso código jQuery:

$(document).ready(function(){
    $('.date').mask('00/00/0000');
    $('.time').mask('00:00:00');
    $('.cep').mask('00000-000');
    $('.phone').mask('(00) 00000-0000');
    $('.cpf').mask('000.000.000-00');
    $('.money').mask('000.000.000.000,00');
});

E teremos nossa saída:

Gostou deste artigo? Comente abaixo!

Referências: http://www.igorescobar.com/blog/2012/03/13/mascaras-com-jquery-mask-plugin/

Criando Ping Pong com JavaScript parte 3

Na nossa sequência de artigos sobre como criar um jogo Ping Pong utilizando JavaScript puro, já conseguimos renderizar nossa tela de fundo de jogo e adicionar os objetos referentes ao Jogador, ao Computador e à bolinha que serão utilizados para dar vida ao jogo. Caso você não tenha visto as partes 1 e 2 referentes a continuação deste artigo, poderá acessá-las em:

Na última parte desta nossa sequência de artigos, criaremos as animações e adicionaremos os controles, tanto do jogador quanto à IA referente ao computador.

Animação:

Começaremos adicionando o movimento. A animação da bola precisa se direcionar à raquete do jogador. Fazendo isso, alteraremos a função atualizar e adicionar essa atualização na nossa bola, com um incremento:

function atualizar(){
    bolinha.atualizar();
};

Bolinha.prototype.atualizar = function(){
    this.x += this.velocidade_x;
    this.y += this.velocidade_y;
}

As nossas pás estão paradas e precisamos verificar a existência de colisão da bola com as raquetes do jogador e computador. Também precisamos verificar se a bola atingirá as extremidades esquerda e direita do nosso campo de jogo. Também precisamos colocar as raquetes de ambos os jogadores no nosso método de atualização:

let top_x = this.x - 5;
    let top_y = this.y - 5;
    let bottom_x = this.x + 5;
    let bottom_y = this.y + 5;

    // Se bate na extremidade esquerda
    if (this.x - 5 < 0){
        this.x = 5;
        this.velocidade_x = -this.velocidade_x;
    } else if (this.x + 5 > 400){ //Se bate na extremidade direita
        this.x=395;
        this.velocidade_x = -this.velocidade_x;
    }

    //Se tocar no fim do jogo ou no início, ocorre um ponto
    if (this.y < 0 || this.y > 600){
        this.velocidade_x = 0;
        this.velocidade_y = 3;
        // E centralizamos a bolinha novamente
        this.x = 200;
        this.y = 300;
    }

    if (top_y > 300){
        if (top_y < (raquete1.y + raquete1.height) && bottom_y > raquete1.y && top_x < (raquete1.x + raquete1.width) && bottom_x > raquete1.x){
            // Acerta a raquete do jogador
            this.velocidade_y = -3;
            this.velocidade_x += (raquete1.velocidade_x /2);
            this.y += this.velocidade_y;
        }
    }else{
        if(top_y < (raquete2.y + raquete2.height) && bottom_y > raquete2.y && top_x < (raquete2.x + raquete2.width) && bottom_x > raquete2.x){
            // Acerta a raquete do computador
            this.velocidade_y = 3;
            this.velocidade_x += (raquete2.velocidade_x / 2);
            this.y += this.velocidade_y;
        }
    }

Controles:

Agora, criaremos o controle para que o jogador possa mover sua raquete, utilizando um keyDown e um addEventListener para adicionar um evento de pressionar tecla:

let keysDown = {};

window.addEventListener("keydown", function(event){
    keysDown[event.keyCode] = true;
});

window.addEventListener("keyup", function(event){
    delete keysDown[event.keyCode];
})

Agora, podemos atualizar a posição da raquete conforme a tecla for pressionada. Precisamos agora criar um código para mover a raquete ao ser pressionada a tecla:

Jogador.prototype.atualizar = function(){
    for (let key in keysDown) {
        //Captura e pega o número da tecla pressionada
        let valor = Number(key);
        // Tecla seta para esquerda (37)
        if (valor == 37) {
            this.raquete.mover(-4, 0);
        }
        // Tecla seta para direita (39)
          else if (valor == 39) {
            this.raquete.mover(4, 0);
        } else{
            this.raquete.mover(0, 0);
        }
    }
};

Raquete.prototype.mover = function(x, y){
    this.x += x;
    this.y += y;
    this.velocidade_x = x;
    this.velocidade_y = y;
    // Mover tudo para a esquerda
    if(this.x < 0){
        this.x = 0;
        this.velocidade_x = 0;
    }
    // Mover tudo para a direita
      else if (this.x + this.width > 400){
        this.x = 400 - this.width;
        this.velocidade_x = 0;
    }
}

E precisamos atualizar a nossa função atualizar:

function atualizar(){
    jogador.atualizar();
    bolinha.atualizar(jogador.raquete, computador.raquete);
};

Inteligência do Computador:

Já podemos controlar nossa raquete e a bolinha vai ricochetear de acordo com o movimento da raquete, mas ainda não temos movimento no nosso adversário, o computador. Vamos fazer a raquete do computador sempre se posicionar conforme o centro da bolinha. O computador terá velocidade máxima para ele pontuar ocasionalmente:

Computador.prototype.atualizar = function (bolinha){
    let posicao_x = bolinha.x;
    let diferenca = -((this.raquete.x + (this.raquete.width / 2)) - posicao_x);
    // Máxima velocidade para a esquerda
    if (diferenca < 0 && diferenca < -4) {
        diferenca = -5;
    } 
    // Máxima velocidade para a direita  
      else if (diferenca > 0 && diferenca > 4){
        diferenca = 5;
    }
    this.raquete.mover(diferenca, 0);
    if (this.raquete.x < 0){
        this.raquete.x = 0;
    } else if (this.raquete.x + this.raquete.width > 400){
        this.raquete.x = 400 - this.raquete.width;
    }
}

E atualizamos a nossa função atualizar:

function atualizar(){
    jogador.atualizar();
    computador.atualizar(bolinha)
    bolinha.atualizar(jogador.raquete, computador.raquete);
};

Com isso, temos uma réplica do jogo de Ping Pong funcional! Teste no seu navegador!

Gostou desta sequência de artigos? Comente abaixo!

Referências: https://thoughtbot.com/blog/pong-clone-in-javascript

 

Criando Ping Pong com JavaScript parte 2

Na parte 1 do nosso jogo, criamos a tela renderizada onde nosso jogo irá acontecer. Também criamos uma função que renderiza essa tela assim que a nossa página HTML é carregada. Você pode conferir os nossos códigos em:

Na nossa continuação, criaremos as nossas raquetes e a bola a ser utilizada no nosso jogo de Ping Pong. Como sabemos, temos dois jogadores, o Player 1 e o Player 2 (que no nosso jogo, será uma pequena inteligência artificial).

Nossos objetos deverão ser renderizados em tela. Precisamos fornecer uma posição x, y, uma altura e uma largura. Também precisamos criar velocidades para nossa bolinha. Essas velocidades atuarão no eixo X e no eixo Y:

function Raquete(x, y, width, height){
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.velocidade_x = 0;
    this.velocidade_y = 0;
}

Com nossa função Raquete criada, precisamos renderizar as raquetes agora. Criaremos um objeto protótipo de nossa raquete, utilizando o Prototype. A cor da nossa raquete será preta.

function Raquete(x, y, width, height){
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.velocidade_x = 0;
    this.velocidade_y = 0;
}

Raquete.prototype.renderizar = function(){
    contexto.fillStyle = "black";
    contexto.fillRect(this.x, this.y, this.width, this.height);
};

Já que cada raquete será controlada de forma independente, vamos criar objetos para representá-las. As coordenadas X e Y são escolhidas para colocar o Jogador na parte inferior, e o Computador na parte superior:

function Jogador(){
    this.raquete = new Raquete(175, 580, 50, 10);
}

function Computador(){
    this.raquete = new Raquete(175, 10, 50, 10);
}

E precisamos criar a função para renderizar o jogador e o computador:

Jogador.prototype.renderizar = function(){
    this.raquete.renderizar();
}

Computador.prototype.renderizar = function(){
    this.raquete.renderizar();
}

E precisamos também criar a bola. Ela será um círculo, com coordenadas x e y que representarão o centro do círculo. Também forneceremos um raio de 5, ou seja, a nossa bolinha terá 10 de diâmetro:

function Bolinha(x, y){
    this.x = x;
    this.y = y;
    this.velocidade_x = 0;
    this.velocidade_y = 3;
    this.radius = 5;
}

Bolinha.prototype.renderizar = function() {
    contexto.beginPath();
    contexto.arc(this.x, this.y, this.radius, 2 * Math.PI, false);
    contexto.fillStyle="white";
    contexto.fill();
};

E agora, vamos construir nossos objetos Jogador, Computador e Bolinha e atualizar a nossa função renderizar():

let jogador = new Jogador();

let computador = new Computador();

//A bolinha será renderizada no centro da tela
let bolinha = new Bolinha(200,300);
let renderizar = function(){
    contexto.fillStyle = "#836FFF";
    contexto.fillRect(0, 0, width, height);
    //Atualizar a partir daqui
    jogador.renderizar();
    computador.renderizar();
    bolinha.renderizar();
}

E a nossa saída será:

Gostou deste artigo? Comente abaixo e acompanhe a sequência!

Referência: https://thoughtbot.com/blog/pong-clone-in-javascript

Criando Ping Pong com JavaScript parte 1

Olá, neste artigo replicaremos o jogo Ping Pong usando JavaScript, utilizando o elemento canvas do HTML.

Mostraremos a facilidade de criar um jogo simples e que utiliza uma certa inteligência artificial para replicar o jogo Ping Pong, utilizando a máquina como adversário. Para isso, utilizaremos JavaScript puro para criar os elementos do jogo e suas ações. O canvas renderizará o jogo.

Vamos começar!

Para começar, precisamos de um arquivo chamado index.html, e chamaremos o arquivo scripts.js que será o responsável pelas ações do jogo:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ping Pong</title>
    <script src="scripts.js"></script>
</head>
<body>
</body>
</html>

E no nosso scripts.js, começaremos adicionando o método requestAnimationFrame. Ele funciona de maneira semelhante ao método setTimeout, trazendo uma chamada de retorno a aproximadamente 60 frames por segundo. Ele torna-se melhor que o método setTimeout pois o navegador pode realizar otimizações na chamada. Mas, caso não haja suporte, utilizaremos o método setTimeout para realizar este retorno de 60 fps.

let animacao = window.requestAnimationFrame || function(callback){
    window.setTimeout(callback, 1000/60);
}

Renderizando:

Agora, criaremos nosso elemento canvas dinamicamente com JavaScipt. Utilizaremos uma altura de 600 e largura de 400. Este será o tamanho de nossa tela de jogo. Também utilizaremos o contexto, que será “2d”:

let canvas = document.createElement("canvas");
let width = 400;
let height = 600;
canvas.width = width;
canvas.height = height;
let contexto = canvas.getContext("2d");

E quando a página for carregada, anexaremos o nosso elemento canvas ao body do HTML e usaremos o método animacao, criado anteriormente, chamando uma função chamada step.

window.onload = function(){
    document.body.appendChild(canvas);
    animacao(step);
};

A função step será responsável por realizar três coisas:

  • Atualizar todos os objetos;
  • Renderizar os objetos;
  • Utilizar a recursão, chamando a função step novamente.
let step = function(){
    atualizar();
    renderizar();
    animacao(step);
};

Para começar exibindo algo na tela, vamos implementar a função atualizar como não operacional, e na nossa função renderizar, vamos definir o plano de fundo do nosso jogo, e utilizaremos os métodos fillStyle e fillRect que são fornecidos pelo contexto. A cor definida é o SlateBlue, com código hexadecimal #836FFF.

let renderizar = function(){
    contexto.fillStyle = "#836FFF";
    contexto.fillRect(0, 0, width, height);
}

E nossa saída será algo assim:

Gostou deste artigo? Comente abaixo e aguarde a sequência!

Referências: https://thoughtbot.com/blog/pong-clone-in-javascript

Google: guia de como gerar dados estruturados usando JS

Recentemente, o Google publicou uma diretriz de desenvolvedor na página de desenvolvedores do Google. Este documento fornece uma visão sobre como criar dados estruturados utilizando JavaScript e implementá-los no site, ou fazê-los corretamente para que possa trazer benefícios na pesquisa do Google. Este novo guia, descreve métodos para adicionar dados estruturados dinamicamente a um site usando JavaScript. Atualmente, o uso de JavaScript é essencial para criar um site com funcionalidade aprimorada. As novas dicas do guia de desenvolvimento da Google serão especialmente valiosas para especialistas de SEO e desenvolvedores Web.

Atualmente, existem muitas maneiras de gerar dados estruturados com JavaScript, mas as mais utilizadas são:

O gerenciador de tags do google é utilizado para gerar JSON-LD dinamicamente. Ele é uma plataforma que permite o gerenciamento de tags no seu site sem editar o código. Para gerar dados estruturados com o Gerenciador de Tas do Google, você precisa:

  • Configure e instale o Gerenciador de tags do Google ao seu site;
  • Adicionar uma tag HTML personalizada ao contêiner;
  • Cole o bloco de dados estruturado desejado no conteúdo da tag;
  • Instale o contêiner conforme mostrado na seção Instalar o Gerenciador de tags do Google no menu de administração do contêiner;
  • Para adicionar a tag ao seu site, publique seu contêiner na interface do Gerenciador de tags do Google e, por fim:
  • Teste a sua implementação.

E a outra maneira de gerar dados estruturados é usando JavaScript para gerar todos os dados estruturados ou adicionar mais informações de dados renderizados no servidor. De qualquer forma, o Google Search pode entender e processar dados estruturados disponíveis no DOM ao renderizar a página. Para saber como o Google Search processa o JavaScript, consulte o guia básico de JavaScript aqui.

Para isso, você precisa:

  • Encontrar o tipo de dado estruturado em que você está interessado;
  • Editar o HTML do seu site para incluir um snippet JavaScript.
  • Testar sua implementação com o Rich Results Tests.

Gostou deste artigo? Comente abaixo!

Referências:

https://codeburst.io/javascript-news-and-updates-april-2020-98ab1ba67418

https://developers.google.com/search/docs/guides/javascript-seo-basics

JAMStack, o que é?

Construir um aplicativo que seja flexível, iterável e construído em um curto espaço de tempo pode realmente ser desafiador. Soluções em cloud como AWS, Azure e GPC fornecem aplicativos Web escaláveis com custo baixo e em poucas semanas.

Escolhendo um banco de dados, movendo o código do aplicativo para soluções em contâiner como o Docker, implantando funções de Back-End e alterações de código. Assim é o que acontece no desenvolvimento de aplicativos atualmente. Com o JAMSTACK, sites e aplicativos rápidos e seguros são entregues pré-renderizando arquivos e servindo-os diratemente de uma CDN, onde o requisito de gerenciar ou executar servidores Web são removidos.

O Jamstak não é sobre tecnologia específicas. É uma nova maneira de criar sites e aplicativos, oferecendo melhor desempenho, segurança e custo de dimensionamento e uma melhor experiência do desenvolvedor. Sites pré-renderizados podem ser aprimorados com JavaScript e os crescentes recursos de navegadores e serviços disponíveis via APIs. O Jamstack é a junção de JavaScript, APIs e Marcação.

Você provavelmente já trabalhou em um site Jamstack, utilizando Jekyll, Next, Gtasby, entre outros gerenciadores de site estático.
Quando você utiliza um CMS, não está utilizando Jamstack. Por exemplo, se estiver utilizando WordPress, Drupal, Joomla, um aplicativo Web executado por servidor que depende de algum idioma back-end ou um aplicativo de página única que utiliza renderização isomórfica para criar visualizações no servidor em tempo de execução.

Benefícios:

Maior segurança:

Com os processos do lado de servidor abstraídos nas APIs de microsserviço, as áreas de superfície para ataques são reduzidas.

Escala mais barata e fácil:

Quando sua implantação equivale uma pilha de arquivos que podem ser veiculados em qualquer lugar, o dimensionamento é uma questão de veicular esses arquivos em mais locais. As CDNs são perfeitas para isso e incluem dimensionamento em todos os seus planos.

Melhor Experiência do Desenvolvedor:

O baixo acoplamento e separação de controles permitem um desenvolvimento e depuração mais direcionados, e a seleção crescente de opções de CMD para geradores de sites remove a necessidade de manter uma pilha separada de conteúdo e marketing.

Gostou desta notícia? Comente abaixo.

Criando jogo Snake em JavaScript e Canvas

Hoje criaremos um jogo Snake utilizando HTML5 e JavaScript.

Para isso, criaremos um arquivo HTML que servirá de base para nosso jogo. Crie um arquivo chamado index.html e insira o código:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jogo Snake</title>

</head>
<body>
        <script src="scripts.js"></script>
</body>
</html>

Dentro do nosso elemento body, adicionaremos um elemento canvas:

<canvas id="canvas" width="400" height="400"></canvas>

E agora, adicionaremos o JavaScript:

Agora que temos o Canvas adicionado, adicionaremos o JavaScript. Crie um arquivo chamado scripts.js, e nele, adicionaremos a lógica do nosso jogo. O nosso arquivo irá renderizar o canvas e os elementos do jogo.

Primeiro, precisamos definir o que acontece quando o window.onload é chamado. Precisamos obter o elemento Canvas e adicionar um evento de pressionar teclas. Esse evento faz o canvas se redesenhar com a nova posição da cobra e onde o alimento aparecerá.

let canvas;
let ctx;

window.onload = function(){
    canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d");
    document.addEventListener("keydown", keyDownEvent);
    let x = 8;
    setInterval(desenharJogo, 1000 / x);
};

Tratamento das teclas:

Precisamos definir o que a nossa função keyDownEvent chamada no addEventListener faz. Para isso, utilizaremos keyCodes, que representam o que cada seta do teclado faz:

function keyDownEvent(event){
    // nextX e nextY representam as direções que a cobra irá percorrer
    // nos eixos X e Y, respectivamente
    switch(event.keyCode){
        case 37:
            nextX = -1;
            nextY = 0;
            break;
        case 38:
            nextX = 0;
            nextY = -1;
            break;
        case 39:
            nextX = 1;
            nextY = 0;
            break;
        case 40:
            nextX = 0;
            nextY = 1;
            break;
    }
}

O nextX e nextY representam a direção em que a cobra se desloca.

Serpente:

Vamos definir as variáveis que serão utilizadas para criar a serpente.

let defaultTamanhoCauda = 3;
let tamanhoCauda = defaultTamanhoCauda;
let caminhoCobra = [];
let cobraEixoX = cobraEixoY = 10;

Definimos um tamanho inicial da serpente como 3. A cada vez que ela ingerir o alimento, será incrementado em 1 esse valor. O caminho que a serpente percorrerá é uma matriz de posições X e Y, onde cobraEixoX e cobraEixoY serão a posição inicial da cobra.

Tela do jogo:

Criaremos a tela onde o jogo funcionará. É uma grade 20×20, que corresponde à largura e altura da tela.

//Criação da tela de jogo
let tamanhoTela = tamanhoCaminho = 20;
let nextX = nextY = 0;

Comida:

Criaremos a comida, que ficará em uma posição X e Y:

//Criação da comida
let appleX = (appleY = 15);

Atualizando o jogo:

Toda vez que chamamos a função, movemos a cobra em alguma próxima posição, e também verificar se a serpente não está fora dos limites do jogo e redefinir a posição para ela sair do outro lado. Essas verificações estarão dentro de uma função chamada desenharJogo():

 

function desenharJogo(){
    cobraEixoX += nextX;
    cobraEixoY += nextY;

    if (cobraEixoX < 0){
        cobraEixoX = tamanhoTela -1;
    }
    
    if (cobraEixoX > tamanhoTela - 1){
        cobraEixoX = 0;
    }
    
    if (cobraEixoY < 0){
        cobraEixoY = tamanhoTela -1;
    }
    
    if (cobraEixoY > tamanhoTela - 1){
        cobraEixoY = 0;
    }

}

Verificaremos se a cobra mordeu o alimento. Se isso acontecer, precisamos aumentar o tamanho da cauda da serpente e calcular uma nova posição:

//Se a cobra comer o alimento
    if (cobraEixoX == appleX && cobraEixoY == appleY){
        tamanhoCauda++;
        appleX = Math.floor(Math.random() * tamanhoTela);
        appleY = Math.floor(Math.random() * tamanhoTela);
    }

Agora, pintaremos o fundo do jogo de preto. Desenharemos a dobra, devemos também verificar se a cobra morde o próprio rabo, e também precisamos redefinir o tamanho da cauda para o tamanho inicial.

ctx.fillStyle = "black";
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    ctx.fillStyle = "green";
    for (let i = 0; i < caminhoCobra.length; i++){
        ctx.fillRect(
            caminhoCobra[i].x * tamanhoCaminho,
            caminhoCobra[i].y * tamanhoCaminho,
            tamanhoCaminho,
            tamanhoCaminho
        );
        if (caminhoCobra[i].x == cobraEixoX && caminhoCobra[i].y == cobraEixoY){
            tamanhoCauda = defaultTamanhoCauda;
        }
    }

E pintaremos a maçã:

ctx.fillStyle = "red";
    ctx.fillRect(appleX * tamanhoCaminho, appleY * tamanhoCaminho, tamanhoCaminho, tamanhoCaminho);

E, no final, verificaremos se o caminho da cobra excede o tamanho da cauda. Caso isso aconteça, mudaremos as últimas posições para fora da trilha.

caminhoCobra.push({
        x:cobraEixoX,
        y:cobraEixoY
    });
    while (caminhoCobra.length > tamanhoCauda){
        caminhoCobra.shift(); }

E com isso, terminamos o nosso jogo!

O código está disponível para download aqui:

[download id=”3784″]

Conheça o Semantic UI

O Semantic UI é um framework de desenvolvimento web que auxilia o desenvolvedor a criar sites e sistemas web bonitos e responsivos de maneira rápida e intuitiva.

Ele trata palavras e classes como conceitos permutáveis. As classes utilizam a sintaxe de idiomas naturais, com relações substantivo/modificador, ordem de palavras e pluralidade para vincular conceitos intuitivamente.

O Semantic utiliza o JavaScript de forma simples, utilizando chamadas simples que acionam as funcionalidades. Qualquer decisão arbitrária em um componente é incluída como configuração que pode ser modificada pelos desenvolvedores.

Semantic UI também possui uma depuração simplificada, pois o registro de desempenho permite rastrear os gargalos sem procurar nos rastreamentos da stack.

Ele vem equipado com um sistema de herança intuitivo e variáveis temáticas de ato nível que permitem ao desenvolvedor possuir uma total liberdade de projeto, desenvolvendo uma interface de usuário uma vez e implantando com o mesmo código em qualquer lugar.

É projetado para ser dimensionado responsivamente, pois as variações de design que são incorporadas aos elementos permitem que você escolha como o conteúdo será ajustado, tanto para tablet como para celular.

Também possui integrações com as bibliotecas mais utilizadas na atualidade: React, Angular, Meteor e Ember, entre muitas outra que ajudam a organizar a UI ao lado da lógica do app.

INSTALAÇÃO:

Você pode utilizar o Gulp para instalar o Semantic UI no seu projeto com Node.js:

npm install -g gulp
npm install semantic-ui --save
cd semantic/
gulp build

Ou pode adicioná-lo diretamente no seu arquivo HTML:

<link rel="stylesheet" type="text/css" href="semantic/dist/semantic.min.css">
<script
  src="https://code.jquery.com/jquery-3.1.1.min.js"
  integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
  crossorigin="anonymous"></script>
<script src="semantic/dist/semantic.min.js"></script>

Alguns elementos importantes do Semantic UI são:

Buttons:

Podemos facilmente criar buttons estilizados com apenas uma linha de HTML:

<button class="ui button active">Button</button>

Ou botões animados:

<div class="ui animated button" tabindex="0">
  <div class="visible content">Próximo</div>
  <div class="hidden content">
    <i class="right arrow icon"></i>
  </div>
</div>

Ícones:

Podemos adicionar ícones facilmente ao projeto:

<i class="american sign language interpreting icon"></i>
<i class="assistive listening systems icon"></i>
<i class="audio description icon"></i>
<i class="blind icon"></i>
<i class="braille icon"></i>

Listas:

<div class="ui list">
  <div class="item">Maçã</div>
  <div class="item">Peras</div>
  <div class="item">Laranjas</div>
</div>

Você pode verificar mais elementos diretamente no site: https://semantic-ui.com/

Gostou deste artigo? Comente abaixo!

Referências: https://semantic-ui.com/introduction/getting-started.html