31 pontos por GN⁺ 2023-11-26 | 1 comentários | Compartilhar no WhatsApp

Redescobrindo a diversão em programar: superando o burnout com desenvolvimento de jogos

  • Reclamação frequente nas comunidades de desenvolvedores: a paixão por programar desapareceu
  • Dica para aliviar o burnout: criar seu próprio jogo para voltar a gostar de programar
  • Compartilhamento de uma experiência pessoal de como o desenvolvimento de jogos levou alguém a se apaixonar por programação
  • Recomendação de desenvolver jogos usando a linguagem Go e a biblioteca Ebitengine

Princípios básicos do desenvolvimento de jogos

  • Assim como nos filmes, jogos são um conjunto de imagens consecutivas rápidas (frames)
  • Jogos geram imagens em tempo real e alteram o próximo frame de acordo com a entrada do usuário
  • Jogos são basicamente um loop infinito, repetindo o desenho de imagens e a atualização da lógica

Configuração do projeto

  • Criar um módulo Go e adicionar a biblioteca Ebitengine
  • Executar uma janela vazia com a implementação mínima da interface do jogo

Carregamento de assets

  • Recomenda-se usar arte feita por programadores ou aproveitar assets gratuitos
  • Usar o pacote embed para carregar assets no código

Desenhando imagens

  • Realizar todo o trabalho de desenho dentro do método Draw
  • Usar o método DrawImage de ebiten.Image para desenhar uma imagem sobre outra
  • Ajustar posição, rotação e escala da imagem por meio da struct DrawImageOptions

Lógica do jogo

  • A struct Game mantém o estado do jogo e altera esse estado com o método Update
  • Como exemplo, manter a posição do jogador como um vetor (X, Y)

Movimento

  • Implementar movimento atualizando a posição do jogador no método Update
  • Alterar a posição do jogador conforme a entrada do teclado

Timer

  • Implementar timers para alterar a lógica do jogo com base no tempo
  • Usar a struct Timer para disparar eventos em intervalos específicos

Objetos de jogo

  • Encapsular e gerenciar objetos de jogo, como o jogador
  • Cada objeto tem seus próprios métodos Update e Draw

Criação de objetos

  • Criar objetos de meteoro e fazê-los surgir nas bordas da tela
  • A struct Game acompanha os objetos de meteoro

Disparo de balas

  • Implementar a lógica de disparo e um timer de cooldown
  • O Player cria as balas e o Game as acompanha

Detecção de colisão

  • Implementar a struct Rect e o método Collider() para detecção de colisão
  • Verificar colisões entre objetos no Update do jogo

Opinião do GN⁺

O ponto mais importante deste texto é mostrar uma forma de os desenvolvedores superarem o burnout e recuperarem a motivação para programar. O desenvolvimento de jogos oferece uma oportunidade de praticar habilidades de programação por meio de projetos criativos e divertidos, ao mesmo tempo em que permite aprender uma nova linguagem ou biblioteca. O texto inspira desenvolvedores a voltar a aproveitar a programação como hobby e desperta interesse ao explicar uma abordagem básica para desenvolvimento de jogos usando a linguagem Go e a biblioteca Ebitengine.

1 comentários

 
GN⁺ 2023-11-26
Comentários do Hacker News
  • O primeiro usuário prefere escrever fogos de artifício ou uma simulação simples de partículas para testar desempenho ao aprender uma nova linguagem ou API gráfica. Quando experimentou com Go e Ebitengine em 2021, ficou profundamente impressionado com o desempenho surpreendente e a facilidade de uso, conseguindo mover muitos pixels a 60fps.
  • O segundo usuário trabalhou no desenvolvimento de um jogo no ano passado usando a linguagem Go com a g3n-engine. Escolheu Go porque gosta da linguagem e queria aprendê-la, e escolheu a g3n-engine porque queria trabalhar com 3D após experiências anteriores com desenvolvimento de jogos 2D. Fazer jogos é uma experiência muito mais desafiadora e recompensadora do que trabalho remunerado, e sempre há algo novo para aprender.
  • O terceiro usuário menciona que a API do Ebiten para a linguagem Go é muito boa e que é possível se inspirar no design da API. Também melhora o desempenho no desenvolvimento de jogos usando um compilador personalizado que converte Go para C++, permitindo acesso a APIs em C/C++ e bom desempenho também em WebAssembly. Esse compilador também inclui experimentos para gerar GLSL a partir de código Go.
  • O quarto usuário não é desenvolvedor Go, mas acompanha há muito tempo um YouTuber/streamer da Twitch que faz jogos com Go. Esse streamer está desenvolvendo um pequeno MMO em Go e também uma versão web usando OpenGL e WASM. Apesar de entender que o garbage collector do Go é muito robusto, muitas pessoas ainda perguntam: "por que fazer em Go?".
  • O quinto usuário reage apenas à primeira parte do artigo e sugere que, se o autor está passando pelo burnout descrito, em vez de “reconquistar” o hobby, deveria evoluir seus interesses. Isso pode ser um sinal de que o cérebro está estagnando, e talvez seja hora de se aprofundar mais em teoria da ciência da computação, mesmo que isso não seja exatamente programação.
  • O sexto usuário, como usuário do Ebitengine há alguns anos, relata uma experiência satisfatória. Se quiser ver o código-fonte de jogos feitos com Ebitengine, recomenda conferir a lista awesome-ebitengine. Todos os jogos listados no perfil do usuário no itch.io foram feitos com Ebitengine e são open source.
  • O sétimo usuário está desenvolvendo um jogo com Ebitengine e acha a experiência revigorante.
  • O oitavo usuário questiona se Go é uma plataforma adequada para escrever jogos grandes e se há bibliotecas e desempenho suficientes para justificar seu uso em vez de C#.
  • O nono usuário se pergunta se Go é uma linguagem adequada para fazer jogos por causa do conceito de goroutines e pensa em tentar algum dia.
  • Por fim, há uma observação sobre um jogo baseado em Ebitengine, apontando que a frase sobre “como um exemplo de componente Sprite poderia parecer” está truncada e precisa ser corrigida.