|
| Le Say qui s'affiche lettre par lettre. | |
| | Auteur | Message |
---|
filoulefilou Cliqueur Amateur
Nombre de messages : 359
Date d'inscription : 24/05/2010
| Sujet: Le Say qui s'affiche lettre par lettre. Lun 2 Mar 2020 - 18:46 | |
| Bonjour les amis, Alors vous n'êtes pas sans savoir que pour des raisons d'ergonomie, l'on préférera toujours lire un texte qui défile, plutôt qu'un pavé de texte qui s'affiche. Je ne me souviens plus trop la raison, mais y'a un lien entre le mouvement , le rythme de lecture et l'attention du lecteur. Bref , de là, j'ai naturellement pensé a un système du genre. Voici ce que j'ai codé (en résumé) : - Code:
-
function Parle(this Character*, String msg) {'
int Total_letter = msg.Length; String d_text; String msg_vierge = "";
int i = 0; while( i < Total_letter) {
d_text = String.Format("%c",msg.Chars[i]); msg_vierge = msg_vierge.Append(d_text); this.Say(msg_vierge); // on_key_press(eKeySpace);// i++; }
}
Donc, ça fonctionne, cependant j'ai un problème de rythme, c'est trop lent a s'afficher. Voilà pourquoi j'ai eu l'idée d'ajouter on_key_press(eKeySpace); a ma boucle, car le jeu permet de passer un dialogue en pressant Space, malheureusement, ça ne fonctionne pas. Le problème doit venir du fait que Say sont des fonctions bloquantes...? Une idée ? |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Lun 2 Mar 2020 - 19:37 | |
| Essaye plutôt d'utiliser SayBackground et contrôle la durée en jouant avec Wait (ou WaitKey si tu veux laisser l'option de passer en appuyant sur une touche ?) _________________ 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: Le Say qui s'affiche lettre par lettre. Lun 2 Mar 2020 - 19:45 | |
| J'ajoute que, on le sait pas toujours, mais tu peux augmenter le nombre de cycles par secondes de ton jeu en ajoutant une instruction SetGameSpeed dans ton game_start. Ça permettra d'accélérer la vitesse de défilement si tu trouves ça toujours trop lent (à utiliser dans des limites raisonnables surtout pour les PCs les moins puissants). Évidemment si tu utilises des wait(40) pour laisser passer une durée d'une seconde, il faudra modifier la valeur en fonction. _________________ 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.
|
| | | filoulefilou Cliqueur Amateur
Nombre de messages : 359
Date d'inscription : 24/05/2010
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Lun 2 Mar 2020 - 23:34 | |
| Merci les amis pour votre réactivité. Je ne suis pas trop trop fan des SayBackground car parfois ça a tendance a se chevaucher durant un dialogue et je ne maîtrise pas toujours le sujet, notamment le texte qui reste affiché même après la fin du dialogue... Bref, au final, j'ai décidé de faire un GUI tout simple, avec un Label dedans et j'affiche le texte lettre par lettre dans le label. Je conclue par ma boucle par un WaitMouseKey(400); des familles et voili, j'ai un truc plutôt propre je trouve. Je peux mettre le code ici, c'est assez niveau débutant, mais sait-on jamais, si des gens veulent s'en inspirer pour pondre un module (je ne vise personne ) - Code:
-
FontType SpeechPolice;
////////////////////////////////////// int Total_letter; String msg_vierge; int memory_height;
function Parle(this Character*, String msg){
SpeechPolice = Game.SpeechFont;
int Width_reel_mem; int Height_reel_mem;
int MaxTxt = 1000; int Width_msg = GetTextWidth(msg,SpeechPolice); int maxHeight = GetTextHeight("ABCDEFGHIJKLMNOP!?;+",SpeechPolice, Width_msg);
//J'ai envie d'avoir un GUI qui adapte sa taille en fonction du texte, je trouve ça plus jolie// if(Width_msg > MaxTxt) { int cut = MaxTxt; int height = maxHeight; while(cut > 1) { cut = (cut+1) >> 1; height = GetTextHeight(msg, SpeechPolice, MaxTxt-cut); if(height == maxHeight) MaxTxt -= cut; }
height = GetTextHeight(msg, SpeechPolice, MaxTxt-1); Width_reel_mem = MaxTxt; Height_reel_mem = height + 24 + 24; } else {Width_reel_mem = Width_msg; Height_reel_mem = maxHeight + 24 + 24; }
int decal_y = 0; decal_y = Height_reel_mem;
gMSG.Width = Width_msg+24+24; //Mon GUI pour afficher le text gMSG.Height = Height_reel_mem ; Lmsg.Height = Height_reel_mem;//Le Label text de mon GUI Lmsg.Width = Width_msg+30;
Lmsg.Y = (gMSG.Height/2)-(Lmsg.Height/4);
Overlay* myOverlay; Overlay*mytxtOverlay;
Total_letter = msg.Length; String d_text; msg_vierge = "";
int Ecart = (this.y - Sprite_height(this)) - GetViewportY(); //Sprite_height(character) est une fonction perso pour avoir la taille d'un sprite d'un personnage.
if((this.x - GetViewportX()) < 1920/2) { myOverlay = Overlay.CreateGraphical(130-129,60+Ecart, PNJ[this.ID].sprite_portrait, true);//fonction perso mytxtOverlay = Overlay.CreateTextual(130-120, 20+Ecart , 1000, eFontFont1, 64800, PNJ[this.ID].name);//Fonction perso gMSG.X =130; gMSG.Y = 60+Ecart; gMSG.Visible = true;
int i = 0; while( i < Total_letter) {
d_text = String.Format("%c",msg.Chars[i]); msg_vierge = msg_vierge.Append(d_text); Lmsg.Text = String.Format("%s",msg_vierge); i++; if(i < Total_letter) Wait(5); } WaitMouseKey(400); gMSG.Visible = false;
myOverlay.Remove(); } else { myOverlay = Overlay.CreateGraphical(1200-129,60+Ecart , PNJ[this.ID].sprite_portrait, true); //Fonction perso pour avoir le Sprite portrait du PNJ mytxtOverlay = Overlay.CreateTextual(1200-120, 20+Ecart, 1000, eFontFont1, 64800, PNJ[this.ID].name); //Fonction perso pour avoir le nom réel du PNJ
gMSG.X =(1000-170)-Width_reel_mem; gMSG.Y = 60+Ecart; gMSG.Visible = true;
int i = 0; while( i < Total_letter) {
d_text = String.Format("%c",msg.Chars[i]); msg_vierge = msg_vierge.Append(d_text); Lmsg.Text = String.Format("%s",msg_vierge);
i++; if(i < Total_letter) Wait(5); } WaitMouseKey(400); gMSG.Visible = false;
myOverlay.Remove();
}
}
}
PS: Au passage, je me suis inspiré d'un de tes codes pour calculer la taille d'un texte (notamment sa hauteur) en fonction d'une zone de texte limité en largeur. |
| | | filoulefilou Cliqueur Amateur
Nombre de messages : 359
Date d'inscription : 24/05/2010
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Mer 4 Mar 2020 - 10:47 | |
| Bon, y'a des bug dans la version que j'ai proposé (des trucs mineurs d'affichage du Gui notamment) mais le principe fonctionne, si ça intéresse, je pourrais faire une version au propre. |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Mer 4 Mar 2020 - 16:07 | |
| Ouais j'ai regardé un peu ton code et j'avoue que j'ai des doutes concernant ta boucle while sur cut (ça m'a pris un moment de comprendre ce que tu faisais avec le bitwise shift à droite, mais en fait c'est grosso-modo une division par deux, c'est ça ?). Étant donné que ce bout de code se trouve au sein d'un if (Width_msg > MaxTxt), y'a aucune chance que forcer une largeur encore plus serrée pour le texte te donne une hauteur égale à la hauteur occupée par une seule ligne ( maxHeight), puisque tout ce que resserer la largeur risque de te donner c'est des lignes supplémentaires (et donc autant de hauteur excédant maxHeight). Au final donc, ton if(height==maxHeight) sera jamais satisfait (à part peut-être à la toute fin quand cut vaudra 1) et tu changeras jamais la valeur de MaxTxt (ce qui était pourtant tout le principe de cette boucle while si je comprends bien). En tout cas tu m'auras bien fait plancher sur ce code _________________ 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 ! |
| | | filoulefilou Cliqueur Amateur
Nombre de messages : 359
Date d'inscription : 24/05/2010
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Mer 4 Mar 2020 - 18:45 | |
| Le principe, grossomodo, je vais définir une taille Max en largeur ( pour définir la taille max de mon text_box, afin d'éviter que le texte ne dépasse). Ensuite, la Taille Max +1 est donc la valeur a partir d'où le texte se coupe (cut). Je lui demande de calculer la longueur du texte totale, a chaque fois que ça dépasse Cut , tu ajoutes 1 a cut et tu retires une ligne complète au texte, puis tu continues jusqu'a ce que le texte restant( moins les lignes enlevés) est plus petit ou égal au a la taille MAX en largeur. Le nombre de cut va me permettre de déterminer la hauteur du texte (Nombre de Retour a la ligne * la hauteur de mes lettres selon ma Police. ) J'ai faux ? Hm... Je ne me souviens même plus de quand j'ai pondu ce code et a la lecteur, je le trouve un poil complicado. Je ne me suis pas replongé dessus car ça fonctionne alors bon... |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Le Say qui s'affiche lettre par lettre. Mer 4 Mar 2020 - 19:14 | |
| Ah oui non là le code posté va pas faire ça avec cut. Regarde la ligne 36 : cut = (cut+1) >> 1;Est-ce que c'est vraiment ce que tu as dans ton code ? Parce que ça ça ajoute 1 à cut mais ça fait un bitwise-shift à droite d'un cran immédiatement après (ce qui correspond peu ou prou à une division par deux). Aussi si tu veux "retirer une ligne complète au texte" il me semble qu'il devrait y avoir un Substring ou une méthode du genre quelque part dans ta boucle qui contient cut, non ? _________________ 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 ! |
| | | Contenu sponsorisé
| Sujet: Re: Le Say qui s'affiche lettre par lettre. | |
| |
| | | | Le Say qui s'affiche lettre par lettre. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |