Show HN: Tornei meu motor de jogo open source
(github.com/moddio)Motor de jogo Moddio 2
- O Moddio é um motor de jogo com foco em multiplayer.
- Ele inclui código de rede com autoridade do servidor, interpolação de snapshots e recursos de reconciliação no lado do cliente.
- Suporta mais de 50 jogadores simultâneos ou mais de 300 objetos em movimento em uma VM de 5 dólares por mês.
Demonstração
- Inclui na caixa: motor físico Box2D, código de rede com autoridade do servidor, sistema de inventário e itens, atributos integrados (HP, energia etc.) e taxas de regeneração, sistema de diálogo, loja, controle de unidades, projéteis e movimentação de unidades com predição no lado do cliente, IA de unidades e pathfinding A*, controles para mobile e mais.
Como executar o jogo
- Requer Node 18 ou superior.
- Depois de configurar o repositório, vá para o diretório
/src, renomeiegame-sample.jsonparagame.jsone volte ao diretório raiz para executar o servidor. - Agora você pode jogar em http://localhost:80.
Como criar um novo jogo do zero
- Os jogos Moddio são criados e editados usando o editor de jogos Moddio disponível em https://www.modd.io.
- Depois de criar um jogo, você pode exportar um
game.jsonpara uso na instalação local. - Renomeie o JSON exportado do jogo para
game.jsone mova-o para o diretório./src.
Como contribuir
- O Moddio é totalmente gratuito e open source sob a licença MIT.
- Para saber como se tornar um colaborador, visite a página de contribuição.
Créditos
- São usados o motor de jogo Isogenic, Phaser, PlanckJS, uWebsocket, Box2D, assets da Kenney, Hero Icons e outros.
Opinião do GN⁺
- O motor de jogo Moddio é especializado no desenvolvimento de jogos multiplayer e oferece recursos poderosos para suportar muitos jogadores com baixo custo.
- Por ser open source e evoluir continuamente com contribuições da comunidade, ele também é bastante acessível para engenheiros de software iniciantes.
- Como traz incorporadas várias funcionalidades necessárias para o desenvolvimento de jogos, ele oferece um ambiente em que os desenvolvedores podem criar protótipos e testar rapidamente.
1 comentários
Opiniões no Hacker News
Na tela de cadastro do app Android, pedem para inserir o nome de usuário e a senha do Google em algo que parece um formulário web dentro do app, e o usuário não tem como saber se o app está espionando a senha.
Normalmente, parece que os apps usam um fluxo em que você vai para a tela de login e depois volta; fico curioso se implementar esse padrão é difícil. Também me pergunto se é um problema causado pelo suporte multiplataforma.
Dito isso, o método mencionado acima realmente não deveria acontecer, e eu achava que o Google já o tinha proibido.
Fazer usuários adotarem um motor de jogo nunca é algo fácil, e é ainda mais difícil se ele tiver código fechado.
Olhando a galeria de jogos no site, parece que eles se saíram muito bem até agora; fico curioso se foram alguns amigos que fizeram aquilo ou se há uma comunidade bastante ativa.
Pense em uma estrutura em que dá para obter resultados significativos mesmo dedicando só alguns dias, ou até algumas horas, de forma casual. Basta lembrar do Flash.
O fato de a barreira de entrada ser baixa tanto para desenvolvedores de jogos quanto para jogadores certamente ajuda. Não é preciso baixar nada nem se cadastrar.
Só pelo título, eu não imaginaria que isso fosse o modd.io. É um framework/plataforma popular usado para criar jogos IO.
Entrei em um servidor Brains e fiquei curioso para ver como seria a experiência com cerca de 50 jogadores. Como seria de esperar em WebSockets, o movimento ficou meio aos trancos, e, como estou fazendo algo parecido, também fiquei curioso sobre a compressão de rede.
Não sei bem se só a compressão LZ-string é suficiente. Com 50 jogadores, usa cerca de 20 KB por segundo, enquanto Warzone usa só cerca de 48 KB por segundo com 150 jogadores. Se os dados não forem ilimitados, o custo de largura de banda na nuvem pode ficar bem alto.
Também achei curioso que o buffer de bytes comprimido pareça
埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼. Não sei se o resultado da compressão LZ-string normalmente fica assim, mas parece bem estranho.De todo modo, há bastante espaço para melhorar a parte de networking se quiserem reduzir custos potenciais. O projeto como um todo é muito impressionante e bem feito.
O ponto central é predição no lado do cliente e um algoritmo de rollback networking. O estado do nosso jogo tem cerca de 1 KB a 30 Hz, então normalmente cabe em um único pacote; por isso, WebSockets também não são tão ruins. Claro, um protocolo não confiável seria melhor.
Testei um pouco WebSockets alguns meses atrás e, pelo que entendi, há desvantagens consideráveis em usar TCP para comunicação sensível a latência, como em jogos. O cabeçalho TCP é mais que o dobro do UDP, há pacotes de controle adicionais, e o envio de dados novos é atrasado enquanto dados antigos são retransmitidos. Como WebSockets também rodam sobre TCP, têm as mesmas desvantagens.
Mesmo assim, dizem que TCP garante a entrega de mensagens WebSocket, mas consegui reproduzir perda de pacotes. No fim, as desvantagens continuam lá e, se você realmente precisa de entrega garantida, precisa construir algo por cima; nesse caso, talvez desse para ter construído desde o início, sobre UDP, só as mensagens que precisam disso.
Meu conhecimento e experiência em networking são quase inexistentes, além de ter mexido um pouco nisso, então leve isso em conta.
U+3400~U+4DBFeU+4E00~U+9FFF.A string em questão é decodificada como
\u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7c.[1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
Um jeito infalível de nunca terminar um jogo é começar escrevendo um motor.
Criar sua própria tecnologia é perfeitamente possível, mas, a cada etapa, essa tecnologia deve ser ajustada ao seu projeto, não a uma plataforma genérica de jogos.
Aqui, “começar um blog” significa criar um novo motor de blog totalmente do zero.
Já vi backends multiplayer baseados em Node.js acabarem ficando lentos a ponto de se arrastar quando o número de conexões aumenta. Fico curioso para saber como vocês resolveram isso
Em casos assim, uma alternativa como Go não seria melhor?
Também não parece que o backend vá estar fazendo trabalho pesado de física para o frontend
Em testes simples, teve desempenho muito melhor do que outras bibliotecas populares de WebSocket que ficam lentas rapidamente
Por isso Node me parece uma boa escolha
Embora cada jogo seja limitado a no máximo 64 jogadores, testamos com mais de 100 conexões e não vimos problemas de desempenho. Cada jogo roda em um contêiner isolado
Fico curioso sobre a motivação para criar um novo engine
Pelo README, há coisas bem específicas embutidas, como sistema de armas (corpo a corpo/projéteis), loja, projéteis com predição do lado do cliente e movimentação de unidades
Fico me perguntando por que embutir essas coisas no engine, em vez de fazê-las como plugins copiáveis. Claro que muitos jogos não precisam desses recursos; isso é um engine de jogos? Ou é um engine para FPS/RPG/outros gêneros específicos?
Não é que eu não goste da tecnologia em si, mas ainda fica a pergunta: “por quê?”. Para que serve? Por que eu deveria usar isso em vez de Three.js e meu próprio servidor?
Por exemplo, criamos um MMORPG simples em 2 horas: https://www.youtube.com/watch?v=GZVsxkALR5U
Vemos uma relação inversa entre facilidade de uso e nível de customização. Escolhemos a primeira para reduzir a distância entre jogos multiplayer, que são conhecidos por serem difíceis de criar, e desenvolvedores de jogos casuais
Acho que não é para você, e sim para pessoas que querem criar esse tipo específico de jogo. Nem todo engine precisa ser de uso geral
Eu tinha alguns projetos de hobby que pareceriam combinar bem com isto. Sei programar, mas há momentos em que, ao fazer projetos de hobby, não quero me concentrar tanto nisso, então low-code e um editor interativo parecem bons para desenvolvedores amadores
Pessoalmente, o que mais me empolga é a criação de mapas e mundos. Parece que o melhor caminho seria exportar o jogo para JSON, modificá-lo por programa e depois importá-lo de volta; queria saber se é isso mesmo
Ainda assim, é um pouco intimidador. O mundo do tutorial sem modificações tem 3.500 linhas de JSON, então há muita coisa para entender
A primeira abordagem que me veio à cabeça foi fazer edições intencionalmente e ver como o JSON muda. Também vou precisar procurar um bom visualizador de diff para JSON. Acho que isso ajudaria a encontrar as partes em que quero mexer. Os assets e tiles do mapa provavelmente eu reuniria no editor interativo
Queria saber se essa abordagem é razoável e se há ferramentas que ajudem
Um criador da nossa comunidade está gerando mapas dinamicamente com o ChatGPT. Ele está fazendo um jogo de esconde-esconde, envia um prompt para gerar o JSON de um mapa 2D e carrega esse mapa a cada nova rodada. Ainda não foi publicado, então é difícil compartilhar o jogo
Além disso, um membro da comunidade está criando um interpretador para o JSON dos nossos jogos. Ex.: https://pypi.org/project/pymodd/
É bom ver mais projetos open source como este surgindo. É surpreendente que tenha menos de 100 estrelas no GitHub