PDA

Ver la versión completa : [Programación] ¿Alguien ha programado para iphone de forma no oficial?



efegea
13/12/2008, 18:16
Voy a usar mi iphone como plataforma para testear el motor de mi juego para Wiz, al ser parecidos (OpenGL ES 1.1, ambos son dispositivos embebidos..etc)

Pero obviamente no voy a pagar para hacerme desarrollador oficial, ya que ni siquiera voy a sacar una aplicación en la App Store.

¿Alguién de por aquí ha programado para iphones jailbreakeados? ¿Se usa el SDK oficial? ¿Tenéis algún enlace? No encuentro nada, sólo encuentro para programar de forma oficial. ¿Se puede programar en linux o es imprescindible Mac OS X? Tendría que redimensionar particiones o encontrar algún adaptador para poder enchufar dos discos duros internos con el mismo cable de corriente (no me quedan suficientes conectores de alimentación para los discos duros internos desde que instalé la gráfica nueva :( antes tenía un disco duro con mac os x pero tuve que usar la alimentación para la gráfica..)

< - >
Me respondo a mí mismo: he encontrado el iphone-dev, que es un entorno de programación no oficial: http://code.google.com/p/iphone-dev/wiki/Building

Aun así necesito ayuda, tutoriales, manuales, etc..sobre aplicaciones jailbreak

< - >
Wow, esta forma parece más sencilla: instalar las herramientas de desarrollo en el propio iphone, será más lento, pero más cómodo: http://soi.kd6.us/2008/09/27/so-i-made-my-iphone-say-hello-world/

Locke
14/12/2008, 17:15
Para usar el SDk oficial hay que pagar? Yo pensaba que solo tenias que pagar para publicar en la AppStore...

efegea
14/12/2008, 17:37
Sí sólo para la AppStore, el SDK oficial lo puedes descargar gratuitamente...

< - >
Ah, al final desistí. Tendría que mezclar Objective-C con mi código C++ y aunque se puede compilar fácilmente, hay cosas que no sé como por ejemplo ¿necesito la función main que sea en objetive-c? Y no sé, mucho lío esto de mezclar lenguajes, con lo fácil que sería que Apple usase C++ como dios manda. Otra de las manías de Jobs, cómo le gusta salirse del tiesto, cagüento!!

Jedive
14/12/2008, 22:21
Aunque hoy en día elegir C++ puede resultar la opción obvia, e irse por otro camino sea "salirse del tiesto", esto no era así en 1985, cuando se fundó NeXT y comenzaron el desarrollo de su sistema operativo NeXTSTEP (NeXT la fundó Steve Jobs después de irse de Apple, despues Apple compró NeXT, Jobs volvió, y NeXTSTEP se convirtió en Mac OS X). Entonces C++ era un lenguaje muy nuevo y apenas extendido, no se daba por hecho que si ibas a usar un lenguaje orientado a objetos fuera a ser ese, así que Jobs y compañía miraron las opciones, y escogieron Objective-C por sus similitudes con un lenguaje que admiraban, Smalltalk. Objective-C les daba además dos características que buscaban: es un lenguaje dinámico y reflexivo. C++ no cumple estas condiciones, así que parece obvio que dentro de lo que ellos querían, C++ no cumplía las expectativas.

Con respecto a tu pregunta: la función main no es de Objective-C, sino de C (si el fichero lleva extensión .m), o de C++ (si el fichero lleva extensión .mm). No se puede hacer una clase a medias en C++ y a medias en Objective-C, pero puedes tener clases en C++ y otras en Objective-C, y usarlas en una misma función, por ejemplo.

Y la función main normalmente se limitará a crear el NSAutoReleasePool y a llamar a UIApplicationMain, que instanciará la clase principal de tu aplicación y arrancará el programa. La clase que implemente el protocolo UIApplicationMainDelegate (es el que implementa los métodos necesarios en la clase) tiene que ser en Objective-C, pero tu después dentro de la clase llamas al código C++ que quieras.

Yo de todas formas, los programas del iPhone los hago en Objective-C, sin C++ para nada. A mí este lenguaje me encanta.

efegea
14/12/2008, 22:55
Impresionante explicación, muchas gracias :rever:

El código que yo quiero escribir consiste en un ejecutable en C++ (el juego en sí), enlazado dinámica o estáticamente (según la plataforma) con el motor, éste motor carga en forma de plugins, dinámicamente (también según la plataforma, si ésta no permite plugins, pues el código está compilado dentro la librería) los distintos drivers: opengl, sonido, entrada de usuario, etc..

Por ejemplo, supongo que el iphone soporta tanto plugins como librerías de enlace dinámico en tiempo de compilación (de enlazado), así que sería algo así:

Juego (ejecutable) -> motor (librería dinámica, en tiempo de enlazado) -> drivers (plugins, cargados en tiempo de ejecución)

Está todo diseñado para que se ejecute en varias plataformas muy diferentes las unas de las otras.

¿Se entiende ahora mi confusión a la hora de mezclar Obj-C con C++? Para mantener la multiplataformeidad, tanto el ejecutable, como el motor debe contener el mismo código, y son los plugins los que contienen código especifico para cada plataforma. ¿Puedo hacer eso, que un plugin cargue el sistema gráfico opengl y tal, otro cargue el sistema de entrada, es decir la pantalla multitáctil..etc? ¿Se puede hacer todo eso en C++ o el acceso a las librerías del sistema debe ser Obj-C? ¿Los archivos de cabecera del SDK son exclusivos de Obj-C o también sirven para C++? Es que aún no me queda claro si puedo acceder a las funciones opengl, por ejemplo, desde un archivo C++.

¿conoces algún documento sobre el tema?

Jedive
14/12/2008, 23:39
Documentos tienes en la ayuda que se instala con el SDK a cascoporro :) (mira la sección Guides). Lo mejor para aprender es leerte la referencia de Objective-C que han preparado, que es muy completita, y después echarte un ojo a los ejemplos. Te pongo link a la referencia de Obj-C directamente:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html

