Maki à la vapeur

Voici quelques nouvelles de mes projets libres. Au menu, nanimstudio, Newton Adventure, un nouveau jeu (Ned et les maki) et de nouveaux projets (libtiled-jaxb et lwjgl-nuit).

nanimstudio

Mon logiciel d’animation 2d continue à évoluer au fil de mes besoins et des retours des utilisateurs. Après le support de l’APNG et quelques améliorations de l’ergonomie, mon prochain grand chantier est l’ajout d’algorithme de scaling. Pour cela j’utilise la bibliothèque scilter. Le but est de pouvoir prévisualiser les sprites tels qu’ils pourraient être affichés en jeu via des shaders implémentant des techniques d’agrandissement dédiées au pixel art (scale2x, hqx, rotsprite…).

Site officiel
scilter

Newton Adventure

Mon projet le plus important continue sa carrière commerciale sur Greenlight. Il s’agit d’un système dédié aux jeux qui candidatent pour être vendu via la base de données sociale / plateforme de vente / adware / DRM / … préférée joueurs PC: Steam. Les clients peuvent voter pour dire s’ils seraient intéressés par l’achat d’un jeu candidat. A partir d’un certain nombre de vote et suivant des calculs et des critères internes à Valve, le jeu peut être accepté.

Si vous êtes du côté de Nice, je présente le jeu sur un stand au JM2L le mois prochain!

Site officiel
La page sur Greenlight
Le site des JM2L

Ned et les maki

Si vous suivez linuxfr régulièrement, vous avez peut être vu que les Geeky Goblin Productions ou GGP ont passé une annonce pour recruter des développeurs pour un projet de jeu. Je suis l’un d’eux!

La production a démarré sur les chapeaux de roue: on a déjà des graphismes, un petit moteur d’affichage, le gameplay est bien défini… J’espère même avoir une petite démo pour les JM2L!

Bien sûr comme dans tout projet libre, il a fallu faire des choix techniques et politiques difficiles. Heureusement l’équipe a l’esprit de compromis, ce qui nous a permis de faire rapidement les choix suivants:

Moteur de jeu

La solution retenue est basée sur Java, lwjgl et de gros bouts du code de Newton Adventure!

C++/SDL et Monogame ont été envisagé, mais le premier a dû être écarté pour des raisons de productivité et d’intérêt: j’ai fait valoir que les releases multiplateformes et la gestion des dépendances en C++ sont des tâches très consommatrices de temps et au niveau d’intérêt intellectuel proche de 0, ce qui est contraignant pour qui travaille sur son temps libre. Le second n’a pas été retenu à cause du rejet général de Mono par la communauté libre et de l’incertitude quant à son avenir après l’abandon de XNA par Microsoft (Monogame est une implémentation de XNA).

Licences

Le choix des licences a été compliqué. Les GGP voulaient du Art Libre et seulement du Art Libre. Je voulais que le code soit sous BSD (pour pouvoir échanger du code avec mes autres projets) tandis l’autre développeur préférait MIT. Ce sera finalement MIT pour le code et Art Libre pour les données. La licence MIT permettant le sublicencing, les GGP pourront ainsi distribuer le jeu entièrement sous Art Libre!

Outils pour le travail collaboratifs

git a été choisi pour partager les sources et gérer les versions. Là c’est plus une question de personne n’a jamais été viré pour avoir choisi git

En attendant une mise à niveau du serveur des GGP, nous utilisons une instance de gitlab et des dépôts sur github

Editeur de niveau

Le choix d’une vue en 3d isométrique nous a amené à choisir Tiled pour l’édition des niveaux. Là aussi c’est un choix par défaut, car il n’y a pas beaucoup d’alternatives sur ce “marché”.

Nouveaux projets

