Aprenda a desenvolver um jogo utilizando apenas HTML 5 e JavaScript, nesse primeiro artigo vamos mostrar como funciona e como fazer um motor de jogo.
Acredito que o desejo de muitos programadores inciantes(não necessário) é desenvolver um jogo, logo no inicio da minha carreira profissional a minha vontade de transformar ideias de jogos em realidade era grande, hoje em dia, existe um material enorme sobre o assunto na internet, mas é um conteúdo tão bagunçado que as vezes eu me perdia nos meus estudos.
Graças ao Filipe Alves e de seu canal no YouTube, eu tive a oportunidade de aprender mais sobre o assunto de uma forma bem clara. Estarei postando a serie de vídeos que ele fez e explicando o passo a passo dele.
Iniciando o desenvolvimento do jogo
Um jogo funciona dentro de um loop infinito, chamamos esse loop de motor de jogo ou “game engine” esse loop nada mais é que algumas funções básicas chamando outras, vamos iniciar nosso código HTML e a criação das funções básicas do nosso jogo.
<! DOCTYPE html> <html lang = "pt-br"> <head> <meta charset = "utf-8"> <title> Jogo HTML5 </ title> </ head> <body> <script type = "text / javascript"> //VARIÁVEIS GLOBAIS DO JOGO var canvas, ctx, ALTURA, LARGURA, frame = 0; //funções do jogo // responsável pelo controle do jogo, toda vez que clicar o personagem pula function clique(){} // função principal, o construtor do jogo function main () {} //responsável por criar o loop do jogo function roda() {} // responsável por atualizar os status do jogo function atualiza(){} // responsável por renderizar os gráficos function desenha(){} // incia o jogo main(); </ script> </ body> </ html>
Temos no total 5 funções mas apenar 3 delas são necessárias para nosso game engine, um jogo fica renderizando gráficos em um canvas e a cada segundo ele atualiza esse gráficos, ou seja, é como se fizéssemos um “refresh” a cada segundo na pagina e a cada momento aparece algo novo, isso não vale apenas para os gráfico mas para todo o código, ou seja, as funções sempre serão chamadas a cada momento e se executando conforme suas condições.
Agora vamos fazer o canvas ser incluído no HTML dinamicamente, além disso nos vamos definir uma altura e largura conforme o tamanho do monitor do usuário.
<! DOCTYPE html> <html lang = "pt-br"> <head> <meta charset = "utf-8"> <title> Jogo HTML5 </ title> <style type = "text / css"> /*RESPONSÁVEL POR ALINHAR O CANVAS NO CENTRO DA PAGINA*/ canvas{ position: absolute; top: 0px; bottom: 0px; left: 0px; direito: 0px; margin: auto; border: 1px solid # 000; } </ style> </ head> <body> <script type = "text / javascript"> //VARIÁVEIS GLOBAIS DO JOGO var canvas, ctx, ALTURA, LARGURA, frame = 0; // Irá contar o cliks e fazer o personagem pular function clique(event){ // para testarmos se o clique funciona será exibiro um alert para toda vez que o clique for acionado ! alert("testando clique!"); } // função principal onde será chamada as outras funções (contrutor) function main () { // pega a largura total da tela LARGURA = window.innerHeight; // pega a altura total da tela ALTURA = window.innerWidth; //se a largura for mair que 500px a largura é redefinida para 600 px //obs, essa condição sempre será verdadeira para desktops, portanto a largura e altura sempre sera 600px if (LARGURA >= 500){ LARGURA = 600; ALTURA = 600; } // criação de um novo elemento do tipo canvas, é como se eu escrevesse a tag canvas no html canvas = document.createElement ("canvas"); //define a largura do canvas canvas.width = LARGURA; //define a altura do canvas canvas.height = ALTURA; // pegar o contexto 2D para o canvas, isso quer dizer que tudo quer for renderizado será do contexto 2D ctx = canvas.getContext ("2d"); // adiciona o canvas ao nosso documento HTML document.body.appendChild (canvas); // adiciona o evento de clique, toda vez que alguém cliar na pagina será executado a função "clique" que criamos anteriormente, o evento será pasado por parametro document.addEventListener("mousedown", clique); //chama a função roda roda(); } //responsável por fazer a function roda() { atualiza(); desenha(); } function atualiza(){} function desenha(){} // incia o jogo main(); </ script> </ body> </ html>
a partir desse código, já temos um documento com canvas definido e o principal controlado (no caso o clique) funcionando corretamente, para ter certeza de que não há erros use o console do seu navegador para depurar o código.
Você pode abrir seu documento HTML no navegador e testar o código a vontade e ficar livre para editar, o próximo passo será a construção do loop que ficar chamando a função roda sempre, através do método “requeste animation frame”.
A função roda será responsável por chamar a função atualiza e a função desenha, a função atualiza sera responsável por atualizar os status do jogo, status do personagem e novos valores para as variáveis, a função desenha fara a renderização a cada momento no canvas, apagando a anterior e refazendo o desenho em uma nova posição se necessário.
Nota: Quando se utiliza algum tipo de atualização apenas na posição X e Y de alguma elemento do canvas (no caso um retângulo que foi desenhado) o anterior não some, isso acontece por que na verdade só estamos mudando o elemento de posição, então teremos um rastro do elemento, o método que estamos utilizando redesenha o elemento por completo apagando o anterior deixando a animação limpa.
Pronto, nosso primeira parte do código completo!
<!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8"> <title>Game HTML5</title> <style type="text/css"> /*RESPONSÁVEL POR ALINHAR O CANVAS NO CENTRO DA PAGINA*/ canvas{ position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; margin: auto; border: 1px solid #000; } </style> </head> <body> <script type="text/javascript"> //VARIÁVEIS GLOBAIS DO JOGO var canvas, ctx, ALTURA, LARGURA, frame = 0; // Irá contar o cliks e fazer o personagem pular function clique(event){ // para testarmos se o clique funciona será exibiro um alert para toda vez que o clique for acionado ! alert("testando clique!") } // função principal onde será chamada as outras funções (contrutor) function main(){ // pega a largura total da tela LARGURA = window.innerHeight; // pega a altura total da tela ALTURA = window.innerWidth; //se a largura for mair que 500px a largura é redefinida para 600 px //obs, essa condição sempre será verdadeira para desktops, portanto a largura e altura sempre sera 600px if (LARGURA >= 500){ LARGURA = 600; ALTURA = 600; } // criação de um novo elemento do tipo canvas, é como se eu escrevesse a tag canvas no html canvas = document.createElement("canvas"); //define a largura do canvas canvas.width = LARGURA; //define a altura do canvas canvas.height = ALTURA; // pegar o contexto 2D para o canvas, isso quer dizer que tudo quer for renderizado será do contexto 2D ctx = canvas.getContext("2d"); // adiciona o canvas ao nosso documento HTML document.body.appendChild(canvas); // adiciona o evento de clique, toda vez que alguém cliar na pagina será executado a função "clique" que criamos anteriormente, o evento será pasado por parametro document.addEventListener("mousedown", clique); //chama a função roda roda(); } //responsável por fazer a function roda() { //chama a função atualiza atualiza(); //chama a função desenha desenha(); // a cada segundo a função roda sera chamada window.requestAnimationFrame(roda); } function atualiza(){ //incrementa mais 1 ao nosso frame frame ++; } function desenha(){ // define a cor do retangulo que queremos dezenhar ctx.fillStyle = "#50BEff"; // desenha um retangulo da x = 0 até o tamanho total da largura //e de y = 0 até o tamanho total da altura ctx.fillRect(0,0, LARGURA, ALTURA) } // incia o jogo main(); </script> </body> </html>
Ao ler o código é possível encontrar a função roda, atualiza e desenha completas, além disso já é possível desenhar no cavas como foi feito na função desenha renderizando um retângulo azulo que dar o efeito de fundo do nosso jogo.
No próximo artigo vamos começar a criar os objetos do jogo como personagem, além disso vamos aplicar gravidade e outras coisas mais !