Necesitas logearte con el usuario y clave que tienes que crear para bajar el SDK.

Para usar código de C++ junto al de Objective-C no hay mucho misterio:



void mifuncion()
{
// Esta es un hipotetica clase de Objective-C
ObjCSprite* miSpriteDeObjC = [[ObjCSprite alloc] initWithImage:@"imagen.png"];

// Esta es una hipotetica clase de C++
CppSprite* miSpriteDeCpp = new Sprite("imagen.png");

// Dibujamos el sprite de Objective-C
[miSpriteDeObjC drawAtX:16 y:32];

// Dibujamos el sprite de C++
miSpriteDeCpp->draw(16, 32);

// Borramos los objetos
[miSpriteDeObjC release];
delete miSpriteDeCpp;
}


En principio las librerías del iPhone vienen todas compiladas como librerías dinámicas (si conoces ya las bases de Mac OS X, en realidad vienen como Frameworks). Debería ser posible compilar librerías .dylib o frameworks desde el xCode, pero viene sin plantillas de proyecto para ello, así que deberías partir de uno en blanco y configurarlo a mano.

kounch
14/12/2008, 23:44
...éste motor carga en forma de plugins, dinámicamente (también según la plataforma, si ésta no permite plugins, pues el código está compilado dentro la librería) los distintos drivers: opengl, sonido, entrada de usuario, etc..

Por ejemplo, supongo que el iphone soporta tanto plugins como librerías de enlace dinámico en tiempo de compilación (de enlazado), así que sería algo así...Hola
si utilizas el SDK oficial, la parte de plug-ins no podrás usarla; copio y pego del acuerdo de uso que aceptas al usar el SDK:


3.3.2 An Application may not itself install or launch other executable code by any
means, including without limitation through the use of a plug-in architecture, calling other
frameworks, other APIs or otherwise. No interpreted code may be downloaded and used in
an Application except for code that is interpreted and run by Apple's Published APIs and builtin
interpreter(s).
Hace meses que no toco nada del SDK, pero creo recordar que, por ejemplo, para el uso de OpenGL tienes que usar una vista especial (surface), de manera que el código puedes hacerlo multiplataforma, pero luego tienes que hacer una forma especial de instanciarlo para el caso de llamarlo desde Objective C. Posiblemente un buen ejemplo lo acabe siendo el código de Cube (http://fernlightning.com/doku.php?id=iphone:cube:start) cuando lo publiquen. Mientras tanto, igual algún ejemplo oficial como este:

http://developer.apple.com/iphone/library/samplecode/GLSprite/index.html

te podría ayudar.

Un saludo
kounch