Write once, run anywhere qu'il disait

Ces derniers jours, j’ai travaillé sur le packaging de Newton Adventure et ce n’est pas de tout repos!

Voici un résumé de mes recherches sur le sujet.

Du simple zip…

Jusqu’ici je distribuais une simple archive au format zip contenant l’exécutable java du projet, cad un fichier jar, ainsi que les bibliothèques dont il dépend: certaines sont aussi écrites en java, ce sont donc aussi des jars, d’autres sont des bibliothèques natives destinées à accéder au matériel graphique via OpenGL ou sonore via OpenAL.

La production d’un jar exécutable est difficile, mais pas insurmontable: il faut indiquer à Java où sont les bibliothèques. Pour les jars, il faut jouer avec maven, le
programme utilisé pour compiler le projet, tandis que du code spécifique
doit être écrit pour trouver les bibliothèques natives.

Toutefois ce mode de distribution pose plusieurs problèmes:

  • beaucoup d’utilisateurs ne savent pas décompresser une archive.
  • aucun raccourci dans le menu de l’environnement de bureau n’est créé automatiquement et avec certain (Unity par exemple), c’est très difficile de le faire à la main.
  • sur la plupart des PC, lorsque l’utilisateur double clique sur un jar, cela ouvre un gestionnaire d’archive au lieu d’exécuter le programme.

Sur ce dernier point, les environnements de bureau sont les grands coupables de ce comportement simple, mais stupide: combien d’utilisateurs veulent par défaut voir les entrailles d’un programme java plutôt que de l’exécuter? C’est aussi idiot que d’ouvrir par défaut les exécutables avec un éditeur hexadécimal.

Changer les associations de fichier étant souvent très compliqué, je distribue des batchs pour aider l’utilisateur à lancer le programme, mais là aussi les fichiers batchs s’ouvrent souvent avec un éditeur de texte sur la plupart des machines. Avec Windows, c’est le top: la commande java est souvent inaccessible, l’exécution d’un batch provoque parfois des popups d’alertes…

… au paquet d’installation

Pour simplifier la vie des utilisateurs, j’ai décidé de créer des paquets pour les différents OS.

Debian

J’ai commencé par debian, puisque l’OS que j’utilise est basé dessus. Les dépendances que j’utilise (lwjgl, phys2d, twl…) n’étant pas dans les paquets de cette distribution, j’ai fait un “gros deb”, cad en embarquant toutes mes dépendances. Généré via maven par l’excellent plugin jdeb, ce paquet pourra servir de base de travail à de vrais empaqueteurs debian. J’ai découvert à cette occasion que la création de deb est un art difficile et je comprends mieux le manque de paquets à jour le travail titanesque que font les contributeurs debian.

Les autres

Pour les autres OS, j’ai fait appel à izpack, un logiciel qui crée des installeurs clickodromes multiplateformes. Un peu difficile d’accès, mais disposant d’un plugin maven, il me permet de créer facilement des installations de qualité (sauf pour Macosx, où ce n’est pas aussi bien qu’un .app).

Ecrit en java, izpack génère un jar exécutable, il y a donc toujours le défaut des environnements de bureau décrit au début. Pour Windows, j’ai pu venir à bout de ce problème à l’aide d’un autre logiciel / plugin maven, launch4j qui transforme un jar en exe.

Et Java Web Start?

Java Web Start est une technologie qui permets en cliquant sur un lien d’installer ou mettre à jour automatiquement une application Java et de créer un raccourci sur toutes les plateformes où tourne Java. Génial en apparence, elle a de gros défauts: une fois encore, l’association entre l’extension (jnlp) et le programme javaws n’est pas effective sur beaucoup de PC et l’utilisation de bibliothèques natives provoquent l’affichage de popups d’alerte à faire fuir le plus intrépide des utilisateurs.

Conclusion

Le packaging d’applications multiplateformes, est une tâche complexe, mais indispensable pour toucher un large public. La charge est importante pour les développeurs de logiciel et c’est autant de temps perdu pour la correction de bug ou l’ajout de fonctionnalités.

J’espère qu’à l’avenir les environnements de bureau travailleront le support des programmes créés avec des outils de développement portables, car Java n’est pas le seul touché, afin de faciliter la vie des utilisateurs et des développeurs.

Newton Adventure 1.6: dernière version corrective avant la refonte graphique

