Como construir uma engine de jogo
Construir uma engine de jogo(engine básica de jogo) é na verdade bastante simples. uma engine de jogo básica é apenas um loop, então enquanto eu recomendaria linguagens de programação com alto desempenho como c ou c++ você também pode usar outras linguagens que suportam looping e funcionalidades básicas, por exemplo Java para obter fácil distribuição entre plataformas.
o primeiro passo para projetar e fazer a engine principal. este é o loop. você começa desenhando o que ele precisa fazer e em que ordem. por exemplo, o loop principal geralmente sempre contém coisas como Input, Logic, UserInterface(visual) e som. enquanto pode ser recomendado também adicionar estados de loop para coisas como física, ai, colisão, etc. um loop pode ser feito antes de você ter ou saber como qualquer coisa vai ser usada. assim você pode criá-lo assim por exemplo em Cx* (especificação da linguagem, mas a idéia principal deve ser clara)
#include
#include
#include //this includes all your self made librarys in the loop, they don't need to exist yet. this speciffic line includes a libraty named Logic.h. it is recommended to make such librarys to keep your code clean and easly maintainable. você também pode usar #include "UI.h" desta forma você pode simplesmente usar outro arquivo. você não precisa usar librarys, mas fazendo isso o torna mais modular, já que você pode simplesmente conectar uma biblioteca diferente com as mesmas funções e isso irá mudar todo o comportamento.
int main()
{
Input.Start(); Logic.Start(); UI.Start();// use isto para definir os valores certos e para iniciar loops secundários para tarefas de fundo como o seu motor de som(este é fácil de fazer em outra thread, então a menos que você esteja trabalhando em um mashine com uma única thread, é recomendado defini-lo em um loop separado e usar triggers como um bool ou int para mudar o estado), etc.
bool GameEngineRunning=true;
while(GameEngineRunning)
{
Input.Update();
Logic.Update() ;
UI.Update();//updates (roda através das funções padrão por loop e executa ações/ajusta gatilhos.
}
retorno 0;
}
p> este poderia ser um mecanismo de jogo funcionando e você poderia torná-lo mais simples. nas librarys como a entrada você pode, por exemplo, obter entrada de teclado e enviar de volta em uma variável pública se ela recebeu algo e se sim o que (na maioria dos casos você só verifica no momento para que isso ainda não verifique o fluxo porque você quer evitar esperas. um fluxo pode ser adicionado por exemplo pela lógica, ou o que quer que seja que precise do fluxo para adicionar os valores chave a uma variável string quando espera tal entrada, a entrada só lida com o que é entrado nesse exato momento, a menos que você tenha um jogo no terminal (como um jogo tático como xadrez) ou onde a taxa de quadros do jogo não é importante. Usar a estrutura da biblioteca ajuda-o com isto uma vez que agora pode usar o mesmo motor para jogos sem necessidade de uma taxa de frames contínua, como usaria para um jogo dependente da taxa de frames apenas mudando a biblioteca de Input e usando uma biblioteca lógica bem desenhada, ou uma biblioteca lógica modificada.
example gameloop designs:
manter esta parte o mais simples possível no início. por isso o laço na maioria das vezes só chama funções e possivelmente (inteligente de fazer)um bool que pode ser usado para fechá-lo sem usar funções de forçar sua linguagem de programação pode ter.
um motor de jogo mais complexo em geral tem partes extras como física, colisão, destruição, ai, etc. você também deve tentar fazer coisas o mais multithreaded possível se você puder fazer isso com segurança. por exemplo, você pode fazer o gamengine tentar usar um gpu para renderizar e até mesmo fazer as partes de renderização da cpu em um thread diferente se você tiver lógica pesada ou física / sistemas de destruição. você pode usar o ai para prever o que vai acontecer e renderizar frames mesmo quando a cpu não consegue acompanhar. Também coisas como ai(criaturas, etc.) , a e física base partículas ou efeitos devem ser tão multithreaded quanto possível, uma vez que aqueles em geral estão entre os mais intensivos da cpu. e em muitos jogos eles tendem a diminuir a velocidade do jogo. se por exemplo minecraft, que é um bom exemplo, uma vez que é um motor bastante primitivo criado como descrito acima, também não suporta originalmente multi threading. este jogo tem limites de entidade construídos e em geral recebe muito do seu atraso da entidade. também devido à geração do mundo, mas isso é apenas quando se gera. minecrafts GUI e world renderer são na verdade escritos muito melhor para esse jogo do que a maioria dos renderizadores. é por isso que ele parece muito melhor do que a maioria dos remakes (em motores de jogo normais) e é em geral sempre limitado pela performance singlecore da cpu, por isso mesmo uma gpu de 12 anos é capaz de acompanhar os frames. isto também é por causa de algumas coisas algorythmic que funcionam como uma previsão que prevê o que se pode ver.
para tornar a engine mais autónoma, também se pode adicionar manuseamento de ficheiros, desta forma pode, por exemplo, fazê-lo ler um ficheiro principal que pode ser qualquer coisa que será aberta usando a engine. este ficheiro mostra todos os outros ficheiros e recursos que dizem à engine o que fazer e como deve ser, etc. isto também pode permitir que você use uma única cópia compartilhada da engine para economizar espaço em disco. isto também pode ser estendido para ter certas shader's e bibliotecas de textura compartilhadas. opções para salvar e carregar também são ótimas para adicionar. e como passo final você também pode fazer um editor para criar jogos para sua engine sem codificá-los você mesmo na engine ou usar arquivos.
A poucos anos atrás eu fiz minha própria engine também para no linux. embora ele pudesse ser compilado para outras plataformas principalmente (exceto para algumas partes da entrada e da saída desde que as funções específicas do linux foram usadas. este motor podia fazer todos os stuf básicos incluindo algumas coisas extras e multi threading ofcource. no entanto parece que eu apaguei meus arquivos incluindo os diagramas etc. ou movi para algum lugar que eu não conheço. então eu usei alguns exemplos da internet. as imagens mostradas não são meu trabalho, mas elas ainda devem conter o link de onde eu as obtive.
em geral uma engine de jogos mais complexa tem apenas aquelas funções básicas mais desenvolvidas ou mais adicionadas. se você quiser ver como uma engine de jogos complexa/avançada funciona, e você conhece muitas linguagens de programação bastante bem (muitas engines são escritas em várias linguagens) você pode olhar para a engine de jogos GODOT Motor de jogos 2D e 3D de código aberto
godotengine.org
godotengine/godot
github.com/godotengine/godotengine/godot
esta é uma engine de jogo completa e de código aberto, que não só é muito mais leve do que as engine de jogo de código aberto, mas também é muito mais leve do que as engine de jogo de código aberto.
Artigos semelhantes
- Quais são as diferenças entre o Unity Engine e o Unreal Engine?
- Como codificar xadrez e construir uma engine de xadrez em Python
- Como fazer um jogo de ritmo? Qual é a melhor engine, linguagem de programação, ou framework para usar
- Existem alguns tutoriais para construir um jogo como o Temple Run usando o motor de jogo Unity3D, ou qualquer outro motor de jogo?