Je profite du développement de Ned et les maki pour y faire “incuber” deux nouveaux projets de bibliothèques Java:

  • libtiled-jaxb: un parseur moderne pour les fichiers de Tiled. Ceux qui existent ont le gros défaut de charger les images avec java.awt ou android.graphics, ce qui ralentit considérablement le chargement des niveaux puisque ces API stockent les bitmaps dans des formats qu’il faut convertir en texture OpenGL. Ma bibliothèque laisse le jeu faire le chargement lui même.
  • lwjgl-nuit: une bibliothèque pour créer des interfaces graphiques pour les jeux écrits avec lwjgl. Il en existe déjà plusieurs, mais aucune ne permets de contrôler l’interface uniquement avec une manette de jeu. Je joue souvent en utilisant mon PC comme une console, j’ai donc envie que mes jeux puissent être joués sans avoir à sortir un clavier et une souris.
nanim Ned et les maki Newton et Ned

Newton Adventure sur Steam Greenlight

Afin de toucher un plus grand nombre de joueur, j’ai mis Newton Adventure sur Greenlight avec l’aide de mon éditeur Stuffomatic.

Greenlight est une rubrique de la plateforme de distribution de contenue Steam, très populaire dans le monde du jeu vidéo. Cette rubrique permets aux joueurs de voter pour un jeu. A partir d’une certaine popularité, le jeu peut être accepté sur Steam.

La version sur Steam regroupera le jeu de base gratuit, les mods payants et une intégration de certaines fonctionnalités de Steam (les achèvement par exemple).

Si vous êtes intéressé, votez sur la page de Newton Adventure sur Greenlight.

Steam

Newton Adventure Mod Pack 1 est disponible!

Après une année de développement dans le plus grand secret, la première extension (DLC comme disent les djeuns) de Newton Adventure est enfin prête. Constituée de nouveaux niveaux, pièges et énigmes, elle regroupe deux mods: Deluxe et Retro.

Du nouveau contenu…

Deluxe

Le mod Deluxe est composé de trois nouvelles quêtes de six niveaux: Bridge, Lab et Prison.

Dans Bridge, Newton se retrouve sur un pont métallique dont la traversé se révèle vite être un challenge avec de nombreux téléporteurs et des passages bloqués par des caisses en bois. Le seul moyen de pouvoir passer est de les faire brûler, soit en déviant les tirs des canons qui jonchent les niveaux, soit en déclenchant l’explosion de bombes qui tombent et roulent un peu partout.

La quête Lab est à la fois la plus intéressante et la plus difficile de ce mod. Les niveaux sont des labyrinthes où pour sortir le jouer doit composer avec la gravité et les couleurs: des pièges, des barricades et des accès sont rouges, verts ou bleus, Newton ou la clef de la porte de sortie peuvent adopter l’une de ses couleurs à certains checkpoints. Etre de la même couleur qu’un élément du niveau permets d’y être invulnérable, de le faire disparaître ou de le traverser tandis qu’être d’une couleur différente le rends bloquant ou dangereux.

Dans la dernière quête, accessible seulement après terminé toutes les autres, fait se retrouver le pauvre Newton dans une prison futuriste gardée par une horde d’androïdes en armure de métal noir. Des accélérateurs sont disposés un peu partout pour garantir au prisonnier qui voudrait s’échapper un peu trop vite d’être projeté sur les lasers qui servent de barreaux à cette prison.

Outre ces nouveaux niveaux, le mod Deluxe donne accès à une vraie fin et aux niveaux bonus une fois le jeu terminé.

Retro

Le mod Retro est une extension plus modeste, mais qui change complètement l’aspect graphique et la façon de jouer: Newton est remplacé par un bonhomme de lumière, les pommes par des cœurs, les décors en pixel art par un style “néon” et l’objectif n’est plus de trouver une clef pour sortir du niveau. Il faut maintenant lutter contre la montre et collecter tous les euros d’un niveau en un temps très limité avec des pièges plus dangereux et un nombre de cœurs plus faible.

Commencé comme une expérience pour varier le gameplay, ce mod s’est révélé petit à petit plus hardcore et plus drôle à mon goût que le jeu original!

