Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  

 

 Help: Ma fonction dit() version RPG qui bug

Aller en bas 
AuteurMessage
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Help: Ma fonction dit() version RPG qui bug Empty
MessageSujet: Help: Ma fonction dit() version RPG qui bug   Help: Ma fonction dit() version RPG qui bug EmptyMer 1 Fév 2023 - 14:02

Bonjour,
bon, j'vais pas raconter ma life, mais disons que pour m'occuper le cerveau pendant mon temps libre et un peu et soigner un peu mon addiction aux mots fléchés, je code. Ca fait un moment que je me dis que AGS serait aussi un bon logiciel pour faire des RPG, mais j'voudrais bien développer des fonctions qui ne sont pas de base dans le moteur. Je trouve que la fonction say() est limitée car on ne peut pas écrire en différente couleur, ni même ajouter du texte en gras ou en italique.
Et je voulais aussi que le texte une fois dit soit stocker dans un Gui Label, afin de pouvoir tout relire, comme dans les RPG enfait.
Alors, j'ai eu l'idée (un peu folle) de coder ma propre version de Say, que j'ai nommé dit, lol.

Pour le moment, j'ai le code suivant.



Code:


//la fonction qui transforme du texte pour y afficher à la place la variable.

String variableToString(this String*){
  


 
  
  
  int value1 = 0;
    int value2 = 0;
  String tps;
  
  //nom obj
  if(this.StartsWith("object_"))
  {
    
    value1 = Game.InventoryItemCount;
    
    
     for(int a = 1 ; a <value1  ; a++) {
      
      
       tps = String.Format("object_%d",a);
      
            
      if(this == tps)  {nom_variable = inventory[a].Name; }
     Wait(1);
                     }
    
 
  }
 
  //
  
  //
  
  else if((this.StartsWith("cha"))||(this.StartsWith("player")))
  
  {
      
    value2 = Game.CharacterCount;
    
     for(int b = 0 ; b < value2 ; b++) {
      
      
       tps = String.Format("character%d.Name",b);
      
      if(this == tps)  nom_variable = character[b].Name;
      else if (this == "player.Name") nom_variable = player.Name;
       Wait(1);
                     }
    
     }
  
 


else  { nom_variable = String.Format("%s est INVALIDE", this);}

 

 
 return nom_variable;
  
}


