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:
- le chargement des niveaux créés avec Tiled: libtiled-jpurexml.
- la gestion des menus et des configuration: jnuit.
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:
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.
- faire chauffer l'huile dans une poĂȘle.
- étaler les lamelles de porc.
- mettre la charcuterie sur les lamelles.
- saupoudrer de parmesans.
- rouler les lamelles et les maintenir avec un ou deux cure dents.
- 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 rewind (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 devnewton đș (site web personnel) . ĂvaluĂ© Ă 3.
J'ai tout simplifié avec les notions suivantes:
Il y a donc bien un petit traitement de faveur pour certains inputs:
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 rewind (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 devnewton đș (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:
Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board
[^] # Re: ça tombe bien !
PostĂ© par rewind (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 Reihar . Ă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.
[^] # Re: Et la recette alors ?
PostĂ© par matthieu bollot (site web personnel, Mastodon) . ĂvaluĂ© Ă 3.
Moi aussi je suis déçu, j'ai cru qu'il s'agissait de Recette_(informatique)
# Autres libs ?
PostĂ© par mrlem (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 devnewton đș (site web personnel) . ĂvaluĂ© Ă 3.
N'hésite pas à faire plein de journaux pour en parler!
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.
J'utilise TWL pour le menu des options de Newton Adventure. Ăa fait le boulot, mais:
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 barmic . ĂvaluĂ© Ă 3.
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 devnewton đș (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 barmic . ĂvaluĂ© Ă 2.
Oui la portabilité est annexe. C'est juste que ça m'horripilerais toujours un peu d'avoir à faire
mvn package -Dbidule && ./build.shplutĂŽt qu'un simplemvn 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 devnewton đș (site web personnel) . ĂvaluĂ© Ă 2. DerniĂšre modification le 17 fĂ©vrier 2014 Ă 18:23.
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 mrlem (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 đČ Tanguy Ortolo (site web personnel) . ĂvaluĂ© Ă 6.
Ăa a l'air bon, mais je trouve qu'il manque quelques prĂ©cisions.
Des lamelles de quoi de porc ? Du lard ?
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 ?
Empiler des tranches de jambon de porc sur d'autres tranches de porc en somme.
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 devnewton đș (site web personnel) . Ă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!
Oui.
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 gnx . ĂvaluĂ© Ă 3.
Comment sait-on que le cure-dent est bien cuit ?
[^] # Re: Recette
PostĂ© par devnewton đș (site web personnel) . ĂvaluĂ© Ă 8.
Quand il prends feu.
Ce post est offensant ? Prévenez moi sur https://linuxfr.org/board
[^] # Re: Recette
PostĂ© par Larry Cow . ĂvaluĂ© Ă 2.
Genre escalope de porc? Ăa ressemble Ă des saltimboccas sans veau, ton affaire ;)
[^] # Re: Recette
PostĂ© par Tonton Th (site web personnel, Mastodon) . ĂvaluĂ© Ă 2.
Ou plus simplement Ă une lointaine variante de Brageole.
[^] # Re: Recette
PostĂ© par đČ Tanguy Ortolo (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 Marotte â§ . ĂvaluĂ© Ă 2.
Oui. DĂ©solĂ© Captain Obvious a pas pu venir, un peu comme tu cuirais des mini-brochettes Ă la poĂȘle quoi.
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.