… à prix libre!

Afin de me faire une première expérience dans le monde sans pitié de la commercialisation de jeux indies, j’ai décidé que ces mods seraient payant. Pas bien cher, puisque c’est l’acheteur qui décide du prix en échange de ce pack de données sous licence CC-BY-SA.

Edité par Stuffomatic, c’est donc du jeu libre à prix libre, une formule déjà adoptée pour Andy’s Super Great Park, qui je l’espère connaîtra du succès dans le marché si privateur du jeu vidéo.

Newton Adventure 1.11

J’ai publié une nouvelle version de Newton Adventure, un jeu de plateforme 2D libre pour Linux, Windows ou Mac OS X.

Le but du jeu consiste à parcourir des niveaux en courant, sautant et faisant tourner la gravité. Pour passer au niveau suivant, il faut trouver une clef et l’amener à la porte de sortie en évitant les nombreux pièges et enemis.

Nouveautés

Les nouveautés de cette version sont:

  • une refonte du menu d’options avec un nouveau thème ;
  • l’utilisation d’une base de données de manettes de jeu pour les configurer automatiquement ;
  • le partage des scores via scoreserver est désormais inactif par défaut. Je ne pourrais plus calculer de statistiques pertinentes, mais c’est un choix plus logique pour le respect de la vie privée ;
  • le passage à la version 2.9.0 de la bibliothèque lwjgl, équivalent Java de SDL ou SFML utilisé par la plupart des jeux écrits dans ce langage comme le célèbre Minecraft ;
  • des optimisations qui permettent de rendre le jeu à peu près jouable sur un netbook atom avec GPU intel.

Debian

J’ai fait un effort particulier sur l’empaquetage pour debian : j’ai créé une branche spéciale afin que le paquet .deb ne dépende plus désormais que de bibliothèques et logiciels présents dans la distribution stable.

Cherche contributeurs sérieux

Outre les contributions les plus simples (traductions, rapports de bugs…), je cherche des développeurs Android/iOS/consoles pour réaliser des portages sur d’autres plateformes.

Screenshot

Histoire des jeux vidéo présente...

Voici une liste des jeux basés sur un principe plus ou moins proche de Newton Adventure trouvés notamment grâce à l’excellent Bottin des jeux linux:

Les jeux libres

Which Way Is Up

Un jeu de plateforme écran par écran, sans scrolling, où des leviers permettent de faire tourner l’écran courant à 90°.

Site officiel

Convergence

Convergence est un jeu HTML5, créé avec Construct, qui demande de diriger deux personnages, un homme et une femme, pour les faire se rejoindre à un point du niveau en évitant des obstacles. On ne peut pas sauter, mais shaque personnage dépends d’une gravité différente que l’on peut inverser. Très amusant, bien qu’un peu court, il est dommage que l’auteur ne mette plus ce jeu en avant sur son site.

Kaiten Patissier

Un jeu de plateforme avec des niveaux que l’on peut tourner à 90°. Je n’ai pas pu le tester, il ne semble plus y avoir de site officiel… J’ai juste trouvé cette page.

notpacman

Ce clone de pacman demande de diriger la vieille star du jeu vidéo comme un labyrinthe à bille.

Sane Method

Un jeu de plateforme avec inversion de gravité. Le développement semble abandonné…

Les jeux pwivateurs

Le jeu le plus proche de Newton Adventure à ma connaissance.

Site officiel

And Yet It Moves

Un jeu de plateformes où l’on fait tourner le décor par palier de 90°.

Site officiel

Koro Koro Post Nin

Un jeu Playstation où l’on fait tourner le décor pour faire distribuer des lettres à l’héroine.

Page mobygames

On the board

Nommé Cameltry au Japon, ce jeu de labyrinthe à bille est sorti sur Super Nintendo.

Page mobygames

Bob’s Bad Day

Ce jeu de labyrinthe à bille sorti sur Amiga.