function dit(this Character*,   String message)  {

 
    
///le texte qui est dit par le joueur////
////////////////////////////////////////////////////////////
  // /!\ la police utilisée ici est une font importée.
  //font de base
  Game.NormalFont = eFontFont0;
  //eFontFont1 = gras
  //eFontFont2 = italique
  
  //la couleur de base est celle du PJ qui parle
  int couleur_base = this.SpeechColor;
  
  int couleur_rouge = 55328;
  int couleur_grise = 50712;
  int couleur_bleue = 9528;

  DynamicSprite*sprite = DynamicSprite.Create(Screen.Width, Screen.Height);
  DrawingSurface*surface = sprite.GetDrawingSurface();

    // Définissez la couleur de dessin
  surface.DrawingColor = couleur_base;
  

  
  //code pour lire les balise de variables.
  
String variable_tps = "";
int n = 0;
while (n < message.Length) {
  if (message.Substring(n, 2) == "s#") {
    int j = n + 2;
    variable_tps = "";
    while (j < message.Length && message.Substring(j, 1) != "#") {
      variable_tps= variable_tps.Append(message.Substring(j, 1));
      j++;
    }
    if (j < message.Length) {
      variable_tps.variableToString();
  
      message = message.Replace(variable_tps, nom_variable);
      
      n =  j + 1;
    }
  }

  n++;
}
      message = message.Replace("s#","");
      message = message.Replace("#","");
      
  //fin de la mise en variable//    
  //////////////////////////////    
  
  
  //La particularité de ma version de this.say,
  //c'est que le dialogue s'inscrit sur un gui, c'est la solution la plus simple pratique que j'ai trouvé
  
   if(!gbulle.Visible) {
                    gbulle.Visible = true;
                    gbulle.BackgroundGraphic = sprite.Graphic;
                    gbulle.Width = Screen.Width;
                    gbulle.Height = Screen.Height;
                     gbulle.X = 0;
                    gbulle.Y = 0;
                                    
  }
  
  
  
  
  
  
  
    // GetTextWidth pour déterminer la largeur du message
  int messageWidth = GetTextWidth(message, Game.NormalFont);
  
  // GetTextHeight pour déterminer la hauteur d'une lettre
  String L = "AZERTYUIOPQSDFGHJKLMWXCVBN?./§!&123456789";
  int messageHeight = 24; //taille d'import des Fonts
  //GetTextHeight(L, Game.NormalFont, L.Length);
  


  
  //////////////Les variables pour avoir la taille du personnage qui parle ////
  ViewFrame *frame = Game.GetViewFrame(this.View, this.Loop, this.Frame);
  int this_sprite_Height = Game.SpriteHeight[frame.Graphic];
  int this_sprite_Width = Game.SpriteWidth[frame.Graphic];
  /////////////////////////////////////////////////////////////////////////////
  
  
    
    
    ////Position du message ////
  int x, y;
  int message_Length_max = Screen.Width / 3;
    
  int x_offset = 0; // prend en compte le décalage pour afficher les lettres une par une, et non pas l'une sur l'autre
  int y_offset = 0; // permet d'aller à la ligne
  
 

  if (messageWidth <= message_Length_max) {
   x = this.x - (messageWidth / 2);
    } else {
    x = this.x - message_Length_max / 2;
    }
          
  
    y = this.y - this_sprite_Height - messageHeight ;

    
    
    int current_color = couleur_base; // définir la couleur par défaut

  
      
      
      
  //La boucle pour donner l'effet des lettres qui apparaissent une par une.
 
  for (int i = 0; i < message.Length; i++) {
    String letter = message.Substring(i, 1);
   int letterWidth = GetTextWidth(letter, Game.NormalFont);
  
  
      if (x_offset + letterWidth > message_Length_max) {
        // Rechercher l'espace le plus proche
        String subString = message.Substring(i, 1);
      
      

        int spaceIndex = subString.IndexOf(" ");
      
        
        if  (spaceIndex == -1){
      
        x_offset = 0;
        y_offset -= messageHeight;
    } else {
        x_offset += letterWidth;
        i += spaceIndex;
    }
  
   }
 
    //les couleurs//
          
     if (letter == "{") { // vérifier si c'est une balise d'ouverture
        if (message.Substring(i + 1, 1) == "r") {
            Game.NormalFont = eFontFont0;
            current_color = couleur_rouge; // changer la couleur en rouge
            i++; // sauter le caractère suivant
        } else if (message.Substring(i + 1, 1) == "g") {
            Game.NormalFont = eFontFont2; //italique
            current_color = couleur_grise; // changer la couleur en gris
            i++; // sauter le caractère suivant
        } else if (message.Substring(i + 1, 1) == "!") {
            Game.NormalFont = eFontFont1; //gras
            i++; // sauter le caractère suivant
            
        } else if (message.Substring(i + 1, 1) == "b") {
            current_color = couleur_bleue; // changer la couleur en bleu
            Game.NormalFont = eFontFont0;
            i++; // sauter le caractère suivant
        }
    } else if (letter == "}") { // vérifier si c'est une balise de fermeture
        current_color = couleur_base; // changer la couleur par défaut
        Game.NormalFont = eFontFont0;
    } else {
        surface.DrawingColor = current_color;
    
 
    surface.DrawString(x+x_offset, y-y_offset, Game.NormalFont, letter);
    gbulle.BackgroundGraphic = sprite.Graphic;
    x_offset += letterWidth;
  
    
 
    
    Wait(2);
    
    }
    
  
}
 
  
  // Je libère la surface de dessin
  surface.Release();
  
  // Attendre que l'utilisateur appuie sur une touche avant de continuer
  
  WaitKey(100);
  
  gbulle.Visible = false;
  sprite.Delete();
  
 
  ///fin du texte lu et affiché//////
  
  
  /////////////////////////////////////////////
  //////////La Mise en cadre/////////////////
  
    String memory_txt = Label1.Text;
  
    
    if(!gCadre_memo_txt.Visible) gCadre_memo_txt.Visible = true;
    
    String msg = "[ -" ;
    msg = msg.Append(this.Name);
    msg = msg.Append(" : ");
    

for (int i = 0; i < message.Length; i++) {
    String letter = message.Substring(i, 1);  
    if (letter == "{") {
      msg = msg.Append("*");
    }
    else if (letter == "r" || letter == "g" || letter == "!" || letter == "b") {
        if (i > 0 && message.Substring(i - 1, 1) != "{") {
            msg = msg.Append(letter);
        } else {
            msg = msg.Append(""); // ignorer la couleur si elle est collée à la balise d'ouverture
        }
    }
    else if (letter == "}"){
        msg = msg.Append("*");
    }
    else {
        msg = msg.Append(letter);
    }
}

memory_txt = memory_txt.Append(msg);
Label1.Height = GetTextHeight(memory_txt, Game.NormalFont,Label1.Width);
Label1.Text = memory_txt;



Slider_memo_txt.Max = Label1.Height;
 
///////////Fin de la mise en cadre//////////////
}

J'ai plusieurs problèmes insolubles. Déjà, quand je mets trop de balise s#Variable# parfois, il me saute des variables et aussi, mon retour à la ligne ne fonctionne pas bien, car il coupe le mot après la première lettre d'un mot.

ca donne un truc comme ça :

Le maudit texte se c
oupe comme ça

Vous auriez des idées pour corriger ça ?
Revenir en haut Aller en bas
 
Help: Ma fonction dit() version RPG qui bug
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Résolu] Différences entre la version Run et version .exe
» AGS en français
» version sur propriété
» LibreMotus
» Question sur la derniere version d'AGS

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: