Ya tengo una experiencia razonable con C ++ y OpenGL, y recientemente decidí probar el desarrollo de juegos móviles. Después de crear con éxito una aplicación simple de Android OpenGL ES usando Java, investigué formas de apuntar tanto a Android como a iOS con el menor código de reescritura posible. Intenté usar las orgullosas herramientas de desarrollo de aplicaciones multiplataforma de Visual Studio 2015, pero encontré que eran demasiado nuevas y, por lo tanto, extremadamente poco documentadas. Podría construir los proyectos de plantilla que me dio el programa, pero no pude entender cómo, dadas estas plantillas, podría agregar activos al juego o manejar la entrada de la pantalla táctil.
Por desgracia, tengo un deseo específico, demasiado específico para encontrarlo en Google. Quiero hacer un juego OpenGL ES usando C ++, con envoltorios delgados específicos de plataforma para Android e iOS. La gente me ha hecho preguntas similares (aunque no exactamente lo mismo), y más de una persona que respondió ha declarado que lo que quiero hacer no solo es posible, sino relativamente fácil, ya que no tengo que preocuparme por la IU.
Intenté este tutorial , pero tiene casi tres años y, por lo tanto, probablemente esté diseñado para tecnología más antigua, y como resultado me encontré con varios errores no explicados. Sin embargo, a partir de ahora, ese tutorial es lo más parecido a lo que quiero que haya encontrado. Todo lo demás es solo para Android o recomienda que pague cientos de dólares al año para usar el SDK de Marmalade. A veces tengo ganas de escribir el código dos veces, una en Java y otra en Objective-C, pero estoy motivado por el conocimiento de que esta solución es posible, pero por alguna razón, no está cubierta en ningún detalle moderno.
Para resumir, quiero hacer un juego OpenGL ES para iOS y Android, con una única base de código C ++ envuelta en pequeñas cantidades de código específico de la plataforma. Sin embargo, a pesar del hecho de que varias personas han recomendado este enfoque, nadie puede decirme cómo hacerlo. ¿Alguien puede decirme si es realmente posible, y si es así, qué puedo hacer o dónde puedo ir para aprender cómo?
Respuestas:
Puede encontrar mi respuesta a una pregunta similar aquí para ser útil.
También puede resultarle útil consultar el código fuente de otras soluciones. El motor de Godot , por ejemplo, es un motor de juego de código abierto multiplataforma por lo que no será necesario nada de pago.
Como mencioné en mi otra respuesta , no necesita (y probablemente no puede) confiar en un IDE para hacer el trabajo por usted. CMake , Scons y muchas otras herramientas de compilación pueden ayudar con el proceso de compilación / compilación cruzada en plataformas e IDE.
Godot Engine , por ejemplo, usa Scons y el proyecto LLVM (también conocido como el marco del compilador utilizado por clang, el compilador C / C ++ / Objective-C) usa CMake .
Un enfoque popular para los juegos es construir un motor en C / C ++ y, como mencionas, abstraer los detalles de la plataforma. Cuando se trata de iOS y Android, esta es la lógica de gestión del ciclo de vida que interactúa con el sistema operativo. Si desea hacer un esfuerzo adicional y utilizar Emscripten para compilar también a asm.js y darse cuenta de la velocidad casi nativa en el navegador, está haciendo algo similar al abstraer el bucle principal detrás de lo que equivale a solicitar llamadas AnimationFrame .
Emscripten recomienda el uso de SDL para facilitar el proceso de portabilidad, ya que puede ayudar a manejar la abstracción de los detalles específicos de la plataforma, pero no hay nada que le impida hacerlo usted mismo (aparte de un montón de investigación, depuración, etc.).
Si está realmente loco, puede hacer lo que estoy haciendo y escribir su propio lenguaje utilizando el poder de LLVM para compilar en C ABI nativo o incluso JIT en plataformas compatibles.
El punto es que sí, de hecho es posible, pero algunas carreteras son más complicadas / requieren más tiempo que otras.
Nota: Es probable que necesite usar Mac OSX a través de una Mac, VM o Hackintosh con XCode para compilar en iOS. Esta es una de las muchas razones por las que considero que un Macbook Pro es un gran candidato para un sistema de desarrollo.
Nota 2: Vale la pena mencionar que muchos motores multiplataforma de hoy en día utilizan lenguajes de secuencias de comandos para la lógica específica del juego. Unity ni siquiera le permite acercarse a su código fuente, por ejemplo (aunque puede escribir complementos nativos). Esto puede ayudar a acelerar los ciclos de desarrollo, así como a mantener el puerto al mínimo, ya que los lenguajes de secuencias de comandos son bastante independientes de la plataforma (especialmente los lenguajes interpretados que se ejecutan en una VM). El objetivo de mi lenguaje es permitir JIT (principalmente para ahorrar tiempo de desarrollo) y compilación estática.
Nota 3: Si aún no lo ha descubierto. Si no utiliza SDL o alguna otra solución que resuma los detalles específicos de la plataforma, deberá utilizar las funciones de interfaz C / C ++ específicas de cada plataforma. Con iOS, esto es bastante simple en XCode ya que el compilador (clang como se mencionó anteriormente) ya admite C / C ++. Con Android, debe utilizar lasllamadas NDK y Marshall entre Java y C / C ++.
fuente