Page mobygames

Sonic the Hedgehog

La mascotte de Sega a eu droit a des niveaux bonus qui tournent dans tous les sens dans sa première version Megadrive.

Page mobygames

Super Ghouls’N Ghost

Un grand classique de la Super Nintendo. Dans certain niveau, le décor tourne à 90°.

Page mobygames

Essai du système de mods de Newton Adventure

J’ai commencé à développer un système qui permets de créer des mods pour Newton Adventure en quelques étapes:

  • Copier les fichiers du sous dossier data/ dans ~/.config/mods/nomdumod
  • Les éditer avec gimp et l’éditeur de niveau
  • Lancer le jeu, aller dans les options et choisir le mod

Pour le mod de test, la mode étant au retro, j’ai fait un mod à la mode… retro!

retro

Grand nettoyage d'hiver

J’ai fait un gros nettoyage du code de Newton Adventure:

  • Il est maintenant plus facile pour les graphistes de contribuer.
  • Le portage android a été supprimé en attendant de trouver un développeur pour le faire renaître.
  • La version Java Web Start est abandonnée.

Plus facile la contribution

Le grand changement est une meilleure utilisation des fichiers: avant un fichier *.tmx contenait toutes les informations, images comprises, ce qui rendait pénible leur édition, car pour éditer une tuile, il fallait l’extraire via l’éditeur de niveau, l’éditer avec gimp (par exemple), puis la réintégrer via l’éditeur. Pour voir les changements en jeu, il fallait aussi systématiquement recompiler. Ce fonctionnement était nécessaire pour le portage android où on n’a pas accès à vrai système de fichier.

Maintenant le jeu stocke ses données dans un sous dossier data/ qui contient toutes les images au format png. On peut les éditer et lancer le jeu pour voir les changements directement.

J’ai fait l’essai avec ce bonhomme de neige dessiné par Julien Jorge:

snow

La fin du portage android

Il est toujours resté à l’état de prototype, je n’ai pas beaucoup de temps pour m’en occuper et il faudrait sans doute une réécriture plutôt qu’un portage pour s’adapter à ces petites machines. Je pense qu’il vaut mieux essayer de recruter un développeur motivé pour faire une vraie version mobile/tactile de Newton Adventure en reprenant juste les données et en faisant un code neuf avec son langage et ses apis préférés.

Java Web Start aux oubliettes

Java Web Start est une très bonne idée pour déployer des applications simplement, malheureusement ce n’est pas trop compatible avec l’utilisation de bibliothèques natives et de certificats SSL autosignés: l’utilisateur voit des messages d’avertissements trop dissuasifs…

Une tribune décentralisée est-elle possible?

J’ai récemment changé de système de chat pour mon site web pour une tribune. Avant j’utilisais le protocole XMPP avec comme serveur ejabberd et comme client muckl_tribune, une variante de muckl que j’ai modifié pour émuler l’ergonomie d’une tribune, mais la complexité de la solution et le manque de temps m’ont conduit à adopter l’une des meilleures tribunes du marché, celle de Drupal. J’en ai aussi profité pour migrer mon blog dotclear.

Ces migrations m’ont conduit à m’intéresser de plus près au monde des tribunes.

Qu’est-ce qu’une tribune?

Voici la meilleure définition que j’ai trouvée:

Une tribune (parfois appelée "shoutbox") est une application Web permettant à plusieurs utilisateurs de discuter : il s'agit d'un chat Web caractérisé par l'utilisation des standards HTTP et XML. Ainsi, afin de mettre en oeuvre un chat Web, une tribune expose une API HTTP permettant à plusieurs utilisateurs 1) de poster un message et 2) d'obtenir les derniers messages postés sous la forme d'un fichier XML appelé backend. [devmoules](http://halifirien.info/index.php?title=Tribune)

Les tribunes les plus célèbres sont dlfp et euromussels.

La centralisation

