Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le deal à ne pas rater :
Code promo Nike : -25% dès 50€ d’achats sur tout le site Nike
Voir le deal

 

 Le Say qui s'affiche lettre par lettre.

Aller en bas 
3 participants
AuteurMessage
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyLun 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 ?
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyLun 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 !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyLun 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.
Revenir en haut Aller en bas
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyLun 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 langue)

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.
Revenir en haut Aller en bas
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyMer 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.
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyMer 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 clin d'oeil

_________________
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 !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyMer 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 Le Say qui s'affiche lettre par lettre. 1507758844 alors bon...
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. EmptyMer 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 !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Contenu sponsorisé





Le Say qui s'affiche lettre par lettre. Empty
MessageSujet: Re: Le Say qui s'affiche lettre par lettre.   Le Say qui s'affiche lettre par lettre. Empty

Revenir en haut Aller en bas
 
Le Say qui s'affiche lettre par lettre.
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Lettre ouverte à Lucas Arts et aux autres éditeur de jeux...

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: