Desenvolvimento de plataforma cruzada C ++ / OpenGL ES (iOS / Android) [fechado]

10

Eu já tenho uma experiência razoável com C ++ e OpenGL, e recentemente decidi experimentar o desenvolvimento de jogos para dispositivos móveis. Depois de criar com sucesso um aplicativo simples OpenGL ES Android usando Java, pesquisei maneiras de segmentar o Android e o iOS com o menor código possível de reescrita. Tentei usar as ferramentas de desenvolvimento de aplicativos multiplataforma do Visual Studio 2015, mas achei que eram muito novas e, portanto, extremamente sub-documentadas. Eu poderia criar os projetos de modelo que o programa me deu, mas não consegui descobrir como, dados esses modelos, eu poderia adicionar ativos ao jogo ou lidar com as entradas na tela de toque.

Infelizmente, tenho um desejo específico, muito específico para ser encontrado no Google. Quero criar um jogo OpenGL ES usando C ++, com invólucros específicos da plataforma fina para Android e iOS. As pessoas fizeram perguntas semelhantes a mim (embora não exatamente a mesma), e mais de uma pessoa que respondeu afirmou que o que eu quero fazer não é apenas possível, mas relativamente fácil, pois não preciso me preocupar com a interface do usuário.

Eu tentei este tutorial , mas ele tem quase três anos e, portanto, provavelmente foi projetado para tecnologia mais antiga, e, como resultado, encontrei vários bugs não contabilizados. No momento, porém, esse tutorial é a coisa mais próxima do que eu quero que encontrei. Todo o resto é apenas para Android ou recomenda que eu pague centenas de dólares por ano para usar o SDK da Marmalade. Às vezes, sinto vontade de escrever o código duas vezes, uma vez em Java e outra em Objective-C, mas sou motivado pelo conhecimento de que essa solução é possível, mas, por alguma razão, não é abordada em nenhum lugar em nenhum detalhe moderno.

Para resumir, quero criar um jogo OpenGL ES para iOS e Android, com uma única base de código C ++ envolvida em pequenas quantidades de código específico da plataforma. No entanto, apesar do fato de várias pessoas terem recomendado essa abordagem, ninguém pode me dizer como fazê-lo. Alguém pode me dizer se é realmente possível e, se sim, o que posso fazer ou para onde posso aprender como?

Craig Horwood
fonte
tente cocos2d-x , ou unity3d
Ali1S232
1
O unity3d está longe do que o OP está pedindo, pois você não tem acesso à fonte. Eu usei o cocos2d-x e os problemas de compilação ainda estão lá em algum grau. A influência do Objective-C também é sentida, alguns podem gostar disso, mas para mim isso é um desligamento. É uma solução de código aberto, no entanto, talvez valha a pena investigar o OP.
Matthew Sanders

Respostas:

6

Você pode encontrar aqui a minha resposta para uma pergunta semelhante aqui .

Você também pode achar útil procurar no código fonte de outras soluções. O Godot Engine, por exemplo, é um mecanismo de jogo de código aberto de plataforma cruzada, para que você nunca precise pagar nada.

Como mencionei na minha outra resposta, você não precisa (e provavelmente não pode) confiar em um IDE para fazer o trabalho por você. O CMake , Scons e muitas outras ferramentas de compilação podem ajudar no processo de compilação / compilação cruzada entre plataformas e IDEs.

O Godot Engine , por exemplo, usa Scons e o projeto LLVM (também conhecido como estrutura do compilador usada pelo clang do compilador C / C ++ / Objective-C) usa CMake .

Uma abordagem popular para jogos é criar um mecanismo em C / C ++ e, como você mencionou, abstrair as especificidades da plataforma. Quando se trata de iOS e Android, essa é a lógica de gerenciamento do ciclo de vida que faz interface com o sistema operacional. Se você quiser ir além e utilizar o Emscripten para compilar o asm.js e obter velocidade quase nativa no navegador, você está fazendo algo semelhante ao abstrair o loop principal por trás do valor que as chamadas requestAnimationFrame .

A Emscripten recomenda o uso do SDL para facilitar o processo de portabilidade, pois pode ajudar a abstrair as especificidades da plataforma, mas não há nada que o impeça de fazer isso você mesmo (outras cargas de pesquisa, depuração etc.).

Se você é realmente muito louco, pode fazer o que estou fazendo e escrever sua própria linguagem, utilizando o poder do LLVM para compilar na C ABI nativa ou mesmo no JIT em plataformas suportadas.

A questão é que sim, é realmente possível, mas algumas estradas são mais complicadas / demoradas que outras.

Nota: Você provavelmente precisará usar o Mac OSX por meio de um Mac, VM ou Hackintosh com XCode para compilar no iOS. Essa é uma das muitas razões pelas quais considero um Macbook Pro um ótimo candidato para um sistema de desenvolvimento.

Nota 2: Vale ressaltar que muitos mecanismos de plataforma cruzada hoje utilizam linguagens de script para lógica específica de jogo. O Unity nem permite que você se aproxime do código-fonte, por exemplo (embora você possa escrever plugins nativos). Isso pode ajudar a acelerar os ciclos de desenvolvimento, além de manter a portabilidade mínima, já que as linguagens de script são bastante independentes de plataforma (especialmente linguagens interpretadas em execução em uma VM). O objetivo do meu idioma é permitir o JIT (principalmente para economia de tempo de desenvolvimento) e a compilação estática.

Nota 3: Se você ainda não descobriu isso. Se você não utilizar SDL ou alguma outra solução que abstraia detalhes específicos da plataforma, será necessário utilizar os recursos de interface C / C ++ específicos de cada plataforma. Com o iOS, isso é bastante simples no XCode, já que o compilador (como mencionado acima) já suporta C / C ++. Com o Android, você precisa utilizar aschamadas NDK e marshall entre Java e C / C ++.

Matthew Sanders
fonte
1
Eu olhei para o código fonte do Godot Engine. Parece um pouco excessivo; Prefiro criar o meu próprio sem os recursos de que não preciso. Não tenho muita certeza de como fazer isso. Ainda não consegui executar nenhum código C ++ no Android.
Craig Horwood
hehe ... ya NDK não é um piquenique. Sinceramente, acho que qualquer coisa do google precisa de ajuda na categoria de desenvolvedor. Está usando o SDL fora dos limites para você? Tenho muito mais informações com as quais posso atualizar a resposta, se necessário.
Matthew Sanders
SDL não está fora dos limites, mas eu prefiro não ir lá. Mais uma vez, sempre há aquele pouco de conhecimento que poderia ter sido feito sem uma estrutura.
Craig Horwood
Sou constantemente mordido por esse bug, então sei como você se sente. Eu usei o NDK no passado e não acho que muita coisa tenha mudado no modo de configuração e compilação. Espero que a depuração tenha melhorado, pois você tinha que usar o GDB diretamente no passado via terminal e o IDE não tinha suporte para isso, mas parece que eles começaram a adicionar o suporte NDK ao android studio . Você já tentou o exemplo hellojni ?
Matthew Sanders
NDK é uma das coisas mais repugnante na existência, você pode encontrar bgfx útil como uma referência github.com/bkaradzic/bgfx , não é tão fino quanto você pode gostar porém, ele tem vários backends de renderização
JBeurer