Cette version de Newton Adventure, un jeu libre de plateforme 2d où le joueur peut faire tourner les décors, corrige quelques bugs génants et sera probablement la dernière avant la refonte graphique.

Voici les principaux changements:

  • évite au menu principal d’être très très lent sur cette configuration.
  • un panneau dans chaque premier niveau de chaque quête permet d’afficher l’aide.
  • évite à Newton d’être coincé dans un mur par un tir de canon.
  • affichage du score récolté avec diverses actions dans le jeu.
  • corrige la détection de collision avec les pièges mobiles.

Le jeu et ses sources sont téléchargeables sur le site du projet.

Le futur

La prochaine version arrivera sûrement dans un bon bout de temps, refondre tous les graphismes va être un gros travail! Ci dessous un extrait des premiers essais fait par Feust:

refonte

Le portage android

Après mes premiers essais sur le téléphone HTC Magic, j’ai mis en pause le portage android, car je ne pense pas pouvoir optimiser suffisamment Newton Adventure pour cette petite machine. Je le reprendrais si je mets la main sur un périphérique plus puissant ou si je trouve de l’aide pour optimiser le code.

Newton Adventure 1.3

La version 1.3 du jeu de plateforme libre Newton Adventure apporte des nouveautés qui le rende plus accessible:

  • Les manettes de jeu USB sont gérées et configurables dans le menu “Options”.
  • Dans les niveaux les plus grands, il est possible de collecter deux objets, une carte et une boussole, qui permette de débloquer la vue d’une mini-carte très utile pour se repérer.
  • Une nouvelle quête composée de 5 niveaux, hades, est disponible et propose de nouveaux éléments de jeu tels que les téléporteurs ou les serrures.
hades1 minimap hades2 hades3 hades4

Newton Adventure 1.2

Voici une nouvelle version de Newton Adventure, le jeu de plateforme 2D libre pour Linux, Windows ou Mac OS X qui vous permet de changer la gravité et faire tourner les niveaux à 360°

montage

Les nouveautés

Musiques

Grâce à , j’ai pu ajouter des musiques pour tous les niveaux et écrans du jeu.

Scores

A la fin de chaque quête, un score est attribué au joueur. Ce score peut être envoyé au serveur de score, soit en anonyme, soit avec un nom de joueur à configurer dans les options du jeu.

Le score est déterminé par le nombre pommes reçues ou perdues, les niveaux traversés, les ennemis tués et les pièces collectées.

Niveaux bonus

Pour ajouter une possibilité pour faire un highscore, j’ai ajouté un ensemble de niveaux bonus. Ceux-ci sont accessibles en collectant toutes les pommes d’un niveau et en trouvant un téléporteur. Dans les niveaux bonus, il n’est plus possible d’utiliser le changement de gravité, il faut donc utiliser des plateformes mouvantes ou rebondissantes pour collecter un maximum de pièce en moins d’une minute.

Jusqu’ici Newton Adventure n’était configurable qu’en éditant un fichier et en relançant le jeu. Un menu d’options est maintenant accessible depuis l’écran d’accueil.

Portage sur Android en cours

J’ai commencé un portage sur Android, il fonctionne peut être, mais ne possédant pas un téléphone de ce type, je n’ai pu le tester qu’avec l’émulateur fourni par Google. Malheureusement ce dernier est si lent qu’il est impossible de faire un développement OpenGL sérieux avec… N’hésitez à faire un don pour que je puisse m’en offrir un :-)

Newton Adventure 1.1

Newton Adventure est un jeu de plateforme 2D où le joueur dirige Newton, un héro très particulier puisqu’il a le pouvoir de modifier la direction de la gravité. Ainsi pour Newton les niveaux du jeu ne sont pas linéaires et peuvent être parcouru dans tous les sens. Les ennemis et les objets subissent aussi les effets de la gravité ce qui permet de les atteindre ou de les éviter en les faisant tomber dans la bonne direction.

Téléchargement

Vous pouvez jouer au jeu ici.

montage

Vidéos

dailymotion
youtube
wat.tv

Les nouveautés

Plus de contenu

Newton Adventure propose désormais 21 niveaux regroupés par quête:

  • Artic: un monde enneigé où les plateformes sont très glissantes.
  • Egypt: un univers désertique qui était déjà présent dans la version précédente.
  • Jungle: des niveaux plus verts relativement faciles pour bien débuter et comprendre les mécanismes du jeu.
  • Vatican: on ne trouvera pas le Pape au milieu de ces ruines antiques, mais un ensemble de pièges et de mécanismes qui donnent du fil à retordre au joueur.

