Amor para odiar gamedev'a indie

A história é sobre como eu decidi começar a desenvolver o jogo sem conhecimento e experiência nesta área, sem um mecanismo e investimentos. Por que eu preciso disso? Por que mais alguém? Sobre fracassos e sucessos, sobre o início do cargo de desenvolvimento independente.



Olá pessoal! Meu nome é Roma e, por vários anos, venho desenvolvendo para C / C ++, perdoe-me. Programar para mim é um pouco mais do que trabalho. Daí o desejo de ter qualquer projeto que cresça e, com ele, o meu profissionalismo. Eu acredito nisso, de qualquer maneira. Muitas linguagens e tecnologias foram experimentadas, muitas idéias e tantas falhas. Eu acho que alguém se reconheceu. Este post falará sobre como iniciar o desenvolvimento de um jogo de computador em C ++ usando o OpenGl. A seguir, abordaremos o seguinte:


  1. Dificuldades que surgem na minha frente e abordagens para sua solução.
  2. Visão geral de tecnologias usadas e ferramentas de desenvolvimento.
  3. Links para recursos usados ​​na rede.

O que não vai mais acontecer:


  1. Sobre os meandros do desenvolvimento de C ++. A linguagem será mencionada com esse grau de abstração para que possa ser facilmente substituída por outra OOP de suporte nativo.
  2. Sobre motores prontos e seu uso. Não tenho nada contra, sou até a favor. Mas um post sobre outra coisa.
  3. Sobre a imagem magnífica usando os shaders de última geração. Até agora até agora.

Então, um post sobre aventureiro e arte. A abordagem de desenvolvimento descrita no final do post me parece pelo menos não canônica. No entanto, acho que ele tem o direito de existir. Se você leu esse lugar e gosta de desenhar com paus e vai improvisado significa, então você não ficará desapontado.


Início e falha


Uma breve revisão das ferramentas para o desenvolvimento de um jogo 2D sem nenhum mecanismo mostrou que você precisa escolher imediatamente uma estrutura para o processamento do mouse, teclado, além de suporte para áudio e exibição de primitivas gráficas. A biblioteca SFML foi selecionada. Demorou cerca de uma semana para se conhecer, algo foi esboçado: tanques dirigiram ao longo de um campo retangular e mataram uns aos outros, foi possível construir suas fábricas e similares no espírito do RTS do início dos anos 2000. Parecia monótono e queria 3D. Eu sabia menos sobre 3D do que javascript sobre segurança de tipos. O Google foi o primeiro a lançar o OpenGl, que está fora de moda. E também sobre recomendações para usar o chamado Core Profile deste OpenGl. Quem sou eu para escrever por métodos desatualizados? Das tentativas de cruzar o Perfil principal com o SFML, verificou-se que o SFML não suporta esse perfil ao mesmo tempo usando seu módulo gráfico. Foi um forte golpe moral, pois os recursos foram gastos no aprendizado da SFML. Além disso, nem toda a base de código foi abstraída da biblioteca de gráficos.


GLFW e a nova esperança


Como o nome da seção sugere, o Core Profile OpenGl e o GLFW se dão bem. O principal recurso que eu uso no OpenGl. Sim, sim, sem uma VPN, provavelmente ela não será aberta, graças aos defensores do Runet. Ajudante . Em uma semana ou duas, elementos geométricos simples com texturas flutuam pela tela. Mudar para GLFW com SFML ensinará alguém a valorizar o princípio de inversão de dependência (D no SOLID). Como resultado, nasceu



Eu não tinha ilusões sobre o lado estético da questão, mas o protótipo estava vivo. Sim, ele era feio, mas todo mundo conhece um famoso conto de fadas. O clima ficou melhor. Naquela época, a tarefa mais difícil para mim hoje foi resolvida: criar um modelo com animação. A tarefa foi dividida em subtarefas:


  1. Criando animações em um editor, por exemplo, no Blender.
  2. Exporte para um formato de suporte a animação, como Collada.
  3. Importe em C ++, por exemplo, com a biblioteca Assimp.
  4. Projetando classes e sua implementação usando OpenGl.

Assim, os tanques receberam uma torre rotativa.


Se orgulha do trabalho, mas tem vergonha de mostrar


Sim, hoje nem todos podem apreciar as abstrações lindamente projetadas, especialmente quando não estão . Algo era necessário para agradar aos olhos. Isso era uma espécie de cenário processual. O gerador é conhecido por todos, mas não para mim barulho de Perlin . Verificou-se que existem parâmetros que requerem seleção empírica. A recompilação é um golpe para a psique, por isso houve a necessidade de uma GUI para prototipagem. A pesquisa resultou em uma brilhante biblioteca ImGui . Com ele, os parâmetros numéricos, cores, modos de exibição, personalização são um prazer. O resultado do gerador resultante


img


Um pouco de nevoeiro


O nevoeiro é exibido em uma determinada altura com uma dada saturação em um sombreador de fragmentos usando uma função empiricamente selecionada. Se necessário, você pode adicionar várias camadas de névoa com seus próprios parâmetros, incluindo cores. Um exemplo de uma paisagem antes e depois de aplicar uma simulação de nevoeiro:



O momento em que algoritmos eram necessários


Sim, sim. A segunda vez em 5 anos. Trata-se de encontrar um caminho entre dois pontos na presença de obstáculos, porque as unidades terrestres não podem se mover pelas montanhas! O algoritmo A * vem em socorro. O pseudocódigo foi retirado daqui . A implementação requer criação de perfil e otimização, assim como muitos outros locais; no entanto, na versão atual, as unidades enfrentam obstáculos, se o caminho existe. Em algum lugar naquele momento, a idéia do jogo tomou forma.


