Tables rondes et colloque à venir

J’interviendrai la semaine prochaine dans deux beaux événements de recherche.

Le mardi 14, je serai à l’ENSSIB de Lyon pour une Journée d’Etude intitulée Dialogue autour de la bande dessinée numérique. Elle réunira tous les contributeurs à l’ouvrage Bande dessinée et numérique, dont j’annonçais la sortie il y a quelques semaines. J’y animerai la table ronde « Questions de sémiotique » et participerai à la table ronde « Questions de création ». La journée d’étude est ouverte au public sur inscription préalable. Toutes les informations et accès au programme sur cette page.

Le jeudi 16, je donnerai une communication intitulée « De la jubilation de coder des récits-interfaces » lors du colloque Poetics of the algorithm à l’Université de Liège. Cet événement est également ouvert au public. Le programme, disponible sur le blog du colloque, est par ailleurs totalement incroyable!

Lecture commentée des Monstres d’Amphitrite

En attendant la suite du making-of, une nouvelle vidéo vient d’être postée sur la page de documentation autour des Monstres d’Amphitrite. Il s’agit d’une « lecture commentée », un peu à la manière des commentaires audio de réalisateurs sur les DVD. Vous pouvez donc la retrouver sur la page en question, mais je la poste également ci-dessous. (Je dois avouer ne pas avoir regardé le montage final.)

« Les Monstres d’Amphitrite » est en ligne!

Ma nouvelle bande dessinée numérique Les Monstres d’Amphitrite est en ligne ! Elle a été réalisée dans le cadre d’une commande par Mediatem – Réseau des médiathèques de Saint-Raphaël et Pays de Fayence dans le cadre d’un projet européen Erasmus+. C’est un récit assez court mais qui me tient à cœur dans la mesure où c’est, à ce jour, mon travail le plus personnel.

C’est par ici : Les Monstres d’Amphitrite

Une documentation autour du projet est également disponible sur le site de Mediatem à cette adresse. Cette page donne accès à un certain nombre de documents : interview en vidéo, présentation de la commande, résultats d’ateliers jeunesse, et bientôt commentaire de l’œuvre en vidéo. Bien sûr, le making-of entamé au début de l’année se poursuivra sur le blog dans les prochaines semaines.

N’hésitez pas à me faire part de vos remarques, notamment si vous repérez d’eventuels bugs. Bonne « lectacture » à tous !

 
logo

Les monstres d’Amphitrite, making-of d’une bande dessinée numérique (4): Codage de l’interface (2/2)

Quatrième billet de ce making-of et deuxième et dernière partie consacrée à la programmation de l’interface.

Pour rappel, je tente ici de répondre le plus simplement possible à une question que l’on m’a souvent posée : « comment ça marche tes trucs ? » et, collatéralement, « qu’est-ce que c’est, la programmation ? » Dans le dernier billet, j’ai répondu en disant : « c’est donner des ordres, des instructions à l’ordinateur ». Permettez-moi aujourd’hui de compléter : c’est donner des instructions à un ordinateur dans sa langue. Prenons un tout petit extrait du code utilisé dans Les Monstres d’Amphitrite :

billet04-1

Dans ce bout de code, je m’adresse directement à l’ordinateur pour lui demander certaines choses. Je le fais dans sa langue (ou plutôt l’une de ses langues : il en connait plusieurs). C’est exactement la même chose que parler une autre langue, que parler anglais ou espagnol. Je peux même m’amuser à traduire ce bout de code en français, ligne par ligne, phrase par phrase. Ca dit : « s’il-te-plaît adorable ordinateur, peux-tu faire en sorte que lorsque je passe la souris sur la case n°x (1), le pointeur de la souris prenne la forme d’une main-au-doigt-pointant (2); et que lorsque je clique dessus, cela déclenche les opérations permettant de passer à la case suivante (3)? » La langue utilisée ici est Javascript, dans une forme simplifiée grâce au framework jQuery. Hé bien on peut filer la métaphore de la langue encore plus loin. La différence entre Javascript et jQuery est analogue à la différence qui existe entre les différents niveaux de langage. Javascript est littéralement le niveau châtié de la langue, et jQuery le niveau courant ou familier : formes et tournures abrégées, grammaire et syntaxe simplifiées.

Quand je rédige un script, je fais un vrai exercice de traduction, du français (langue dans laquelle je rédige, au brouillon, les séries d’instructions indivisibles dont je parlais dans le précédent billet) vers le Javascript. La traduction est possible dans les deux sens. (Toute cette réflexion a fait l’objet de la performance Cache-cache, en 2013, dont vous pouvez voir la vidéo en ligne).