Dans tous ces niveaux, on croisera de nouveaux types de plateformes: rebondissantes, glissantes ou traversables.

Plus configurable

En éditant le fichier data/config.properties, on peut maintenant régler les touches de contrôle et certains paramètres d’affichage.

La technique

Newton Adventure est toujours écrit en Java avec les bibliothèques lwjgl pour l’affichage et phys2d pour la physique. Les niveaux sont éditables avec tiled et un plugin adapté. Les sources de Newton Adventure sont sous licence BSD tandis que les graphismes et les données du niveau relèvent de la Creative Commons BY-SA 3.0 ou de simple autorisation d’utilisation de leur auteur.

Remerciements

Un grand merci aux artistes d’Opengameart et à Nicosmos (qui a dessiné le menu principal) qui m’ont permis d’avoir des graphismes corrects pour ce jeu.

Chronokiwi sort en version d3b63be4cb

Mon projet Chronokiwi, le wiki spécialisé dans la saisie et la présentation d’évènements et de chronologies écrit avec Django sous licence BSD, évolue.

La dernière version était assez basique, mais aujourd’hui commence vraiment à prendre forme grâce aux nouveautés suivantes:

  • liens entre les pages des évènements et les chronologies via une extension de la syntaxe Markdown.
  • flux RSS.
  • export de chronologies sous forme d’un graphe (via Graphviz)
  • géolocalisation des évènements via GeoDjango et Openlayers.

La prochaine fonctionnalité importante que j’aimerais implémenter est une “timeline” visuelle intégrée avec une carte afin de pouvoir, par exemple, visualiser de façon interactive l’évolution d’une invasion.

J’aimerais aussi améliorer la partie cartographique, mais je suis assez limité par les versions de Django et GeoDjango proposées par ma distribution. Apparemment les développeurs Python modernes se font des “virtualenv” et des “pip” pour résoudre ce genre problème, mais je n’ai pas eu le temps d’explorer le sujet.

chronokiwi

Naissance du projet Chronokiwi

Voici mon dernier projet: Chronokiwi.

Afin d’apprendre à me servir du cadriciel Django, j’ai réalisé une idée que j’avais en tête depuis un moment: un wiki spécialisé dans la saisie et la présentation d’évènements et de chronologies.

Limité au strict minimum pour l’instant, j’y ajouterai des fonctionnalités petit à petit.

Une démo est disponible ici et le site du projet permet de télécharger les sources sous licence BSD.

Un nouveau jeu libre : Newton Adventure

La première démo jouable de Newton Adventure est sortie. Il s’agit d’un jeu de plates-formes 2D proche des classiques du genre en apparence, mais qui propose une nouveauté majeure : le personnage principal, Newton, a le pouvoir de modifier le sens de la gravité.

Cela permet de parcourir les niveaux dans tous les sens, d’atteindre des plates-formes inaccessibles, de faire tomber des objets ou des ennemis pour les atteindre, etc.

La démo

La démo qui propose un niveau très simple, pour montrer le concept, a été testée sous Linux, mais devrait aussi tourner sous Windows, Mac OS X et Solaris. Un greffon pour Tiled permet de créer de nouveaux niveaux.

Le développement

Techniquement, le jeu est écrit en Java avec les bibliothèques lwjgl pour l’affichage et phys2d pour la physique.

Les sources, fournies avec la démo, sont sous licence BSD tandis que les graphismes et les données du niveau relèvent de la Creative Commons BY-SA 3.0.

Le développeur

Je réalise Newton Adventure sur mon temps libre et les vacances de fin d’année m’ont permis de bien avancer. J’espère pouvoir sortir dans l’année une version complète qui sera aussi amusante à jouer qu’à créer.

Pour l’instant je vais prendre un peu de recul et attendre les retours sur la démo, car j’ai beaucoup d’idée pour la suite et il va falloir faire le tri :

  • Framework pour ajouter des ennemis avec une IA sous forme de greffons ;
  • Objets utilisant le moteur physique : trampolines, cordes, pendules, rochers géants à la Indiana Jones, vent… ;
  • Des plates-formes particulières : glissantes, mobiles, déplaçables… ;
  • Musiques et effets sonores ;
  • Thèmes graphiques (jungle, ville…).

Enfin, j’aimerais porter le jeu sur téléphone mobile, mais je ne sais vraiment pas comment faire techniquement.