O espaço que somos ...


A ideia de trabalho que evoluirá é a exploração do planeta pelos pioneiros. Criação de uma bio-, atmosfera- e, finalmente, ecosfera. Eu darei um exemplo Inicialmente, a vida só será possível dentro de uma cúpula criada artificialmente, dentro da qual será possível cultivar seres vivos: plantas, animais. Eles, por sua vez, afetarão a paisagem. A seguir, é apresentado um exemplo de uma cúpula e a paisagem abaixo dela através das iterações N e M, N <M.



Sobre Mercator, Terra e Política


Uma paisagem plana já é algo, mas apenas uma das vistas do planeta. Do meu ponto de vista, é muito mais atraente olhar para um corpo cósmico mais real. Hora da cartografia!


Se era impossível puxar um retângulo sobre uma esfera sem distorção, suspeitei, então o número de métodos de exibição se tornou uma revelação. A projeção mais comum de Mercator tem problemas com a exibição nos pólos e distorce bastante as proporções ao se afastar do equador. Tanto é assim que parece que a Federação Russa é maior que a África e os Estados Unidos - Austrália.


Como se viu, uma medida de distorção também pode ser calculada analiticamente. Grosso modo, um círculo em um plano se torna uma elipse em uma esfera e vice-versa. A tarefa foi a seguinte: adicione uma visão de um corpo esférico a uma visão plana. Daí o problema - que tipo escolher para o principal e qual exibir com distorção. Decidiu-se exibir uma vista plana sem distorção como uma vista que permite mais operações, incluindo a seleção e movimentação de unidades. A visão do corpo esférico foi deixada para operações com aeronaves, por exemplo, satélites artificiais. Como exibição, a projeção estereográfica de Gall é usada como um dos compromissos. As distorções foram calculadas usando elipses de distorção, elas também são a indicatriz de Tisso. Como resultado, você pode ver o seguinte: a captura de tela mostra uma visão do planeta como um corpo esférico com duas cúpulas, uma das quais alimenta duas fontes de energia, a outra - uma fonte.


img


Módulos de software e ciclo de desenvolvimento


A tarefa mínima no estágio “Devo começar?” Foi a seguinte: evoluir de simples para complexa e bonita ao longo do ano. É extremamente fácil sentir nojo em algumas semanas pelo amor ao projeto. Eu tenho cinco razões para isso:


  1. A primeira razão é o código. Sem suporte para arquitetura e refatoração sãs, na maioria das vezes haverá uma correção de bug, mas qual é a alegria?
  2. Concentração inadequada em um. Estar envolvido em um algoritmo de uma hora, uma hora - um modelo no Blender, não consigo atingir o objetivo.
  3. Concentração excessiva. Tendo participado do mecanismo e dos algoritmos por um longo tempo, a imagem não muda e parece que não há progresso.
  4. Dificuldade em dominar a ferramenta. A riqueza da interface do Blender ou da API OpenGl inspira respeito, se não medo. Pode levar vários dias desde o início até a primeira prova de conceito, que é um golpe muito moral.
  5. Altas expectativas e despreparo para o fracasso. Às vezes, é difícil abandonar a abordagem "Projetar, implementar e não retornar" em favor do "Protótipo / implementação / refinamento de interfaces"

Sendo um campeão do TDD, devo dizer que não vejo a possibilidade de aplicá-lo com uma porcentagem de P&D. Ficarei feliz se você, caro leitor, me der motivos para duvidar.


No momento, destacam-se as seguintes áreas de desenvolvimento:


  1. Criando modelos no Blender.
  2. Implementação de algoritmos e matemática, por exemplo, A * ou Perlin Noise.
  3. Desenvolvimento da parte "engine". Entende-se, por exemplo, como um gerador de terreno ou a importação de um modelo do Blender.
  4. Desenvolvimento de um módulo responsável pela renderização.
  5. Desenvolvimento da lógica do jogo. Requer que ela use o mecanismo e o módulo de renderização.
  6. Refatoração

Os planos incluem a separação dos módulos 2-5 no nível da biblioteca, com uma fachada em cada um. Um dos possíveis motivos: adicionar a funcionalidade de controle da câmera requer a recompilação em cascata de uma grande quantidade de código-fonte.


A prática mostra que ela funciona produtivamente se você se concentrar em uma área por 5 a 10 horas. Menos - o foco é perdido, mais - o olho está desfocado.


Periodicamente, para atingir a meta, vejo que é possível violar algumas regras do desenvolvimento normal, desde que o local da violação seja marcado e o tempo seja alocado para a refatoração. O último acontece a cada 7-10 dias. Exemplo: criando temporariamente variáveis ​​globais. Eu me livrarei deles passando-os para construtores / métodos durante a refatoração, o que ajudará a distinguir classes com baixa conectividade e alta velocidade. O que implicará uma nova rodada de refatoração. As vantagens desta abordagem:


  1. Disposição para implementar novas idéias. Rejeição do velho.
  2. A capacidade de evoluir interfaces.

Contras:


  1. A refatoração pode estar atrasada.
  2. Vejo suporte irreal para testes unitários / simulados.
  3. Alguns superam dificuldades no Vim. Por que o Vim se adiciona contras? Então, quais são as vantagens para mim mais.

Para ser continuado


Obrigado por sua atenção ao meu humilde post! Todo o código está aqui . Além das tarefas descritas acima, demorou muito tempo para se familiarizar com o Blender, a personalização do vim e a refatoração nele. Se foi pelo menos um pouco interessante, escreva. Eu posso cobrir algo com mais detalhes em uma das seguintes postagens. Um vídeo com mais detalhes de implementação está aqui .

Source: https://habr.com/ru/post/pt485288/


All Articles