Contrairement à d’autres systèmes tels que XMPP ou Retroshare à l’heure actuelle les tribunes sont centralisées: elles sont toujours liées à un site web auquel il est parfois obligatoire de s’y inscrire. C’est donc du pur Minitel 2.0 avec tous les abus possibles que cela implique (atteintes à la vie privée, censure…).

tribune

Note: la partie serveur s’appelle bouchot ou simplement tribune et la partie cliente coincoin.

La décentralisation

Le principe

J’ai essayé d’imaginer ce que pourrait être un système de tribune décentralisée: ce qui m’a semblé le plus simple, c’est de considérer que chaque utilisateur aurait sa propre base de données contenant les messages. Régulièrement, les utilisateurs amis synchronisent leurs bases, important les messages des autres, exportant les leurs.

tribune

Le prototype

Définir et synchroniser des bases de données n’est pas une mince affaire, heureusement j’ai eu l’idée d’utiliser un système de bases synchronisées que je connais bien, puisque je m’en sers pour gérer mes projets: fossil, un logiciel basé sur sqlitequi combine gestionnaire de version, wiki et bugtracker.

Une fonctionnalité peu utilisée de fossil est la création d’évènement. J’ai “hacké” ce système pour m’en servir de stockage de messages et réduire mon prototype à deux scripts: un pour transformer la liste des évènements en backend xml, un autre pour recevoir un message et le transformer en évènement.

Testé avec mon coincoin préféré (onlinecoincoin), le prototype est une tribune tout à fait fonctionnelle. En clonant le dépôt, j’ai pu voir que l’on peut gérer plusieurs tribunes indépendantes et les faire se synchroniser par fossil.

Conclusion

La centralisation des tribunes n’est pas une fatalité, le prototype le montre, même s’il a ses limites: il se base sur un “hack” de fossil, l’authentification n’est pas gérée, les norloges sont forcément UTC… Mais peut être qu’un jour un développeur de talent reprendra cette idée et deviendra riche et célèbre avec!

Making off: un nouveau sprite pour Newton

Le jeu que je développe, Newton Adventure, utilisait jusqu’ici un sprite sans rapport avec le thème du jeu.

J’ai décidé de m’attaquer à la réalisation d’un personnage ressemblant à Newton à l’aide des logiciels libres suivant:

  • gimp pour le dessin et la retouche d’image.
  • nanim pour la création de l’animation.
  • imagemagick pour la création du gif animé visible à la fin du billet.

Voici la procédure que j’ai suivi.

Première étape, faire un dessin grossier au crayon:

sketch1

Deuxième étape, scanné et utiliser des filtres (Dessin au crayon, nettoyer…) pour avoir un contour net:

sketch2

Troisième étape, réduire la résolution et faire un coloriage rapide:

newton_64x64_color

Quatrième étape, réduire encore la résolution et faire essayer de faire juste ressortir les détails importants:

newton_32x32_montage

Pour cela il est indispensable de bien configurer gimp. J’ouvre deux vues sur la même image, l’une avec un zoom important, l’autre en taille réelle et qui n’affiche pas les sélections ou bords de cadre. Je mets aussi un calque d’une couleur que je n’utilise pas pour faire bien ressortir les contours.

Enfin, il faut recommencer pour toutes les positions clefs de l’animation:

newton_montage

Avec le sdk de nanim, la commande suivante permets de créer l’animation:

nanimenc -author devewton -license "CC-BY-SA 3.0" -d 100 -a stay -f newton_03.png -a walk -f newton_03.png -f newton_04.png -f newton_05.png -f newton_04.png -f newton_03.png -f newton_02.png -f newton_01.png -o hero.nanim

Pour obtenir le gif, il faut utiliser la commande convert d’imagemagick:

convert -delay 10 -dispose Background newton_03.png newton_03.png newton_04.png newton_05.png newton_04.png newton_03.png newton_02.png newton_01.png hero.gif

Et voilà le résultat:

hero

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.