You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Web-Dev-For-Beginners/translations/br/6-space-game/2-drawing-to-canvas
softchris 9837770ac1
🌐 Update translations via Co-op Translator
11 months ago
..
README.md 🌐 Update translations via Co-op Translator 11 months ago
assignment.md 🌐 Update translations via Co-op Translator 11 months ago

README.md

Construa um Jogo Espacial Parte 2: Desenhe o Herói e os Monstros no Canvas

A API Canvas é uma das ferramentas mais poderosas do desenvolvimento web para criar gráficos dinâmicos e interativos diretamente no seu navegador. Nesta lição, vamos transformar aquele elemento HTML <canvas> vazio em um mundo de jogo cheio de heróis e monstros. Pense no canvas como sua prancheta digital onde o código se torna visual.

Estamos construindo com base no que você aprendeu na lição anterior, e agora vamos mergulhar nos aspectos visuais. Você aprenderá como carregar e exibir sprites de jogo, posicionar elementos com precisão e criar a base visual para seu jogo espacial. Isso faz a ponte entre páginas web estáticas e experiências dinâmicas e interativas.

Ao final desta lição, você terá uma cena de jogo completa com sua nave heroica posicionada corretamente e formações inimigas prontas para a batalha. Você entenderá como jogos modernos renderizam gráficos em navegadores e adquirirá habilidades para criar suas próprias experiências visuais interativas. Vamos explorar os gráficos do canvas e dar vida ao seu jogo espacial!

Quiz Pré-Aula

Quiz pré-aula

O Canvas

Então, o que exatamente é esse elemento <canvas>? É a solução do HTML5 para criar gráficos dinâmicos e animações em navegadores web. Diferente de imagens ou vídeos regulares que são estáticos, o canvas oferece controle em nível de pixel sobre tudo o que aparece na tela. Isso o torna perfeito para jogos, visualizações de dados e arte interativa. Pense nele como uma superfície de desenho programável onde o JavaScript se torna seu pincel.

Por padrão, um elemento canvas parece um retângulo transparente e vazio na sua página. Mas é aí que está o potencial! Seu verdadeiro poder surge quando você usa JavaScript para desenhar formas, carregar imagens, criar animações e fazer as coisas responderem às interações do usuário. É semelhante ao trabalho dos pioneiros dos gráficos de computador no Bell Labs nos anos 1960, que precisavam programar cada pixel para criar as primeiras animações digitais.

✅ Leia mais sobre a API Canvas no MDN.

Aqui está como ele é normalmente declarado, como parte do corpo da página:

<canvas id="myCanvas" width="200" height="100"></canvas>

O que este código faz:

  • Define o atributo id para que você possa referenciar este elemento canvas específico no JavaScript
  • Define a largura em pixels para controlar o tamanho horizontal do canvas
  • Estabelece a altura em pixels para determinar as dimensões verticais do canvas

Desenhando Geometria Simples

Agora que você sabe o que é o elemento canvas, vamos explorar como desenhar nele! O canvas usa um sistema de coordenadas que pode parecer familiar das aulas de matemática, mas há uma diferença importante específica para gráficos de computador.

O canvas usa coordenadas cartesianas com um eixo x (horizontal) e um eixo y (vertical) para posicionar tudo o que você desenha. Mas aqui está a diferença principal: ao contrário do sistema de coordenadas da aula de matemática, o ponto de origem (0,0) começa no canto superior esquerdo, com os valores de x aumentando conforme você se move para a direita e os valores de y aumentando conforme você se move para baixo. Essa abordagem remonta aos primeiros monitores de computador, onde feixes de elétrons escaneavam de cima para baixo, tornando o canto superior esquerdo o ponto de partida natural.

a grade do canvas

Imagem de MDN

