Journal jnuit et la recette des mombolini

PostĂ© par (site web personnel) . Licence CC By‐SA.
42
16
fév.
2014

Bonjour Nal,

Je t'écris pour te parler de mon nouveau projet, jnuit, une bibliothÚque pour créer des interfaces graphiques pour les jeux avec Java/lwjgl et... Attends ne pars pas! Si tu restes je te donnerais une délicieuse recette italienne!

Maintenant que j'ai ton attention, revenons à nos moutons. Grùce à mes 42 journaux annuels, tu sais que je travaille sur deux jeux, Newton Adventure et Ned et les maki. Pour les créer, j'ai suivi le conseil d'un article célÚbre dans le milieu, Write Games, Not Engines, qui explique en gros qu'il est beaucoup plus efficace de se concentrer sur la réalisation d'un jeu spécifique plutÎt que de tenter de créer un moteur générique.

Ce principe m'a beaucoup aidé, mais aujourd'hui j'ai du mal à maintenir du code pour mes deux jeux, j'ai donc décidé de factoriser petits à petits leurs parties communes dans des bibliothÚques réutilisables:

jnuit

jnuit est une bibliothÚque de composant pour la création d'interfaces homme-machine pour les jeux vidéos. Elle tient compte des contraintes suivantes:

  • un joueur peut utiliser un clavier, une souris, un Ă©cran tactile, une manette ou une combinaison des quatre.
  • les manettes peuvent ĂȘtre trĂšs diffĂ©rentes: joystick, gamepad, stick arcade... Le nombre d'axes, leurs orientations, le nombre de boutons sont trĂšs divers.
  • il faut s'intĂ©grer dans la boucle d'Ă©vĂšnement d'un jeu.

Pour cela, j'ai réalisé jnuit suivant un modÚle trÚs simple avec seulement quelques concepts:

  • widget: l'Ă©lĂ©ment de base de l'interface.
  • layout: des widgets destinĂ©s Ă  en contenir d'autres.
  • curseur: un focus sur un widget qui peut ĂȘtre dĂ©placĂ©.
  • peu d'Ă©vĂ©nements: dĂ©placement du curseur, "ok", "annuler".

Sur cette base, j'ai implémenté des widgets génériques (select, toggle, label...) et spécifiques (configuration des clavier/souris/manettes, réglages du son, changement de la résolution, de la langue...).

Demo

Voici un exemple simple en image et en vidéo:

demo

Créer son propre jeu en une commande!