Revenons-en au script et en particulier aux « fioritures » de l’interface. Et ça commence par une erreur de conception majeure. La partie principale du script, celle qui fait avancer l’histoire, était destinée à être la plus souple possible. Je voulais qu’elle puisse fonctionner quel que soit le nombre de case, quelless que soient leur position et leurs dimensions, de manière à ce que cela puisse resservir pour d’autres histoires, mais aussi pour d’autres personnes (servez-vous ! Vous pouvez utiliser librement ce code!). Je voulais également me réserver la possibilité de créer des parcours à choix multiples à l’intérieur de mon récit. Hé bien ça, j’aurais dû y penser en amont, dès le départ, car la logique de mon script s’est avérée totalement incompatible avec les parcours multiples. N’ayant eu aucune envie de tout reprendre à zéro, j’ai bricolé un truc qui fonctionne pour Les Monstres d’Amphitrite, mais qui n’a aucune souplesse. Le script qui suit est donc prévu pour un unique cas : en fin de chapitre, un certain nombre de choix de parcours peuvent être proposés (le maximum possible étant défini par le nombre de cases à l’écran); mais chaque parcours ne dure que le temps d’un chapitre, tous les parcours se rejoignent au chapitre suivant et il faut repasser par ce nœud commun avant de proposer à nouveau plusieurs choix. Comme vous le voyez, c’est vraiment pour un cas de figure unique…

billet04-2

Ce bricolage a d’abord nécessité de revoir toute la hiérarchie du stockage des images en créant, dans chaque dossier d’images (un par chapitre, nommés ci-dessus « SEQ0 », « SEQ1 », etc.), un sous-dossier pour chaque branche possible dans le chapitre concerné (nommés « 0 », « 1  », « 2 », etc.).

billet04-3

Lors de l’initialisation, on indique quels chapitres offrent plusieurs choix à la fin de leur lecture, et combien de choix ils offrent (1). Par exemple dans cette version, on a 3 choix à la fin du chapitre 1. (Pour paramétrer plusieurs chapitres, on aurait pu utiliser une structure switch…case à la place de la structure if.) Ce sont les x derniers emplacements de la liste qui seront cliquables simultanément. Par exemple ici, pour 3 choix de parcours en fin de chapitre 1, ce sont les emplacements B2, C2, et A3 qui seront cliquables et clignoteront de manière simultanée (2).

billet04-4

Dans le dernier billet, on avait vu ce qui se passait au moment du clic dans le cas où il n’y avait pas de changement de chapitre et dans le cas où il y avait un changement de chapitre sans choix de parcours. On avait laissé de côté le dernier cas de figure : ce qui se passe lors du clic si on est arrivé à la fin d’un chapitre (1) qui offre plusieurs choix de parcours (2). Dans ce cas :
(3) On indique que l’on change de chapitre.
(4) Pour chaque choix de parcours, on applique à chaque emplacement correspondant le traitement suivant :
(5) On définit un lien vers le bon chapitre.
(6) On transforme l’emplacement correspondant en lien tel que défini en (5) et on le rend cliquable.
(7) Ce compteur permet d’interrompre la procédure une fois que tous les emplacements nécessaires ont été traités.
(8) et (9) On fait clignoter les emplacements.

Il reste deux fioritures à voir. Je les commenterai rapidement mais sans les détailler cette fois. D’abord, une partie du script permet de redimensionner l’ensemble des images de manière à s’adapter à la taille du navigateur de chaque utilisateur :

billet04-5

Ce sont de simples calculs de proportionnalité (vous savez, le tableau en croix ou règle de trois). Remarquez que je rentre en « dur » les dimensions des images dans le code, car je les connais d’avance et qu’elles font toutes la même taille (là encore, ça ne vaut donc que pour ce projet-là). Cela évite de devoir demander au programme de détecter automatiquement les dimensions des images, avec les problèmes que ça ne manque jamais de poser en terme de détection de la fin du chargement de chaque image.

Enfin, pour finir, voici la fonction qui fait clignoter le contours des emplacements quand ils sont cliquables :

billet04-6

C’est une simple animation qui se répète en boucle un certain nombre de fois (En l’état actuel du projet, 100 fois au début du premier chapitre et quand il y a choix de parcours, 2 fois dans les autres cas).

Rencontre avec Alex Baladi – mardi 15 mars