Para desenhar no elemento canvas, você seguirá o mesmo processo de três etapas que forma a base de todos os gráficos do canvas. Depois de fazer isso algumas vezes, torna-se algo natural:

  1. Obtenha uma referência ao seu elemento Canvas no DOM (assim como qualquer outro elemento HTML)
  2. Obtenha o contexto de renderização 2D – isso fornece todos os métodos de desenho
  3. Comece a desenhar! Use os métodos integrados do contexto para criar seus gráficos

Aqui está como isso se parece no código:

// Step 1: Get the canvas element
const canvas = document.getElementById("myCanvas");

// Step 2: Get the 2D rendering context
const ctx = canvas.getContext("2d");

// Step 3: Set fill color and draw a rectangle
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 200, 200); // x, y, width, height

Vamos detalhar isso passo a passo:

  • Nós pegamos nosso elemento canvas usando seu ID e o armazenamos em uma variável
  • Nós obtemos o contexto de renderização 2D – esta é nossa caixa de ferramentas cheia de métodos de desenho
  • Nós informamos ao canvas que queremos preencher as coisas com vermelho usando a propriedade fillStyle
  • Nós desenhamos um retângulo começando no canto superior esquerdo (0,0) com 200 pixels de largura e altura

✅ A API Canvas foca principalmente em formas 2D, mas você também pode desenhar elementos 3D em um site; para isso, você pode usar a API WebGL.

Você pode desenhar vários tipos de coisas com a API Canvas, como:

  • Formas geométricas, já mostramos como desenhar um retângulo, mas há muito mais que você pode desenhar.
  • Texto, você pode desenhar texto com qualquer fonte e cor que desejar.
  • Imagens, você pode desenhar uma imagem baseada em um arquivo de imagem como .jpg ou .png, por exemplo.

✅ Experimente! Você sabe como desenhar um retângulo, consegue desenhar um círculo na página? Dê uma olhada em alguns desenhos interessantes no Canvas no CodePen. Aqui está um exemplo particularmente impressionante.

Carregar e Desenhar um Asset de Imagem

Desenhar formas básicas é útil para começar, mas a maioria dos jogos precisa de imagens reais! Sprites, fundos e texturas são o que dão apelo visual aos jogos. Carregar e exibir imagens no canvas funciona de forma diferente de desenhar formas geométricas, mas é simples uma vez que você entende o processo.

Precisamos criar um objeto Image, carregar nosso arquivo de imagem (isso acontece de forma assíncrona, ou seja, "em segundo plano") e, em seguida, desenhá-lo no canvas quando estiver pronto. Essa abordagem garante que suas imagens sejam exibidas corretamente sem bloquear sua aplicação enquanto elas carregam.

Carregamento Básico de Imagem

const img = new Image();
img.src = 'path/to/my/image.png';
img.onload = () => {
  // Image loaded and ready to be used
  console.log('Image loaded successfully!');
};

O que está acontecendo neste código:

  • Nós criamos um novo objeto Image para armazenar nosso sprite ou textura
  • Nós informamos qual arquivo de imagem carregar definindo o caminho da fonte
  • Nós ouvimos o evento de carregamento para saber exatamente quando a imagem está pronta para uso

Uma Maneira Melhor de Carregar Imagens

Aqui está uma maneira mais robusta de lidar com o carregamento de imagens que os desenvolvedores profissionais costumam usar. Vamos encapsular o carregamento de imagens em uma função baseada em Promises – essa abordagem, popularizada quando as Promises do JavaScript se tornaram padrão no ES6, torna seu código mais organizado e lida com erros de forma elegante:

function loadAsset(path) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.src = path;
    img.onload = () => {
      resolve(img);
    };
    img.onerror = () => {
      reject(new Error(`Failed to load image: ${path}`));
    };
  });
}

// Modern usage with async/await
async function initializeGame() {
  try {
    const heroImg = await loadAsset('hero.png');
    const monsterImg = await loadAsset('monster.png');
    // Images are now ready to use
  } catch (error) {
    console.error('Failed to load game assets:', error);
  }
}