Cet exemple est ce que l'on obtient en utilisant l'archetype maven que j'ai créé pour l'occasion et qui permets de démarrer un projet de jeu vidéo moderne (injection de dépendances, systÚme d'entités, GUI complÚte, génération de paquets/installeurs pour la plupart des OS...) avec une simple commande:

mvn archetype:generate -DarchetypeGroupId=im.bci -DarchetypeArtifactId=jnuit-archetype -DarchetypeVersion=LATEST -DgroupId=comycompagny.superbaryo2 -DartifactId=superbaryo2 -Dgame-name=superbaryo2 -Dgame-package=com.mycompagny.superbaryo2 -Dversion=1.0-SNAPSHOT

Ensuite pour apprendre l'api, il suffit de consulter les exemples et la javadoc (fournit avec les livrables récupérés par maven).

Exemples de code

Note: pour ces exemples, il faut considérer que l'on a déjà créé deux objets toolkit et root. Leur création étant dépendante de l'API graphique utilisée (pour l'instant seulement lwjgl, mais je prévoie des portages sur playn), je ne la détaille pas ici.

Hello world

Label hello = new Label(toolkit, "Hello world!");
root.show(hello);

Formulaire simple avec un layout de type "table"

 Table table = new Table(toolkit);
 table.setBackground(new ColoredBackground(0, 0, 0, 1));
 table.defaults().expand().fill();
 Label fruitsLabel = new Label(toolkit, "Do you like fruits?");
 table.cell(fruitsLabel);
 Toggle fruitsToggle = new Toggle(toolkit);
 table.cell(fruitsToggle);
 table.row();
 Label kindLabel = new Label(toolkit, "What kind?");
 table.cell(kindLabel);
 Select<String> kindSelect = new Select<String>(toolkit, Arrays.asList("banana", "apple", "orange"));
 table.cell(kindSelect);
 table.row();
 table.cell(new Button(toolkit, "quit") {
 @Override
 public void onOK() {
 System.exit(0);
 }
 }).colspan(2);
 table.layout();
 root.show(table);

La recette des mombolini

Nal, je vois que ça fait beaucoup de Java pour aujourd'hui, passons à la recette!

Pour réaliser les momboloni, il faut:

  • de minces lamelles de porc.
  • du jambon cru ou de la coppa.
  • du parmesan.
  • de l'huile d'olive.
  • des cures dents.
  1. faire chauffer l'huile dans une poĂȘle.
  2. étaler les lamelles de porc.
  3. mettre la charcuterie sur les lamelles.
  4. saupoudrer de parmesans.
  5. rouler les lamelles et les maintenir avec un ou deux cure dents.
  6. faire cuire Ă  la poĂȘle quelques minutes en les tournant rĂ©guliĂšrement.

Bon appétit et bon code, Nal!

  • # ça tombe bien !

    PostĂ© par (Mastodon) . ÉvaluĂ© Ă  6.

    Ton journal tombe bien parce que j'avais une question sur les interfaces que tu dĂ©veloppes et tu y rĂ©ponds en partie mais j'aimerais en ĂȘtre sĂ»r.

    Ici, comme je le comprends, tu unifies toutes les interfaces en considĂ©rant qu'elles partagent toutes un ensemble d'actions simples (dĂ©placement, «ok», «annuler»), c'est bien ça ? Et donc, tu fais tout pour ne pas avoir d'interaction spĂ©cifique Ă  une interface particuliĂšre. Ma question est : est-ce que ce n'est pas handicapant ? Parce qu'avec une souris, tu pourrais avoir une interface bien plus riche qu'avec une manette, ou diffĂ©rente disons. Est-ce qu'on ne se prive pas de modes d'action possible dans un jeu Ă  cause de cette unification ? Jusqu'oĂč peut-on pousser l'unification sans que ça ne paraisse trop artificiel ?

    Dans mes rĂ©flexions prĂ©liminaires (en grande partie dĂ» au fait que tu m'as dit vouloir jouer avec une manette au tout dĂ©but, merci bien !), j'avais pensĂ© Ă  faire quelque chose dans ce genre lĂ  donc ça ne me paraĂźt pas si dĂ©nuĂ© de bon sens. Mais je me demande vraiment si ça ne va pas ĂȘtre limitant en pratique.

    • [^] # Re: ça tombe bien !

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

      J'ai tout simplifié avec les notions suivantes:

      • contrĂŽle: un input qui renvoie une valeur entre 0 (pas actif) et 1 (Ă  fond) => ça sert Ă  modĂ©liser le dĂ©placement d'un axe d'une manette ou l'appui sur un bouton (souris, clavier ou manette, ça reste des boutons!).
      • action: une action dans l'interface ou dans le jeu qui peut ĂȘtre activĂ©e via un ou plusieurs contrĂŽles.
      • curseur: le focus sur le widget courant et peut ĂȘtre dĂ©placĂ© soit via une action (haut, bas, gauche, droite).
      • pointeur: point sur l'Ă©cran que l'on peut dĂ©placer Ă  la souris ou au touchpad et qui permets d'activer les widgets.

      Il y a donc bien un petit traitement de faveur pour certains inputs:

      • seuls la souris et le touchpad permettent de gĂ©rer le pointeur.
      • un mapping contrĂŽle => action par dĂ©faut pour le clavier.

      J'espÚre pouvoir réalise un mapping par défaut pour les manettes mais c'est assez compliqué: par exemple on pourrait croire que toutes les manettes ont des axes 0 et 1, mais j'ai un stick arcade qui ne présentent par défaut que deux axes: 4 et 5...

      Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

      • [^] # Re: ça tombe bien !

        PostĂ© par (Mastodon) . ÉvaluĂ© Ă  2.

        OK, c'est plus gĂ©nĂ©rique que ce que je pensais. Du coup, j'ai une question subsidiaire ;) En fait, je me dis que je ne pourrai pas Ă©chapper Ă  la configuration de l'input, quel qu'il soit. J'ai vu que tu avais un widget prĂ©dĂ©fini pour ça d'ailleurs. Ma question est : penses-tu que ce soit possible de le faire de maniĂšre plus interactive ? En fait, pour mon jeu, j'aimerais que le joueur puisse configurer son input au fur et Ă  mesure, genre au dĂ©but "appuyer sur la touche OK". Et ensuite, "appuyer sur Avancer", etc. Puis je fais bouger le joueur. Puis "appuyer sur Annuler", et je le fais utiliser cette nouvelle touche en jeu. Et du coup, la configuration se fait au fur et Ă  mesure en montrant Ă  quoi sert quelle touche façon tutoriel. Bon, ça c'est mon rĂȘve, maintenant, pour toi qui a dĂ©jĂ  mis les mains dedans, est-ce que ça te semble faisable et/ou facile ?

        • [^] # Re: ça tombe bien !

          PostĂ© par (site web personnel) . ÉvaluĂ© Ă  4.

          C'est assez facile, il suffit de faire une sorte de wizard ou alors un popup à chaque nouvelle action, mais par contre ce n'est pas trÚs agréable pour le joueur:

          • s'il se rate, il lui faut tout recommencer.
          • s'il connaĂźt dĂ©jĂ  le jeu, il n'a pas forcĂ©ment envie de refaire le tutorial.

          Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

          • [^] # Re: ça tombe bien !

            PostĂ© par (Mastodon) . ÉvaluĂ© Ă  3.

            Oui, donc tu dis en fait qu'il faudra de toute façon passer par un panneau de configuration pour l'input. Mais sur le tuto, j'hĂ©site encore. Dans FF12 par exemple, dans mon souvenir, au dĂ©but, il y a un tuto pour prendre en main le jeu, ce n'est pas trĂšs long (et d'autres aspects du jeu sont mis en tuto plus loin dans le jeu) et ça permet de bien introduire les mĂ©caniques du jeu je trouve. Je voulais ajouter la configuration des touches mais bon, peut-ĂȘtre que ça fait trop du coup. Je vais continuer Ă  rĂ©flĂ©chir.

  • # Et la recette alors ?

    PostĂ© par . ÉvaluĂ© Ă  1.

    En lisant le mot "recette" associé à linuxfr dans mes flux rss hier soir, je me suis dit qu'il était trop tard pour lire ça avec le nombre incroyable de commentaires que ça génÚrerait.

    Je suis déçu...

    Enfin bref, ça a l'air bon.

  • # Autres libs ?

    PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  3.

    Hello,

    Tout d'abord merci de prendre le temps de partager tes aventures depuis le début sur linuxfr :)

    DĂ©veloppant aussi Ă  mes heures perdues de petits jeux en Java + LWJGL (parfois avec Slick2D aussi), je me posais la question suivante : si je comprends bien, l'intĂ©rĂȘt principal de jnuit (sympa pour les dyslexiques, au passage ;) est de ne pas avoir Ă  se prĂ©occuper de la diversitĂ©/complexitĂ© des pĂ©riphĂ©riques d'entrĂ©e pour l'UI. Par contre, en terme de composants purs, pourquoi ne pas t'appuyer sur une lib dĂ©diĂ©e Ă  ça, type TWL, en dehors de leur PNGDecoder ? (que tu connais sĂ»rement, mais pour les autres : http://twl.l33tlabs.org/)

    Merci encore Ă  toi.

    • [^] # Re: Autres libs ?

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

      Développant aussi à mes heures perdues de petits jeux en Java + LWJGL (parfois avec Slick2D aussi)

      N'hésite pas à faire plein de journaux pour en parler!

      l'intĂ©rĂȘt principal de jnuit (sympa pour les dyslexiques, au passage ;) est de ne pas avoir Ă  se prĂ©occuper de la diversitĂ©/complexitĂ© des pĂ©riphĂ©riques d'entrĂ©e pour l'UI

      L'intĂ©rĂȘt principal de jnuit, c'est de partager du code entre mes jeux et de simplifier la vie des contributeurs :-)

      Pour les autres, la vraie valeur ajoutée n'est pas tant dans la bibliothÚque que dans l'archetype maven: créer un projet de jeu avec une UI quasi complÚte, une architecture qui mélange systÚme à entité et injection de dépendances et de quoi générer des paquets/installeurs pour les OS majeurs, c'est un énorme boulot. Là ça se fait en une commande.

      en terme de composants purs, pourquoi ne pas t'appuyer sur une lib dédiée à ça, type TWL

      J'utilise TWL pour le menu des options de Newton Adventure. Ça fait le boulot, mais:

      • crĂ©er un thĂšme est horriblement compliquĂ©.
      • j'ai passĂ© beaucoup de temps sur des problĂšmes de layout qui se sont terminĂ© en "ce sera moche et tant pis".
      • twl est fait pour ĂȘtre utiliser avec un clavier et une souris.
      • son auteur n'aime pas maven, donc ça fait une dĂ©pendance Ă  gĂ©rer Ă  la main...
      • il n'y a pas de portage playn et ce serait trĂšs compliquĂ© pour le backend html5 (il faut utiliser un sous ensemble trĂšs minimal de Java).

      J'ai essayĂ© les autres bibliothĂšques d'UI pour lwjgl et elles ont toutes Ă  peu prĂšs les mĂȘmes dĂ©fauts en plus d'ĂȘtre moins documentĂ©es et maintenues que TWL.

      Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

      • [^] # Re: Autres libs ?

        PostĂ© par . ÉvaluĂ© Ă  3.

        Pour les autres, la vraie valeur ajoutée n'est pas tant dans la bibliothÚque que dans l'archetype maven: créer un projet de jeu avec une UI quasi complÚte, une architecture qui mélange systÚme à entité et injection de dépendances et de quoi générer des paquets/installeurs pour les OS majeurs, c'est un énorme boulot. Là ça se fait en une commande.

        C'est dommage l'utilisation du build.sh, il y a une raison qui empĂȘche le plugin assembly de faire cette copie ? Ça permettrait d'ĂȘtre plus portable et de tout gĂ©rer avec un mĂȘme systĂšme de build.

        Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

        • [^] # Re: Autres libs ?

          PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

          Le build.sh est juste un petit script qui m'aide à préparer les releases sans avoir à me souvenir des paramÚtres maven :-)

          De toute façon la génération des paquets n'est pas portable, ça ne marche que sous linux avec certains paquets installés (il faut les bons outils pour construire les paquets rpm par exemple).

          Mais effectivement, je vais regarder le plugin assembly pour remplacer les copies de fichiers, ce sera déjà ça...

          Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

          • [^] # Re: Autres libs ?

            PostĂ© par . ÉvaluĂ© Ă  2.

            De toute façon la génération des paquets n'est pas portable, ça ne marche que sous linux avec certains paquets installés (il faut les bons outils pour construire les paquets rpm par exemple).

            Oui la portabilité est annexe. C'est juste que ça m'horripilerais toujours un peu d'avoir à faire mvn package -Dbidule && ./build.sh plutÎt qu'un simple mvn package. :)

            Je n'ai pas d'exemple de projet avec cette architecture, si tu me dis oĂč en trouver un je peux regarder si tu veux.

            Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

            • [^] # Re: Autres libs ?

              PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2. DerniĂšre modification le 17 fĂ©vrier 2014 Ă  18:23.

              Je n'ai pas d'exemple de projet avec cette architecture, si tu me dis oĂč en trouver un je peux regarder si tu veux.

              Tu peux partir de l'archetype ou du code de Ned et les maki :-)

              Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

      • [^] # Re: Autres libs ?

        PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  2.

        Effectivement, faudrait que j'arrive Ă  me bouger le *** pour faire poster de temps en temps des journaux Ă  ce sujet.

        Pour TWL, j'en ai aussi essayĂ© quelques autres libs d'UI, mais la doc m'a toujours fait revenir Ă  TWL (et mĂȘme quand la doc manque, les sources sont relativement clairs). Pour ce qui est des thĂšmes, c'est vrai qu'il y a un sacrĂ© ticket d'entrĂ©e (je ne compte pas les heures passĂ©es), mais au final j'ai trouvĂ© ça vraiment sympa, mĂȘme pour les composants custo (ça pourrait faire un sujet sympa de journal/article, d'ailleurs, parce-que sur ce sujet la doc est pour le moins Ă©vasive).

  • # Recette

    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  6.

    Ça a l'air bon, mais je trouve qu'il manque quelques prĂ©cisions.

    Pour réaliser les momboloni, il faut:

    • de minces lamelles de porc.

    Des lamelles de quoi de porc ? Du lard ?

    1. faire chauffer l'huile dans une poĂȘle.
    2. étaler les lamelles de porc.

    Vu la suite, il doit s'agir de les étaler sur un plan de travail, pas de les faire cuire tout de suite, tu confirmes ?

    1. mettre la charcuterie sur les lamelles.

    Empiler des tranches de jambon de porc sur d'autres tranches de porc en somme.

    1. saupoudrer de parmesans.
    2. rouler les lamelles et les maintenir avec un ou deux cure dents.
    3. faire cuire Ă  la poĂȘle quelques minutes en les tournant rĂ©guliĂšrement.

    Faire cuire avec les cure-dents ? En mettant ces rouleaux avec le cure-dent à l'horizontale du coup, c'est ça ?

    • [^] # Re: Recette

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

      Des lamelles de quoi de porc ? Du lard ?

      Non, vraiment de la bidoche. Je ne trouve pas de photo, j'essayerai d'en prendre la prochaine fois que je fais la recette!

      Vu la suite, il doit s'agir de les étaler sur un plan de travail, pas de les faire cuire tout de suite, tu confirmes ?

      Oui.

      Faire cuire avec les cure-dents ? En mettant ces rouleaux avec le cure-dent à l'horizontale du coup, c'est ça ?

      Oui, il faut retourner de temps en temps pour que tout soit bien cuit.

      Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

      • [^] # Re: Recette

        PostĂ© par . ÉvaluĂ© Ă  3.

        Faire cuire avec les cure-dents ? En mettant ces rouleaux avec le cure-dent à l'horizontale du coup, c'est ça ?

        Oui, il faut retourner de temps en temps pour que tout soit bien cuit.

        Comment sait-on que le cure-dent est bien cuit ?

        • [^] # Re: Recette

          PostĂ© par (site web personnel) . ÉvaluĂ© Ă  8.

          Comment sait-on que le cure-dent est bien cuit ?

          Quand il prends feu.

          Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board

      • [^] # Re: Recette

        PostĂ© par . ÉvaluĂ© Ă  2.

        Non, vraiment de la bidoche. Je ne trouve pas de photo, j'essayerai d'en prendre la prochaine fois que je fais la recette!

        Genre escalope de porc? Ça ressemble à des saltimboccas sans veau, ton affaire ;)

        • [^] # Re: Recette

          PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  2.

          Ça ressemble à des saltimboccas sans veau, ton affaire ;)

          Ou plus simplement Ă  une lointaine variante de Brageole.

          • [^] # Re: Recette

            PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3. DerniĂšre modification le 17 fĂ©vrier 2014 Ă  16:37.

            Vraiment lointaine alors, parce qu'à ce compte-là, on peut aussi considérer ça comme une variante éloignée des nems, tant qu'à faire.

    • [^] # Re: Recette

      PostĂ© par . ÉvaluĂ© Ă  2.

      En mettant ces rouleaux avec le cure-dent à l'horizontale du coup, c'est ça ?

      Oui. DĂ©solĂ© Captain Obvious a pas pu venir, un peu comme tu cuirais des mini-brochettes Ă  la poĂȘle quoi.

      Des lamelles de quoi de porc ? Du lard ?

      Vu que dedans tu y fout de la charcutaille moi je serais plutÎt parti sur de bonnes lamelles d'échine, voir de filet... Assez épaisses (faudrait pas que ça craque à la cuisson hein).

Suivre le flux des commentaires

Note : les commentaires appartiennent Ă  celles et ceux qui les ont postĂ©s. Nous n’en sommes pas responsables.