J’aurais le plaisir d’animer une rencontre avec Alex Baladi autour de l’exposition « Partitions dessinées », montée dans le cadre de la 6è édition du festival Transversales, dont le thème est « Rock, spleen et idéal : rock et littérature au carrefour des arts. ». La rencontre aura lieu salle des écrivains du sud, au 1er étage de la bibliothèque universitaire de Rennes 2, à 16h. Elle sera suivie d’une séance de dédicaces, puis à 18h par le vernissage de l’exposition, toujours à la bibliothèque universitaire, puis par le vernissage de l’exposition des photographies de Samuel Kirszenbaum et le concert de La Féline. Le festival Transversales quant à lui se déroule sur quatre jours, du 15 au 18 mars.

Voir le programme du festival (pdf)

Programme-Transversales-2016-1

Bande dessinée et numérique – CNRS Editions

Je viens de recevoir mon exemplaire de Bande dessinée et numérique, édité par le CNRS dans la collection « Les Essentiels d’Hermès » : je l’ai dévoré! Réunissant les contributions de tous les chercheurs français impliqués dans l’étude de la bande dessinée numérique, ainsi que des entretiens avec quelques auteurs, cet ouvrage est bien plus qu’une synthèse sur le sujet, il est une somme. Il présente un état des lieux relativement exhaustif de cet objet au tournant des années 2014-2015, et avec une remarquable cohérence en dépit du grand nombre de contributeurs. Il fera date! Pour ma part, j’y signe un court texte consacré à la question des liens d’influences réels ou supposés qu’entretiendrait la bande dessinée numérique avec le jeu vidéo, le Net Art et la littérature numérique.

ROBERT Pascal (dir.), Bande dessinée et numérique, coll. « Les Essentiels d’Hermès », Paris, CNRS Editions, 2016.

hermes

Les monstres d’Amphitrite, making-of d’une bande dessinée numérique (3): Codage de l’interface (1/2)

Troisième billet de ce making-of : la création de l’interface . Autrement dit, je vais vous ouvrir le capot et vous montrer le moteur : le script principal de l’interface, celui qui rend la bande dessinée interactive. Deux billets ne seront pas de trop pour ce faire : celui-ci est consacré au cœur du dispositif, et le prochain sera consacré aux fioritures.

Evidemment, je vais parler programmation. Comme je ne voudrais pas vous dégoûter de suivre ce making-of dès le troisième billet, sachez qu’après ces deux-là consacrés à la programmation, je reviendrai à des aspects plus « conventionnels » : storyboard, dessin… Je vais parler programmation donc, mais je ne vais pas être trop technique. D’abord parce que je suis médiocre en ce domaine, petit bidouilleur dont les bricolages feront rire les développeurs avertis. Ensuite, et surtout, plus que détailler le code, je souhaite donner un aperçu de la logique qui peut présider à ce genre de création numérique, le processus qui mène des idées à la réalisation concrète. Bref, j’aimerais essayer d’apporter un début de réponse à celles et ceux qui ont pu me demander : « je comprends rien en informatique, comment ça marche tes trucs ? »

Avant d’entrer dans le script principal, deux mots sur la « mise en page ». C’est une seule et même page html qui affiche successivement chaque chapitre. Cette page est générée en php et utilise des paramètres passés dans l’url.

Vous n’avez rien compris ? Je reprends : le site ne comporte qu’une seule page. A chaque changement de chapitre, cette page est rechargée avec des contenus, images et caractéristiques différentes. Pour ce faire, je lui donne des consignes dans un autre langage (php), grâce auxquelles elle va aller chercher les bonnes images, au bon endroit et au bon moment.

Le script principal quant à lui est rédigé en langage Javascript, avec l’aide de jQuery. Aujourd’hui, on va s’intéresser exclusivement au cœur du programme, à savoir à la partie du script qui permet d’avancer de case en case et de chapitre en chapitre. La première étape consiste à définir ce que l’on veut obtenir exactement. En l’occurrence, on veut qu’au moment où le lecteur clique sur une case, le système affiche la case suivante au bon emplacement ou lance le chapitre suivant si on est arrivé en fin de chapitre. Remis dans le bon ordre, cela donne :

Lors du clic sur une case, le système doit :
1. Déterminer si on est arrivé en fin de chapitre.
2. Si oui : on change de chapitre.
3. Si non : on affiche la case suivante au bon emplacement.
Facile !

Toute la logique ensuite va consister à détailler ces réactions que l’on veut obtenir de l’interface en un nombre fini d’instructions indivisibles (comme une recette de cuisine). Je ne sais pas si les développeurs ont une méthode particulière, la mienne consiste en un élagage progressif. Je décompose chaque étape en une série de sous-étapes, puis je décompose chacune des sous-étapes obtenues en une nouvelle série de sous-étapes, et ainsi de suite, jusqu’à ne plus pouvoir subdiviser. Par exemple, pour afficher la case suivante au bon emplacement :