O que fizemos aqui:

  • Encapsulamos toda a lógica de carregamento de imagens em uma Promise para que possamos lidar melhor com ela
  • Adicionamos tratamento de erros que realmente nos informa quando algo dá errado
  • Usamos a sintaxe moderna de async/await porque é muito mais fácil de ler
  • Incluímos blocos try/catch para lidar graciosamente com qualquer problema de carregamento

Depois que suas imagens forem carregadas, desenhá-las no canvas é realmente bem simples:

async function renderGameScreen() {
  try {
    // Load game assets
    const heroImg = await loadAsset('hero.png');
    const monsterImg = await loadAsset('monster.png');

    // Get canvas and context
    const canvas = document.getElementById("myCanvas");
    const ctx = canvas.getContext("2d");

    // Draw images to specific positions
    ctx.drawImage(heroImg, canvas.width / 2, canvas.height / 2);
    ctx.drawImage(monsterImg, 0, 0);
  } catch (error) {
    console.error('Failed to render game screen:', error);
  }
}

Vamos detalhar isso passo a passo:

  • Nós carregamos as imagens do herói e dos monstros em segundo plano usando await
  • Nós pegamos nosso elemento canvas e obtemos o contexto de renderização 2D necessário
  • Nós posicionamos a imagem do herói bem no centro usando alguns cálculos rápidos de coordenadas
  • Nós colocamos a imagem do monstro no canto superior esquerdo para começar nossa formação inimiga
  • Nós capturamos quaisquer erros que possam ocorrer durante o carregamento ou renderização

Agora é Hora de Começar a Construir Seu Jogo

Agora vamos juntar tudo para criar a base visual do seu jogo espacial. Você tem uma compreensão sólida dos fundamentos do canvas e das técnicas de carregamento de imagens, então esta seção prática irá guiá-lo na construção de uma tela de jogo completa com sprites posicionados corretamente.

O que Construir

Você criará uma página web com um elemento Canvas. Ela deve renderizar uma tela preta de 1024*768. Nós fornecemos duas imagens para você:

  • Nave do herói

    Nave do herói

  • Formação de 5x5 monstros

    Nave do monstro

Passos Recomendados para Iniciar o Desenvolvimento

Localize os arquivos iniciais que foram criados para você na subpasta your-work. A estrutura do seu projeto deve conter:

your-work/
├── assets/
│   ├── enemyShip.png
│   └── player.png
├── index.html
├── app.js
└── package.json

O que você tem para trabalhar:

  • Sprites do jogo estão na pasta assets/ para manter tudo organizado
  • Seu arquivo HTML principal configura o elemento canvas e prepara tudo
  • Um arquivo JavaScript onde você escreverá toda a mágica de renderização do jogo
  • Um package.json que configura um servidor de desenvolvimento para que você possa testar localmente

Abra esta pasta no Visual Studio Code para começar o desenvolvimento. Você precisará de um ambiente de desenvolvimento local com Visual Studio Code, NPM e Node.js instalados. Se você ainda não configurou o npm no seu computador, aqui está como instalá-lo.

Inicie seu servidor de desenvolvimento navegando até a pasta your-work:

cd your-work
npm start

Este comando faz algumas coisas bem legais:

  • Inicia um servidor local em http://localhost:5000 para que você possa testar seu jogo
  • Serve todos os seus arquivos corretamente para que seu navegador possa carregá-los
  • Observa as alterações nos seus arquivos para que você possa desenvolver sem problemas
  • Fornece um ambiente de desenvolvimento profissional para testar tudo

💡 Nota: Seu navegador mostrará uma página em branco inicialmente – isso é esperado! À medida que você adicionar código, atualize seu navegador para ver suas alterações. Essa abordagem de desenvolvimento iterativo é semelhante à forma como a NASA construiu o computador de orientação Apollo – testando cada componente antes de integrá-lo ao sistema maior.

Adicione Código

