Portage d'un jeu au iPhone
Bientôt, un portage de Tumiki Fighters, un jeu de Kenta Cho originalement pour Windows, apparaîtra sur le App Store. C’est un « shoot’em-up » à défilement horizontal où vous détruisez les vaisseaux ennemis fait de petit blocs colorés avec votre propre engin fait de ces même blocs. Pourquoi est-ce que j’en parle ? J’ai fait le portage. (Mise à jour : maintenant sur le App Store.)
J’ai été contacté en mai par un certain Jeremy qui voulais amener Tumiki Fighters sur le iPhone et le vendre sur le App Store. J’ai dû paraître la bonne personne pour ça vu que j’ai déjà beaucoup travaillé en D (le jeu est écrit dans le language de programmation D) et avec Mac OS X. Il y avait aussi des choses avec lesquelles j’étais moins familier mais dont j’étais très intéressé à apprendre (ou du moins à expérimenter), tel que :
- Le développement de jeux
- Le développement pour iPhone OS
- OpenGL
Pour moi, c’était un projet très intéressant parce que je n’ai jamais travaillé sur un jeu avant (du moins pas depuis ces petits jeux que j’ai fait pour un 486 il y a longtemps), et je n’ai jamais touché à OpenGL.
Le premier problème était de réussir à compiler le jeu pour le iPhone : il n’y a pas de compilateur et runtime D pour ARM en ce moment, et bien que j’aurai pu travailler pour mener ça à terme, j’ai décidé que j’avais déjà assez d’inconnus dans le projet et qu’il serait plus sage de simplement porter le jeu en C++, ce qui c’est avéré pas trop difficile (la plus grande difficulté étant de traquer les liens de possessions des objets pour palier à l’absence du garbage collector du D).
Ensuite, après avoir converti le jeu du D au C++, il restait à le porter sur la plateforme du iPhone. Tumiki Fighters dépend de SDL pour accéder à l’écran et aux contrôles (clavier, manette), SDL_mixer pour l’audio, et OpenGL pour les graphiques. Le iPhone n’a qu’une version réduite de OpenGL appelé OpenGL ES. OpenGL ES ne fonctionne qu’avec des coordonnées triangulaires (j’ai du convertir des tats de dessins basés sur des « quads » en triangles) et ne supporte pas les formes précompilées (« display lists »). J’ai donc du réimplémenter les graphiques à l’intérieur de ces contraintes.
Se débarrasser de SDL n’était pas si difficile : j’ai basé le contexte OpenGL sur l’exemple EAGLView d’Apple, et puisque j’avais à refaire les contrôles de toute façon (pour utiliser l’accéléromètre et des boutons à l’écran) c’était plus facile de remplacer SDL complètement.
Reste le son : après plusieurs tentatives à tout faire marcher correctement, j’ai fini par créer mon propre moteur audio basé sur OpenAL (pour les effets sonores) et AVAudioPlayer (pour la musique). Faire marcher l’audio correctement sur le iPhone s’est avéré la partie la plus pénible de la création du jeu pour iPhone : il faut faire attention à la musique de fond du iPod (que l’utilisateur peut démarrer à n’importe quel moment en double-cliquant sur le bouton Accueil, et AVAudioPlayer a la mauvaise manie de bloquer le thread appelant pour une demi seconde lorsqu’on charge une nouvelle musique. C’est pour régler ces problèmes et quelques autres que j’ai créé ma propre interface audio, et je vais vais bientôt le rendre disponible aux autres développeurs (en espérant aider quelqu’un).
Je suis pas mal satisfait du résultat final — mon client, Jeremy, est vraiment ravi de voir le jeu enfin arriver ! J’espère que vous l’aimerez aussi ; Tumiki Fighters sera bientôt maintenant disponible sur le App Store au cas où vous voudriez en faire l’essai.