Motor de jogo ECS de pixel art feito em C# 'Murder'
(github.com/isadorasophia)- Murder Engine é um motor de jogo ECS para pixel art construído sobre o FNA, ainda em desenvolvimento, com muitas mudanças e possibilidade de breaking changes
- Como exemplos para começar, são sugeridos o projeto de game jam neocityexpress e o hellomurder, que mostram o fluxo de criação de mundos, entidades e componentes
- A estrutura do projeto separa
gameegame.editor, e adota a abordagem de controlar o editor diretamente dentro do projeto do usuário, sem umeditor.exeseparado - O ambiente de desenvolvimento oferece suporte a Linux, MacOS, Windows e Steam Deck, requer o .NET 8 SDK, e os jogos têm como alvo Linux, MacOS e Windows
- Ainda não há pacote NuGet, então o recomendado é referenciar via git submodule no
.csproj; no momento, não há plano oficial de suporte para web ou mobile
Natureza e estado do Murder Engine
- Murder Engine é um motor de jogo ECS para pixel art baseado em FNA
- O motor ainda está em desenvolvimento e, embora a branch de release tente se manter estável, é preciso esperar muitas mudanças e partes ainda inacabadas
- O README alerta com “Proceed at your own risk” e deixa explícita a possibilidade de breaking changes
Exemplos iniciais e caminho para aprender ECS
- Para quem prefere entender rapidamente vendo exemplos, o fluxo recomendado é começar pelos seguintes projetos
- game jam project: projeto de game jam que permite ver a arquitetura do Murder
- Hello World project: exemplo que mostra como criar mundos, entidades e componentes
- Para entender como o ECS é aplicado no Murder, a documentação do Bang é indicada
- Bang é o framework ECS usado pelo Murder
Estrutura do projeto e abordagem do editor
- A estrutura de um projeto Murder é dividida em
resources,src/gameesrc/game.editorgameincluibin,packederesourcespara o jogo finalgame.editorincluibineresourcespara o editor do jogo
- Não existe um
editor.exeexterno; só existe o próprio projeto do usuário - Essa estrutura foi escolhida para permitir controlar o projeto inteiro diretamente, de forma parecida com o desenvolvimento de projetos em MonoGame ou FNA
- O editor fica em um projeto separado para impedir que o código do editor toque o código do jogo e para dar liberdade total ao lado do editor
Build e forma de dependência
- No momento, não existe pacote NuGet para o Murder
- A forma recomendada é adicionar o Murder como git submodule e referenciá-lo no
.csproj - Um exemplo de referência está em HelloMurder.csproj
Requisitos e plataformas suportadas
- O ambiente de desenvolvimento para rodar o editor oferece suporte a Linux, MacOS, Windows e Steam Deck
- O requisito necessário é ter o .NET 8 SDK instalado
- As plataformas-alvo dos jogos são Linux, MacOS e Windows
- No Linux, isso inclui o Steam Deck
- O suporte a consoles está em andamento
- No momento, não há plano oficial de suporte para web nem para mobile em iOS e Android
Contribuição e feedback
- O projeto ainda está em um estágio muito inicial
- É possível entrar em contato com a criadora para sugestões ou feedback; ela informa ter interesse em uso real do projeto e retorno dos usuários
1 comentários
Opiniões no Hacker News
Vi que tinha o nome saint11 e tive certeza de que seria bom. Os tutoriais de pixel art são muito bem organizados: http://saint11.org/blog/pixel-art-tutorials/
Novos motores de jogo e frameworks ECS são divertidos de ver. Olhando para Bang, a parte de ECS, há exemplos de componentes como
CarComponente sistemas comoCarMoverSystem; os sistemas são classes, e a interface que implementam parece determinar o momento de execuçãoLembra um pouco DOTS, mas ainda não encontrei onde os sistemas são adicionados ao jogo nem como sistemas do mesmo tipo são ordenados. Também tenho curiosidade sobre como seria um sistema que faz várias consultas diferentes, como carros e obstáculos
Bang parece usar um gerador de código-fonte. Diferentemente de
GetComponent,TryGetVelocity,RemoveFrictioneSetVelocityparecem ser gerados com base na existência dos componentesVelocityeFriction, talvez por causa de cache de IDs de componentes, mas não tenho certezaNão é baseado em arquétipos; cada entidade armazena um dicionário
component id => component, e cada sistema acompanha quais entidades correspondem ao seu filtro. Não sei quão bom será o desempenho, mas em muitos jogos a conveniência no desenvolvimento pode ser mais importante que performanceAs mudanças também parecem ser aplicadas imediatamente. Então fico curioso: quando um sistema adiciona/remove componentes de uma entidade e isso muda se ela corresponde ou não ao filtro, se ela é processada no mesmo tick depende do ID da entidade?
Dando uma olhada rápida na documentação, não vi uma forma de indicar explicitamente essas dependências ou a ordem, e fico curioso para saber como este engine lida com isso
A página no Itch e o download de um jogo de jam feito com este framework: https://saint11.itch.io/neo-city-express
É impressionante para um jogo de jam de 72 horas. A arte e o texto são bons, e há diversão mecânica de um jeito inesperado
Muito bom. O editor é extremamente estiloso, gostei bastante. Sempre gostei do MonoGame por ter boa performance e ser multiplataforma, mas nunca fiz um jogo grande com ele, só alguns demos de vez em quando
Parece bom. Fico me perguntando se no desenvolvimento de jogos em C# existe problema com pausas do GC
Em cenas e gameplay no estilo Q3A, é muito sólido. Como há poucos elementos de cena mudando a cada tick, as pausas do GC são em grande parte desprezíveis
No .NET 6+, em um engine DIY, as pausas do GC foram medidas em torno de 1 a 5 ms quando chamado repetidamente de forma estratégica. Desativar o GC concorrente/servidor/em segundo plano nas configurações do projeto e usar GC em primeiro plano + workstation foi o que gerou menos jitter
As opções parecem ser gerenciar a memória 100% manualmente ou limpar o lixo com a maior frequência possível. No .NET moderno, é quase impossível desligar completamente o GC sem alguma magia negra como hacks de DLL de baixo nível. Se você puder reiniciar o processo entre eventos de trabalho ou rodadas de jogo,
Process.Exit()também é uma técnica de GC válida em alguns contextoshttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
Só lendo o link não dá para saber bem, mas fico curioso sobre quão difícil seria fazer um jogo em F# com o engine Murder
Usei um pouco ECS no Unity, e o ECS do Murder foi muito mais fácil. Os desenvolvedores fizeram um trabalho realmente bom
Fiz um pequeno projeto de jogo arcade com Murder, jogável aqui: https://nopetrides.itch.io/bombs-away
Na página de apresentação do saint11 está escrito: “Murder Engine: 2D Pixel art C# ECS Game Engine made by Isa! I usually help on the render and physics side of it.”
Isa: https://isadorasophia.com/projects/
Não tem relação com o engine de jogo, mas acho engraçado que uma pessoa mal-intencionada poderia dizer que “as pessoas daquele site de hackers estão discutindo murder”
Ultimamente tenho pensado bastante em como esse tipo de material totalmente inofensivo poderia ser usado por um adversário persistente
Ainda assim, em um caso tão fácil de refutar, não sei se haveria grande diferença entre dizer “as pessoas estão discutindo murder” e uma mentira descarada
O que é ECS?