filoulefilou Cliqueur Amateur
Nombre de messages : 359
Date d'inscription : 24/05/2010
| Sujet: Help: Ma fonction dit() version RPG qui bug Mer 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 ? |
|