Lors du clic, déclenchement successif des actions suivantes :
1. Rendre non-cliquable la case sur laquelle on vient de cliquer.
2. Déterminer quel est le prochain emplacement.
3. Y afficher la case.
4. La rendre cliquable à son tour.

Puis on continue en subdivisant chacune de ces étapes en sous-étapes, et ainsi de suite, jusqu’à obtenir une succession d’instructions indivisibles. Par exemple, pour l’étape 2 ci-dessus, il faut :
1. Obtenir le numéro de la case à venir.
2. Aller dans la liste des emplacements du chapitre actuel et chercher l’item dont la position dans la liste correspond au numéro de la case à venir.
3. Afficher la prochaine image (qui a été préchargée en amont) dans l’emplacement désigné par l’item récupéré à l’étape 2.
L’utilisation de jQuery permet de réduire le nombre d’instructions : par exemple, l’étape 3 ci-dessus est indivisible avec jQuery, alors qu’elle nécessite une autre série de sous-étapes en Javascript pur.

Bref, vous savez maintenant ce que signifie « programmer » : décomposer l’ensemble des actions voulues en une séries d’instructions indivisibles et correctement ordonnées. Ce sont ces instructions que notre interface va suivre pour répondre correctement aux actions du lecteur. On peut maintenant jeter un œil à la partie principale du script (sans entrer dans les détails et subtilités) :

billet3-1

On va d’abord avoir besoin d’entrer certaines données dans le programme :
(1) Un compteur, permettant de compter les cases successives.
(2) Des listes définissant la succession des emplacements telles que déterminées par le storyboard. Il y a une liste par chapitre. Dans le fichier html, chaque emplacement porte un identifiant unique : ce sont ces identifiants que l’on utilise ici. Dans cette version, je les ai identifiés selon un quadrillage, comme à la bataille navale : A1, B1, C1 … A3, B3, C3. (Bien sûr, cette nomenclature est possible parce que la planche affichée est un gaufrier régulier. Il ne faudrait pas oublier que tout cela, c’est de la bande dessinée avant tout!)
(3) Par exemple, dans le troisième chapitre (3è liste), ce sont successivement les emplacements C1, puis A1, puis à nouveau A1, puis A2, etc. qui accueilleront une nouvelle case et deviendront cliquables.
Pour les connaisseurs de Javascript : j’aurais pu rédiger chaque liste sous forme de tableau mais ça aurait été une plaie en virgules et en guillemets, alors j’ai préféré des chaînes de caractères. Un peu plus loin dans le code, j’applique la méthode split() aux chaînes.

Continuons : il faut d’abord assurer le premier chargement de la page : c’est le rôle de la fonction init(). :

billet3-2

Au premier chargement de la page…
(1) …on redimensionne toute l’interface en fonction de la taille de la fenêtre du navigateur de l’utilisateur.
(2) …on rend cliquable le premier emplacement qui doit l’être.
(3) …on précharge la prochaine case à être affichée.
(4) …on a ici une première fioriture: on fait clignoter le contours du premier emplacement pour indiquer au lecteur qu’il est cliquable.
(5) …on a ici une seconde fioriture que je détaillerai la prochaine fois, mais que je dois signaler pour comprendre la suite : on indique si tel ou tel chapitre se termine en proposant plusieurs choix de parcours au lecteur.

Et enfin, on arrive dans le cœur du dispositif, avec la fonction qui permet d’avancer, de case en case et de chapitre en chapitre:

billet3-3

Lorsque l’utilisateur clique sur la case qui clignote :
(1) …on stoppe le clignotement.
(2) …on rend non-cliquable la case qui vient d’être cliquée.
(3) …si on est arrivé à la fin du dernier chapitre, il ne se passe plus rien à partir de là (la suite du code ne sera pas « jouée »).
(4) …on indique que l’on passe à la case suivante.
(5) …si on est arrivé à la fin du chapitre…
(6) …et qu’il n’y a pas de parcours multiples…
(7) …on passe au chapitre suivant.
(5) …si on n’ est pas arrivé à la fin du chapitre…
(8) …on va poursuivre l’affichage successif des cases, comme suit :
(9) …on fait clignoter l’emplacement suivant,
(10) …on y affiche l’image prévue qui a été préalablement préchargée,
(11) …on le rend cliquable,
(12) …et enfin on précharge l’image qui vient après.

Voilà tout pour aujourd’hui ! N’hésitez pas à me faire des retours sur ce making-of, c’est une expérience que tout cela ! Et surtout, dites-moi si cela était assez clair (ou pas) pour des novices ? Merci !