5 pontos por GN⁺ 2024-08-05 | 1 comentários | Compartilhar no WhatsApp

high_impact: portando um motor de jogo em JavaScript para C

Resumo

  • high_impact é um pequeno motor de jogo para jogos de ação 2D, escrito em C e compilável para Windows, Mac, Linux e para a web via WASM
  • Foi inspirado no motor de jogo em JavaScript Impact, de 2010, e é disponibilizado sob a licença MIT
  • Código-fonte: GitHub

História antiga

  • Em abril de 2010, Steve Jobs anunciou em uma carta aberta chamada "Thoughts on Flash" que o iOS não daria suporte ao Flash
  • O Flash era um plugin de navegador extremamente importante na web, e muitos sites dependiam de jogos e animações em Flash
  • O Android oferecia suporte ao Flash, mas com desempenho ruim, e a decisão da Apple sinalizou o começo do fim do Flash
  • Biolab Disaster foi desenvolvido para provar que era possível criar jogos para a web sem Flash usando a API Canvas2D do JavaScript

Por que C?

  • C é uma linguagem simples, mas profunda, adequada para desenvolvimento de jogos
  • Ao portar um decodificador MPEG1 em JavaScript para C, implementar VR e desenvolver formatos de imagem e áudio, o autor redescobriu seu apreço por C
  • Reescrever o Impact em C seria um exercício divertido

Conceito

  • high_impact foi implementado com código mínimo e oferece carregamento de tile maps, criação de objetos de jogo, atualização e desenho
  • Ele lida com física e detecção de colisão, e inclui animação simples com sprite sheets, desenho de texto, efeitos sonoros e reprodução de música
  • high_impact é um framework, não uma biblioteca, então o usuário precisa escrever a lógica de negócio
  • Pode ser compilado usando os backends de plataforma SDL ou Sokol

Entidades

  • Todas as entidades compartilham a mesma struct entity_t, com propriedades como posição, velocidade e tamanho
  • É possível estender a struct base de entidade por meio de macros
  • Cada tipo de entidade deve fornecer um entity_vtab_t com ponteiros de função
  • Ele pode lidar com até 64k entidades ativas

Detecção e resposta a colisões

  • Calcula colisões com o tile map para encontrar com precisão o ponto exato da colisão
  • As colisões entre entidades são tratadas separadamente, e cada entidade define como colidir com outras entidades

Renderização

  • Oferece OpenGL e um renderizador por software
  • Toda a renderização é feita por meio de uma única chamada de função, combinando texturas com um atlas de texturas

Som

  • Usa SDL2 ou Sokol para lidar com a saída de som
  • Carrega um número fixo de fontes e pode reproduzir um número fixo de sons
  • Os sons são descartados automaticamente e podem ser reutilizados

Gerenciamento de memória

  • Gerencia memória usando um único array de bytes chamado "hunk"
  • Usa bump allocator e temp allocator para alocação de memória
  • A liberação de memória é tratada automaticamente, então o usuário não precisa se preocupar com gerenciamento de memória

Editor de fases

  • Inclui o editor de fases original do Impact, chamado "Weltmeister"
  • Foi escrito em JavaScript e atualizado para usar recursos modernos de navegadores
  • Usa a API de sistema de arquivos para carregar e salvar arquivos

Jogo de demonstração

  • Dois jogos, Biolab Disaster e Drop, foram portados para C para validar os recursos do high_impact

Extensibilidade

  • high_impact é um motor de jogo tradicional, com código específico de cada jogo sendo adicionado separadamente
  • A plataforma e o renderizador podem ser estendidos para dar suporte a outros sistemas

Resumo do GN⁺

  • high_impact é um motor de jogo 2D escrito em C que oferece recursos simples, mas poderosos
  • Como sucessor do motor de jogo em JavaScript Impact, ele pode rodar em várias plataformas
  • Implementa de forma simples funções essenciais para desenvolvimento de jogos, como gerenciamento de memória e detecção de colisão
  • Fornece casos de uso reais por meio de um editor de fases e jogos de demonstração
  • Em comparação com motores grandes como Unity ou Unreal, é adequado para projetos mais leves e simples

1 comentários

 
GN⁺ 2024-08-05
Comentários no Hacker News
  • Muitos jogos web foram feitos com a engine Impact e ela serviu de base para títulos comerciais multiplataforma como Cross Code, Eliot Quest e XType Plus

    • Cross Code é um jogo excelente, e foi impressionante ver o uso de tecnologias web
    • Acho que essa engine deve ter contribuído para o alto desempenho no hardware do Nintendo Switch
  • "Thoughts on Flash" pode ter salvado a plataforma web

    • Deve ter havido frustração com a Adobe por abandonar o suporte à plataforma MacOS
    • A versão para Mac sempre ficava atrás da versão para Windows
    • Jobs pode ter achado que a Adobe não existiria sem a Apple
  • O jogo parece muito bem polido

  • high_impact não é uma "biblioteca", e sim um "framework"

    • É preciso escrever a lógica de negócio dentro do framework
    • Frameworks costumavam ser descritos de forma pejorativa como "bibliotecas" que não combinam bem com outras coisas
    • É bom ouvir uma forma positiva de expressar isso
  • Fico feliz de ter entrado na minha conta do HN depois de muito tempo e redescoberto Biolab Disaster

  • Foi impressionante criar uma estrutura de dados de entidade polimórfica usando UNION

    • Ainda gosto de C, foi a primeira linguagem que aprendi
    • C é uma linguagem compacta, mas dá para explorá-la em profundidade
    • O jogo passa uma vibe de Commander Keen, e eu gostava dessa franquia
  • Combinar o formato de arquivo sem perdas QOI com 7Zip tem desempenho melhor do que PNG sem perdas

  • Pode ser por respeito à duração da bateria do jogador

  • Ideia divertida, open source para máximo valor de aprendizado, execução perfeita, escrita clara sem vaidade — uma contribuição incrível

    • Só de ver algo assim já parece um privilégio
  • Como um dos 3000 detentores de licença, fico feliz em ver o renascimento do Impact

    • Fico curioso se combina bem com Zig
  • Parece uma excelente engine de jogos

    • Fico curioso por que o artigo menciona que ela está quase no fim da vida útil
    • Fico curioso se existem engines novas melhores