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
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
"Thoughts on Flash" pode ter salvado a plataforma web
O jogo parece muito bem polido
high_impact não é uma "biblioteca", e sim um "framework"
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
UNIONCombinar 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
Como um dos 3000 detentores de licença, fico feliz em ver o renascimento do Impact
Parece uma excelente engine de jogos