Sujet: Scrolling Down/Up pour dialogue Ven 19 Oct 2018 - 7:49
Bonjour à tous
J'ai l'impression que je commence à rentrer dans les trucs un peu plus complexe, héhé
Je voudrais créer des boutons pour scroller les options de dialogues (ma fenêtre par défaut est assez haute pour contenir environ 4 lignes mais parfois, il y en a plus que 4 et donc ça dépasse, il faut bien pouvoir scroller via un bouton ou juste la molette). J'ai fait des recherches là dessus ces derniers jours avant de venir vous embêter sur les forum anglophone etc... mais ce n'est pas toujours très clair ou pas très à jour.
De ce que j'ai compris, il y a 2 solutions pour créer ce genre de bouton.
1. Passer par un module "abstauber" mais de ce que j'ai lu, il est assez complexe à prendre en main. 2. Créer une zone de custom dialogue, le manuel explique assez bien comment le faire et au moment d'expliquer comment faire les fleches de scroll le manuel ouvre la fonction et dit "Tapez ce que vous voulez ici" LOL Je ne suis pas beaucoup plus avancé donc...
J'ai essayé d'opter pour la solution 2, ça à l'air de fonctionner niveau "mise en place" des dialogues options. La disposition semble correct mais les options ne sont pas clickable, le GUI que j'avais crée à maintenant complètement disparue (j'imagine que j'ai besoin de l'appeler de nouveau mais où ?) Mais surtout, je bloque toujours sur les flèches de défilement...
Y a-t-il, à votre connaissance, un moyen "facile" de créer ces flèches de défilement ?
Ci-joint le code de ma zone de dialogue custom.
Code:
function dialog_request(int param) {
}
function dialog_options_get_dimensions(DialogOptionsRenderingInfo*info) { // Créer une zone d'options de dialogue 200x200 à (50,100) info.X = 442; info.Y = 840; info.Width = 1035; info.Height = 140;
// Placer l'analyseur de texte en bas (si activé) info.ParserTextBoxX = 1477; info.ParserTextBoxY = 980; info.ParserTextBoxWidth = 1035; }
function dialog_options_render(DialogOptionsRenderingInfo*info) { // Effacer la zone jaune info.Surface.Clear (0); int i = 1, ypos = 0; // Rendre toutes les options activées while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { if (info.ActiveOptionID == i) info.Surface.DrawingColor = 0; else info.Surface.DrawingColor = 4; info.Surface.DrawStringWrapped (5, ypos, info.Width - 10, eFontfntDefault, eAlignLeft, info.DialogToRender.GetOptionText (i)); ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontfntDefault, info.Width - 10); } i ++; } }
function dialog_options_get_active (DialogOptionsRenderingInfo * info) { int i = 1, ypos = 0; // Trouver l'option qui correspond à l'endroit où le joueur a cliqué while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontfntDefault, info.Width - 10); if ((mouse.y - info.Y) <ypos) { info.ActiveOptionID = i; return; } } i ++; } }
function dialog_options_mouse_click (DialogOptionsRenderingInfo *, MouseButton button) {
}
Merci d'avance, et surtout hésitez pas à me le dire si je vous harcèle trop de question
valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
Sujet: Re: Scrolling Down/Up pour dialogue Ven 19 Oct 2018 - 17:33
CookiewooD a écrit:
J'ai l'impression que je commence à rentrer dans les trucs un peu plus complexe, héhé
Ah, en effet il y a un bond là . Mais avant toute chose, il y a une raison particulière qui t'as poussé à choisir un affichage personnalisé de options de dialogue plutôt que d'utiliser le système de base ? Parce que ça ne va pas te simplifier la tâche à mon avis. Enfin tu as certainement une bonne raison, mais je préfère en avoir le cœur net pour être sûr qu'il n'y a pas une solution plus simple (et à titre personnel j'y vois plus clair quand j'ai une vue d'ensemble de ce qui est visé).
CookiewooD a écrit:
J'ai fait des recherches là dessus ces derniers jours avant de venir vous embêter sur les forum anglophone etc...
Tu ne nous embête pas.
CookiewooD a écrit:
et surtout hésitez pas à me le dire si je vous harcèle trop de question
Ben du coup non. (Tu remarqueras qu'on n'est pas trop étouffé par les sollicitations en ce moment )
_________________ Vous êtes déjà allés à Condate ? Ils ont un petit vin qui à un goût de pierre à catapulte. C'est Toutatis en culotte de velours si j'ose m'exprimer ainsi.
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
Sujet: Re: Scrolling Down/Up pour dialogue Ven 19 Oct 2018 - 18:12
Salut !
Je pense que gérer le scrolling sur un dialogue personnalisé consiste "simplement" à décaler les coordonnées y dans dialog_options_render (fonction utilisée pour (re-)dessiner le dialogue à l'écran régulièrement).
Si tu as une molette sur ta souris/ton pad, je t'invite à tester ça :
Code:
int differenceHauteurs = 0; // vaudra hauteur de la fenetre GUI - hauteur totale du texte des options int decalageY = 0; // pixels de decalage vers le haut pour le texte des options
function dialog_request(int param) {
}
function dialog_options_get_dimensions(DialogOptionsRenderingInfo *info) { // Créer une zone d'options de dialogue 200x200 à (50,100) info.X = 442; info.Y = 840; info.Width = 1035; info.Height = 140;
// Placer l'analyseur de texte en bas (si activé) info.ParserTextBoxX = 1477; info.ParserTextBoxY = 980; info.ParserTextBoxWidth = 1035; }
function dialog_options_render(DialogOptionsRenderingInfo *info) { // Effacer la zone jaune info.Surface.Clear (0); int i = 1, ypos = 0 - decalageY; // la premiere option s'affiche a 0 - decalageY // Rendre toutes les options activées while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { if (info.ActiveOptionID == i) info.Surface.DrawingColor = 0; else info.Surface.DrawingColor = 4; info.Surface.DrawStringWrapped (5, ypos, info.Width - 10, eFontfntDefault, eAlignLeft, info.DialogToRender.GetOptionText (i)); ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontfntDefault, info.Width - 10); } i ++; } differenceHauteurs = (ypos + decalageY) - info.Height; // ypos vaut maintenant la hauteur totale des options (-decalageY) }
function dialog_options_get_active (DialogOptionsRenderingInfo * info) { int i = 1, ypos = 0 - decalageY; // prends en compte le decalage ici aussi // Trouver l'option qui correspond à l'endroit où le joueur a cliqué while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontfntDefault, info.Width - 10); if ((mouse.y - info.Y) <ypos) { info.ActiveOptionID = i; return; } } i ++; } }
function dialog_options_mouse_click (DialogOptionsRenderingInfo *info, MouseButton button) { if (button == eMouseWheelSouth && differenceHauteurs > 0 && decalageY < differenceHauteurs) decalageY++; // molette bas : on monte le texte si fenetre pas assez haute et si decalage max pas encore atteint else if (button == eMouseWheelNorth && differenceHauteurs > 0 && decalageY > 0) decalageY--; // molette haut : on descend le texte si fenetre pas assez haute et s'il reste du texte qui depasse par le haut }
NOTE IMPORTANTE : d'après l'aide, ça ne marchera pas si tu utilises la molette en survolant une option de dialogue
_________________ Ga is Ga Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
CookiewooD Adepte de la Grande Tasse Bleue
Nombre de messages : 54
Age : 35
Localisation : Gard
Date d'inscription : 18/09/2018
Sujet: Re: Scrolling Down/Up pour dialogue Lun 22 Oct 2018 - 7:49
Hello all, j’espère que vous avez passé un bon WE
valoulef a écrit:
il y a une raison particulière qui t'as poussé à choisir un affichage personnalisé de options de dialogue plutôt que d'utiliser le système de base ?
J'avais l'impression que c'était le seul moyen pour pouvoir scroller ou ajouter des flèches de défilement dans le cas où j'ai plus de 4 options de dialogues. Mais si je me trompe et qu'il y a un moyen "plus simple" avec le système de base surtout n'hésite pas à m'en parler ou me rediriger vers le bon tuto
Kitai, j'ai tenté ta solution, les options de dialogue sont bien disposée là où je les attends mais ne sont pas clickable et la GUI de dialogue (gdial) que j'avais crée a disparu (il faut certainement l'appeler quelque part mais je ne sais pas où). Le fond est noir opaque.
Peut-être que je me casse la tête pour pas grand chose et qu'il y a un moyen plus efficace de faire des flèches de défilement sur une autre base que celle que j'avais initialement choisi ?
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
Sujet: Re: Scrolling Down/Up pour dialogue Lun 22 Oct 2018 - 17:04
En répondant à ton message j'ai confondu "dialogue" et "inventaire" l'espace d'un instant, du coup je me disais que la solution était toute trouvée : utiliser ScrollUp et ScrollDown !
J'ai très peu utilisé les dialogues sous AGS, donc j'avoue que je sais pas trop les méthodes disponibles. En attendant, si personne ne connaît de solution évidente, je pourrais ouvrir mon AGS poussiéreux (ou même installer la dernière mouture !) et tester la méthode des dialogues personnalisés
_________________ Ga is Ga Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
Sujet: Re: Scrolling Down/Up pour dialogue Lun 22 Oct 2018 - 17:37
CookiewooD a écrit:
J'avais l'impression que c'était le seul moyen pour pouvoir scroller ou ajouter des flèches de défilement dans le cas où j'ai plus de 4 options de dialogues. Mais si je me trompe et qu'il y a un moyen "plus simple" avec le système de base surtout n'hésite pas à m'en parler ou me rediriger vers le bon tuto
Normalement, en laissant tout par défaut tu peux facilement avoir une grosse dizaine d'options de dialogue (en se basant sur les paramètres par défaut du template LW_BASS en terme de définition et de taille de police de caractères), sans besoin de scroller. La hauteur de l'interface s'adapte automatiquement au nombre d'options affichées. Tu as testé ? Si ça ne fonctionne pas je veux bien voir une capture d'écran pour comprendre pourquoi (éventuellement en mp si tu ne veux pas dévoiler l'apparence de ton jeu).
Edit : Ok, je crois avoir compris d'où venait ton problème. Tu as assigné un GUI dans le paramètre "Use GUI for dialog options" du General Settings ? Vu ce que tu décris il semblerait que oui (je n'avais pas pensé à ça). Est-ce nécessaire ? Si tu laisse le paramètre à 0 alors tu auras une interface sur fond noir qui affichera les options de dialogue, en adaptant sa hauteur au nombre d'options dans la limite de la hauteur de l'écran dans le jeu. Si toutefois tu tiens à avoir une interface personnalisée pour l'affichage des options (pour mettre un arrière plan personnalisé, ou pour définir une position ou des dimensions différentes de celles proposées pas défaut par exemple), il y probablement moyen de coder un truc sans passer par l'usine à gaz de "l'affichage personnalisé des options de dialogue" pour que la taille de ton GUI s'adapte automatiquement à la hauteur que requiert le nombre d'option. Ceci n'est que spéculation et je me pencherai sur la question en cas de besoin mais avant tout la balle est dans ton camp pour nous dire ce que tu préfères (et notamment si simplement l'option par défaut te convient finalement ou non).
_________________ Vous êtes déjà allés à Condate ? Ils ont un petit vin qui à un goût de pierre à catapulte. C'est Toutatis en culotte de velours si j'ose m'exprimer ainsi.
CookiewooD Adepte de la Grande Tasse Bleue
Nombre de messages : 54
Age : 35
Localisation : Gard
Date d'inscription : 18/09/2018
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 7:42
Coucou !
Pas de souci Kitai, effectivement, je rageais de voir qu'il y avait un moyen très simple pour scroller dans l'inventaire et pas les dialogues xD Je comprends ta confusion
Valoulef, effectivement, j'ai mis une GUI personnalisée dans les general settings. Comme c'est un projet à 3, je ne peux pas prendre cette décisions seule et je pense que mes collègues vont pas aimer l'idée d'un simple fond noir... Si pas moyen de scroller dans la boite de dialogue, la solution de la GUI personnalisé qui s'agrandi automatiquement en fonction du nombre d'option, ça me va bien par contre ! Pas de souci pour dévoiler un peu le jeu. Voilà à quoi ressemble la boite de dialogue lorsque je dépasse les 4 options de dial
Merci beaucoup les gars
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 9:29
Faut que je pense à regarder comment j'avais géré ça.
Une solution de facilité, c'est de ne jamais dépasser les 4 options de dialogues, et si tu en as plus tu met une option de dialogue genre :
"Parlons d'autre chose." "Changeons de sujet." "Pour revenir à ce dont nous parlions..." etc. qui change les options disponibles.
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 12:14
Salut, Petite question juste pour être sûr et évacuer cette hypothèse : Est-ce que le GUI utilisé pour afficher les dialogues est bien une fenêtre de texte personnalisée ? Si c'est le cas sa taille devrait s'adapter en fonction du nombre de lignes de dialogues.
CookiewooD Adepte de la Grande Tasse Bleue
Nombre de messages : 54
Age : 35
Localisation : Gard
Date d'inscription : 18/09/2018
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 12:33
Yop
Oui Billbis, j'avais pensé à cette solution si vraiment je n'y arrivais pas
Arlann, je crois que tu met le doigt sur quelque chose, j'ai fait une simple "GUI" et non pas une "New text windows GUI"... La solution de la boite qui s'adapte en fonction du nombre d'option pourrait faire l'affaire je pense si vraiment le scrolling s'avère compliqué.
Si je dis pas de bêtises, ce genre de fenêtre se personnalise graphiquement avec des espèces de "bloc" graphiques (les corners, barre horizontale, barre verticale) qui sont ensuite démultipliés autant de fois que nécessaire en fonction du nombre d'option de dialogue possible ?
Désolé si j'utilise des termes de profanes xD
Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 13:00
CookiewooD a écrit:
Si je dis pas de bêtises, ce genre de fenêtre se personnalise graphiquement avec des espèces de "bloc" graphiques (les corners, barre horizontale, barre verticale) qui sont ensuite démultipliés autant de fois que nécessaire en fonction du nombre d'option de dialogue possible ?
Exactement.
Sinon tu peux envisager de garder un GUI normal et adapter sa taille par le script en fonction de tes besoins de dialogues. Il suffirait de créer une fonction qui compte le nombre de propositions activées, puis redimensionner ton GUI et changer son image de fond.
C'est plus compliqué pour les flèches de défilement mais cela doit être possible en customisant l'interface intégralement, mais je ne m'y suis jamais penché...
valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 13:44
@CookiewooD tu semble préférer malgré tout le fait de pouvoir scroller ? Parce que ça doit être réalisable quand même hein, mais je me disais qu'avoir une interface qui s'adapte automatiquement, en plus d'être plus simple en terme de programmation, me semble plus ergonomique pour le joueur qui peut voir toutes les options d'un coup d’œil.
L'idée d'@Arlann d'utiliser un "TextWindowGUI" me semble bonne. À l'époque où je me penchais là dessus je n'avais rien compris à ce système, mais ça semble effectivement assez bien adapté à ton problème en fait. Ce tuto (en anglais mais ce n'est pas très important) devrait t'aider à le mettre en place en conservant ton interface (vu que tu sembles avoir compris le principe, peut-être même que tu pourras t'en passer) :
Je suis un peu déçu j'avais envie de faire du code. Du coup peut-être que je vais quand même essayer de réfléchir à cette histoire de scrolling.
_________________ Vous êtes déjà allés à Condate ? Ils ont un petit vin qui à un goût de pierre à catapulte. C'est Toutatis en culotte de velours si j'ose m'exprimer ainsi.
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 14:15
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 15:04
EDIT : exemple de code complet en bas du message
CookiewooD a écrit:
Kitai, j'ai tenté ta solution, les options de dialogue sont bien disposée là où je les attends mais ne sont pas clickable et la GUI de dialogue (gdial) que j'avais crée a disparu (il faut certainement l'appeler quelque part mais je ne sais pas où). Le fond est noir opaque.
Donc en gros tu peux reprendre exactement le code que j'ai posté plus haut, juste en remplaçant dialog_options_get_active par dialog_options_repexec et en ajoutant ça tout au début de la fonction dialog_options_mouse_click :
Code:
if (info.ActiveOptionID > 0) info.RunActiveOption();
Comme tu le dis par contre, il faut aussi manuellement afficher gdial. L'astuce, c'est de rendre le fond de la surface de dessin du dialogue personnalisé transparent. Pour ça, il suffit d'enlever le 0 dans info.Surface.Clear (0); et ça dessinera un fond transparent plutôt qu'un fond noir. Ensuite, tu peux mettre gdial.Visible = true; tout au début de la fonction dialog_options_render (assure-toi bien que gdial a les mêmes coordonnées et la même taille que ce que tu indiques pour info dans dialog_options_get_dimensions). Pour le moment, gdial resterait affiché "pour toujours" une fois que tu as lancé un dialogue (c'est-à-dire même après que le dialogue finit). Je te suggère donc d'ajouter ça tout au début de la fonction dialog_options_mouse_click :
Voilà, avec tout ça ça devrait le faire, je pense. Évidemment pour le moment ça gère le défilement par molette seulement, mais tu peux ajouter des boutons sur ton GUI si tu veux pour jouer avec decalageY.
EDIT : voilà le script que j'ai utilisé pour mes tests. Je l'ai ajouté dans un fichier script séparé (mais ça marcherait aussi dans le Global Script) et j'ai utilisé un jeu de résolution 320x200. Mon interface gGui1 a les mêmes dimensions et positionnement que info (230x40px, left: 0, top: 100) et ne contient aucun bouton ni rien.
Code:
int differenceHauteurs = 0; // vaudra hauteur de la fenetre GUI - hauteur totale du texte des options int decalageY = 0; // pixels de decalage vers le haut pour le texte des options
function dialog_request(int param) {
}
function dialog_options_get_dimensions(DialogOptionsRenderingInfo *info) { // Créer une zone d'options de dialogue 200x200 à (50,100) info.X = 0; info.Y = 100; info.Width = 230; info.Height = 40; }
function dialog_options_render(DialogOptionsRenderingInfo *info) { gGui1.Visible = true; info.Surface.Clear (); int i = 1, ypos = 0 - decalageY; // la premiere option s'affiche a 0 - decalageY // Rendre toutes les options activées while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { if (info.ActiveOptionID == i) info.Surface.DrawingColor = 14; else info.Surface.DrawingColor = 4; info.Surface.DrawStringWrapped (5, ypos, info.Width - 30, eFontFont0, eAlignLeft, info.DialogToRender.GetOptionText (i)); ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontFont0, info.Width - 30); } i ++; } // Dessin des boutons UP et DOWN info.Surface.DrawingColor = 30; info.Surface.DrawRectangle(205, 5, 215, 15); info.Surface.DrawRectangle(205, 25, 215, 35); info.Surface.DrawingColor = 0; info.Surface.DrawString(207, 7, eFontFont0, "^"); info.Surface.DrawString(207, 27, eFontFont0, "v"); differenceHauteurs = (ypos + decalageY) - info.Height; // ypos vaut maintenant la hauteur totale des options (-decalageY) }
function dialog_options_repexec(DialogOptionsRenderingInfo *info) { info.ActiveOptionID = 0; if (mouse.y < info.Y || mouse.y >= info.Y + info.Height || mouse.x < info.X || mouse.x >= info.X + info.Width) { return; // return if the mouse is outside UI bounds } int i = 1, ypos = 0 - decalageY; // prends en compte le decalage ici aussi // Trouver l'option qui correspond à l'endroit où le joueur a cliqué while (i <= info.DialogToRender.OptionCount) { if (info.DialogToRender.GetOptionState (i) == eOptionOn) { ypos += GetTextHeight (info.DialogToRender.GetOptionText (i), eFontFont0, info.Width - 30); if ((mouse.y - info.Y) <ypos) { info.ActiveOptionID = i; return; } } i ++; } }
function dialog_options_key_press(DialogOptionsRenderingInfo *info, eKeyCode keycode) { if (keycode == eKeyUpArrow && differenceHauteurs > 0 && decalageY < differenceHauteurs) decalageY += 5; // touche haut : on monte le texte si fenetre pas assez haute et si decalage max pas encore atteint else if (keycode == eKeyDownArrow && differenceHauteurs > 0 && decalageY > 0) decalageY -= 5; // touche bas : on descend le texte si fenetre pas assez haute et s'il reste du texte qui depasse par le haut
}
function dialog_options_mouse_click (DialogOptionsRenderingInfo *info, MouseButton button) { // Si souris est à droite des options de dialogue (au-dessus des boutons ^ / v) if (mouse.x-info.X >= 200 && mouse.x-info.X <= 220) { if (mouse.y-info.Y >= 0 && mouse.y-info.Y <= 20) decalageY -= (differenceHauteurs > 0 && decalageY > 0) * 5; // UP else decalageY += (differenceHauteurs > 0 && decalageY < differenceHauteurs) * 5; // DOWN if (decalageY < 0) decalageY = 0; } else if (info.ActiveOptionID > 0){ // Clic sur une option : lance la & efface gGui1 info.RunActiveOption(); gGui1.Visible = false; } }
_________________ Ga is Ga Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Dernière édition par Kitai le Mar 23 Oct 2018 - 15:44, édité 2 fois
CookiewooD Adepte de la Grande Tasse Bleue
Nombre de messages : 54
Age : 35
Localisation : Gard
Date d'inscription : 18/09/2018
Sujet: Re: Scrolling Down/Up pour dialogue Mar 23 Oct 2018 - 15:22
Pouah, tellement de solution qui s'ouvrent tout d'un coup
Merci beaucoup ! j'vais explorer tout ça et voir avec les collègues ce qu'elles préfèrent. Valoulef, tu marque un point, c'est vrai que c'est agréable d'avoir toute les options d'un coup d'oeil, je sais pas pourquoi je fais une fixette sur le scrolling.