Histoire d'avoir des souvenirs, je me suis amusé à prendre des
captures d'écran tout au long du développement du jeu.
Les voici, avec mes commentaires : vous en apprendrez ainsi un
peu plus sur le jeu.
Attention tout de même : il y a du spoiler avec la solution de
certains niveaux, et la fin du jeu ! Donc si vous comptez
jouez à Icosien, gardez ce lien sous le coude et revenez plus
tard !
Dernière chose, la page est assez lourde à charger –
soyez patients !
Icosien, c'est 1 526 lignes de code, 660 lignes de commentaires et 24 fichiers répartis dans trois packages.
Version α côté développeur
Une image à l'époque où je développais l'algorithme Eulris. Le
fond jaune flashy permet juste de définir une surface sur
laquelle on peut intercepter la souris !
Le tout premier niveau créé, pour tester la syntaxe d'encodage
des graphes et apprécier le rendu du fil sur une forme plus
géométrique qu'aléatoire.
On peut d'ailleurs noter que la détection de fin de niveau
n'est pas encore présente ; à l'époque je recompile à chaque
fois pour tester un nouveau niveau, afin de gagner du temps.
Cela évite de créer la banque de niveaux quand on ne sait pas
encore bien quels paramètres additionnels pourraient être
nécessaires dans les niveaux spéciaux.
Des esais sur la couleur et les clous.
Un niveau dans l'éditeur FlashDevelop.
Un autre niveau testé. À l'époque, au moment de sélectionner
la première accroche, tous les clous grossissaient pour
faciliter le clic. Cette option a disparu pour des clous plus
jolis !
Un niveau en cours de création.
Une erreur de code ; j'ai fait en sorte que la version finale
n'en comporte plus aucune (évidemment !).
Juste pour information, on me signale ici que j'essaie de
détruire un niveau à partir d'un évènement (sa disparition de
l'écran, removeChild()) alors que le destructeur est
prévu pour être appelé de façon indépendante.
Le Google Doc collaboratif sur lequel on retrouve toute
l'ébauche du jeu !
Version α côté designer
Tandis que je travaillais sur la version α, Licoti travaillait quant à lui sur des images et des textures applicables sur le jeu.
À terme, il m'a fort gentiment livré les images suivantes ; elles n'étaient bien entendu pas interactives et cherchait simplement à définir l'esthétique générale et la façon dont le jeu serait affiché. Du très bon boulot, comme d'habitude avec mes collaborateurs – que ce soit sur Omnilogie ou ailleurs !
Licoti qui se moque et fait semblant de dessiner aussi bien
que moi.
La première image que j'ai vu du jeu :) La planche a été
éclaircie pour la version finale.
La seconde planche. À l'origine, Licoti était parti pour se
passer sous silence. Quelle modestie :')
On note ici un niveau de jeu avec le texte d'aide élaboré sur
un document collaboratif (phrase sponsorisée par Google Docs).
Seul souci, l'image indique uniquement les traits par défaut,
pas la ficelle... ce qui nous jouera des tours plus tard,
puisqu'il faudra plus d'une semaine pour choisir le style
définitif de la corde.
Un autre test d'affichage de texte, non retenu (parce que je
suis une flemmasse).
Le même niveau, sans texte autour. Ainsi que les éternels
lauriers...
Des petits clous :)
L'image de fin. Elle est un peu anachronique ici, puisqu'elle
a été faite bien après toutes les autres mais bon...
Redde Caesari quae sunt Caesaris, et quae sunt Licoti
Licoto.
Version Alpha : le résultat
Un jeu jouable, sans graphisme et sans transition, sans début ni fin !
Création des ressources
Une fois nos deux versions alpha terminées, Licoti me fournit les textures indépendantes qu'il avait utilisé pour créer ses scènes.
Version β
L'image la plus facile à intégrer, c'était bien évidemment la
planche de fond. Encore fallait-il la faire défiler de façon
intéressante !
Viennent ensuite les clous. La première version intégrait
l'ombre directement sur la ressource, ce qui s'avéra peu
pratique (il est plus simple d'appliquer un filtre depuis le
code source sur tout le niveau pour créer une ombre similaire
partout).
Le fil prend un peu d'épaisseur, et on peut noter l'apparition
d'une ombre portée sous le fil.
Tadam ! Voilà la plante positionnée au premier plan ; elle
n'en bougera plus !
Au début du jeu, pour faciliter le débogage la souris était
considérée comme un clou toujours accroché. Ce qui était un
peu déstabilisant pour les joueurs !
Premier essai pour intégrer le splash screen sur le
niveau. Au début, je comptais charger dynamiquement les images
et afficher de la pub pendant le chargement. Finalement, j'ai
préféré tout inclure directement dans le fichier flash ; ce
qui permet d'assurer un jeu fonctionnel même si mon serveur ne
répond plus ou que l'on joue en local. En contrepartie, la
publicité initiale est moche. Mais bon... la suite est
largement assez jolie pour compenser, non ?
On se rend compte sur cette image que l'ombre choisie
initialement pour la corde rend mal sur les clous : elle est
trop éloignée pour être réaliste. Elle passe donc de 15 pixels
de distance à une valeur plus cohérente aux alentours de 5px.
Un niveau en cours de jeu. Et cette fois ça y est, le jeu est
fonctionnel et permet de passer d'un niveau à un autre (et
donc de détecter la victoire) !
Le dodécahédron en cours d'implémentation.
Un changement intéressant : les traits indiquant les arêtes
possibles perdent de leur dureté, et sont plus doux. L'effet
imite un dessin à la craie sur la planche (et effectivement,
c'est ça : j'applique un déplacement en fonction de l'état de
la planche en dessous).
Un niveau proof of concept. Allez savoir pourquoi, je
ne l'ai pas inclus dans la version finale ;)
Le McGee graph presque terminé. Afin de corser la difficulté,
j'ai modifié certaines arêtes du McGee Graph original. Il en
va de même pour d'autres niveaux, auxquels j'ajoute des arêtes
/ en supprime, ou modifie la disposition conventionnelle des
nœuds pour l'intérêt du jeu.
Le 60-Thomassen, que je construis par symétries successives
pour éviter les erreurs :)
Toujours le même. On peut noter des légères modifications dans
le positionnement des clous pour obtenir des formes plus
convexes, et donc plus faciles à accrocher pour le joueur.
On peut aussi voir qu'un clou a disparu, en bas à droite :
c'est normal, le 60-Thomassen est hypohamiltonien et donc
injouable en tant que tel. Au début, je voulais enlever le
clou "central en bas" pour obtenir une forme plus agréable,
mais cela aurait impliqué de recoder toutes les arêtes ; et
surtout un niveau beaucoup plus facile que cette disposition
complexes. Car en enlevant un noeud qui ne fait pas la
jonction entre deux zones, j'empêche la résolution du niveau
par analyse (décomposition en petites pièces). Ce qui a
tendance à tuer mes testeurs, qui s'acharnent à vouloir le
résoudre zone par zone sans succès. Pour être franc, je ne
pense pas qu'on puisse le réussir "en trois fois" : la seule
solution que j'en vois (et signalée par certains algorithmes)
est un parcours complexe oscillant entre les zones.
Une petite capture pour montrer que le web aide : mathworld et
wikipédia m'auront été d'un grand secours pour la réalisation
de ce jeu. Comme je le dis plus haut, mention spéciale aux
graphes hypohamiltoniens qui sont souvent plus durs à résoudre
(affirmation sans preuve, les vrais matheux me tueront).
Ici, le premier snark de Blanusa.
Encore une capture pour montrer le développement en
dual screen : d'un côté le code source, de l'autre la
documentation et les outils mathématiques pour vérifier la
cohérence des niveaux. Je me serais beaucoup servi de
ce superbe algorithme
pour les niveaux Hamiltoniens ! (Les eulériens ne requérant
pas d'aide pour les résoudre !)
Lors du test de certains niveaux, il m'arrivait d'activer un
mode "tricheur" qui m'indique à chaque point que je prends le
prochain point à prendre pour compléter un tour hamiltonien.
C'est de la triche certes, mais cela permet d'aller vite.
D'ailleurs, il y a aussi un raccourci clavier qui permet de
tricher et d'accéder au niveau supérieur sans résoudre le
précédent. Par pur esprit de moquerie, je l'ai laissé dans la
version finale... et dans le
code source du jeu, avis aux amateurs !
Un test pour afficher du texte agréable à l'œil.
Évidemment, là ça ne va pas... et pourtant, la police est la
bonne ! Le seul changement aura consisté à modifier la couleur
du texte, et à appliquer une ombre interne pour donner un
effet gravure.
L'évolution du texte, de gauche à droite : avec une ombre
interne forte, avec une ombre interne faible (c'est la version
retenue), sans ombre, et le motif que Licoti proposait (que
j'obtiens finalement).
Encore un niveau triché avec guide interactif. Je laisse
l'image en espérant qu'elle débloquera les gens coincés sur ce
niveau maléfique !
De même. On peut aussi noter les premiers essais pour afficher
une corde... non concluants.
Version RC1
À ce stade, j'exploite des gens innocents pour tester le jeu.
Il y a les testeurs distants, à qui je demande simplement de
me faire remonter les remarques, et les testeurs "en place"
que j'observe jouer pour voir si quelque chose est
contre-intuitif ou pas clair pour eux.
Le concept de "tirer le fil comme dans la réalité" n'a pas
toujours le même succès, mais à terme tout le monde
comprend.
Cela permet aussi de trier les niveaux par difficulté
croissante – même si cela reste tout à fait subjectif.
C'est pendant cette période que je suis retourné à une corde monochrome ; plus légère et plus jolie même si la texture s'intègre moins bien. De même, je rajoute des touches pour recommencer (echap, espace, k... pick one !) et le numéro des niveaux (grosse demande pour cette option, peut-être parce que les testeurs distants ne peuvent que dire "je bloque sur le niveau en forme de... toile d'araignée".
Un test de la version "en ligne" sous Linux. Malheureusement,
Flash Develop n'est disponible que sous Windows et je dois
donc développer sur cet OS, puis faire les tests sur Linux. On
peut voir ici que la corde est toujours là, toujours aussi
moche...
Apparition de la publicité pendant le chargement. Faut bien
vivre mon bon monsieur...
Ça bouge sur cette image ! Retour à une corde moins tape à
l'œil, signalement des erreurs bien visible, et
affichage du niveau en cours en bas. Notez le petit effet
grungy, c'est le même filtre que pour la craie.
Non, cette image n'est pas un bug ! C'est ce qui arrive si on
appuie plusieurs fois sur la touche gauche du clavier : les
niveaux défilent les uns après les autres. La RC m'aura permis
de détecter un bug important (une fuite mémoire si plusieurs
niveaux devaient être supprimés dans un même intervalle), et
plus important de le corriger :) Ainsi, le défilement est
cohérent. J'aime bien les numéros de niveau qui défilent en
bas à la manière d'un ascenseur, je trouve ça chouette !
La version debug de Flash permet d'afficher les zones de
retraçage, ce qui permet de s'assurer que l'application ne
travaille pas comme une folle à dessiner des choses inutiles.
Ici, on peut apprécier les rectangles rouges qui restent
confinés au strict minimum ; limitant ainsi la consommation
processeur du jeu.
Et pour conclure, des publicités interlevel. Il est
peu probable que vous en voyiez : elles ne s'affichent que
toutes les 15 minutes, si vous avez joué plus de 20 minutes.
Ressources utilisées :
Et enfin, les ressources "intégrées" dans le jeu. Si vous disséquez le swf, vous trouverez donc les images suivantes...
C'est la diapositive d'introduction du jeu. Elle part en effet
de fondu pour afficher Neamar, puis Licoti avec un effet de
fondu rendu possible par la complexité croissante des textures
(quelle phrase !).
L'arrière plan utilisé. On lui applique un effet miroir pour
simuler une planche plus large et ne pas avoir une répétition
directe.
La plante au premier plan. Je trouve que ça ressemble à du
laurier, d'autres à du Haschich (en même temps, certains
voient une croix gammée sur la solution d'un des niveaux. Faut
arrêter la symbologie, ça va trop loin ! C'est juste un
graphe.)
Clou et vis.
L'image de fin d'Icosien. Notez la disparition des clous, qui
sont ajoutés par le programme pour rendre le dernier niveau
interactif (mais ingagnable, faut pas abuser non plus). Cette
image n'est pas vraiment incluse dans le programme, car elle
est assez lourde pour n'être vue que par peu de monde (ne nous
voilons pas la face, les derniers niveaux sont durs. Très
durs). Je la charge donc dynamiquement quand le joueur arrive
sur le dernier niveau, ce qui allège de beaucoup le poids du
swf final.
Bonus
Android vaincra !
Même après des années de vie virtuelle, rien ne remplace le
couple papier crayon !
Petite sélection de quatre feuilles utilisées pour la
conception des niveaux. Y en a d'autres... mais elles sont à
la poubelle !
Voili voulou, maintenant il est temps d'aller
rejouer à Icosien
!
J'espère que cet article sans prétention vous aura
intéressé et aura comblé vos penchants voyeuristes.