Adicione o código necessário em your-work/app.js para completar as seguintes tarefas:

  1. Desenhe um canvas com fundo preto

    💡 Como fazer: Encontre o TODO em /app.js e adicione apenas duas linhas. Defina ctx.fillStyle como preto e, em seguida, use ctx.fillRect() começando em (0,0) com as dimensões do seu canvas. Fácil!

  2. Carregue as texturas do jogo

    💡 Como fazer: Use await loadAsset() para carregar suas imagens de jogador e inimigo. Armazene-as em variáveis para que você possa usá-las mais tarde. Lembre-se – elas não aparecerão até que você realmente as desenhe!

  3. Desenhe a nave do herói na posição central inferior

    💡 Como fazer: Use ctx.drawImage() para posicionar seu herói. Para a coordenada x, tente canvas.width / 2 - 45 para centralizá-lo, e para a coordenada y use canvas.height - canvas.height / 4 para colocá-lo na área inferior.

  4. Desenhe uma formação de 5×5 de naves inimigas

    💡 Como fazer: Encontre a função createEnemies e configure um loop aninhado. Você precisará fazer alguns cálculos para espaçamento e posicionamento, mas não se preocupe – eu vou mostrar exatamente como!

Primeiro, estabeleça constantes para o layout adequado da formação inimiga:

const ENEMY_TOTAL = 5;
const ENEMY_SPACING = 98;
const FORMATION_WIDTH = ENEMY_TOTAL * ENEMY_SPACING;
const START_X = (canvas.width - FORMATION_WIDTH) / 2;
const STOP_X = START_X + FORMATION_WIDTH;

Vamos detalhar o que essas constantes fazem:

  • Nós definimos 5 inimigos por linha e coluna (uma grade 5×5)
  • Nós definimos quanto espaço colocar entre os inimigos para que não fiquem apertados
  • Nós calculamos quão larga será toda a formação
  • Nós determinamos onde começar e parar para que a formação pareça centralizada

Em seguida, crie loops aninhados para desenhar a formação de inimigos:

for (let x = START_X; x < STOP_X; x += ENEMY_SPACING) {
  for (let y = 0; y < 50 * 5; y += 50) {
    ctx.drawImage(enemyImg, x, y);
  }
}

O que este loop aninhado faz:

  • O loop externo move da esquerda para a direita através da formação
  • O loop interno vai de cima para baixo para criar linhas organizadas
  • Nós desenhamos cada sprite inimigo nas coordenadas x,y exatas que calculamos
  • Tudo permanece uniformemente espaçado para que pareça profissional e organizado

Resultado

O resultado final deve ser assim:

Tela preta com um herói e 5x5 monstros

Solução

Por favor, tente resolver sozinho primeiro, mas se você ficar preso, dê uma olhada em uma solução


Desafio do GitHub Copilot Agent 🚀

Use o modo Agent para completar o seguinte desafio:

Descrição: Melhore o canvas do seu jogo espacial adicionando efeitos visuais e elementos interativos usando as técnicas da API Canvas que você aprendeu.

Prompt: Crie um novo arquivo chamado enhanced-canvas.html com um canvas que exiba estrelas animadas no fundo, uma barra de saúde pulsante para a nave do herói e naves inimigas que se movem lentamente para baixo. Inclua código JavaScript que desenhe estrelas cintilantes usando posições e opacidades aleatórias, implemente uma barra de saúde que muda de cor com base no nível de saúde (verde > amarelo > vermelho) e anime as naves inimigas para se moverem pela tela em velocidades diferentes.

Saiba mais sobre o modo agent aqui.

🚀 Desafio

Você aprendeu sobre como desenhar com a API Canvas focada em 2D; dê uma olhada na API WebGL e tente desenhar um objeto 3D.

Quiz Pós-Aula

Quiz pós-aula

Revisão e Autoestudo

Saiba mais sobre a API Canvas lendo sobre ela.

Tarefa

Brinque com a API Canvas


Aviso Legal:
Este documento foi traduzido usando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.