Posté le: 26/05/08 19:40 Sujet du message: Tout sur les chaines de caractères
I/ Introduction
(Pour ceux qui savent déjà ce qu'est une chaîne et un caractère, ils peuvent passer au paragraphe suivant.)
En Anglais, pour ceux qui ne le sauraient pas encore, 'String' signifie 'Corde' ou encore 'Chaîne'. Nous retiendrons la traduction 'Chaîne'.
En effet, quand vous tapez un mot, une phrase, ou encore un texte, ce n'est qu'une chaîne de caractères. Un caractère est une lettre, un signe de ponctuation, un espace, ou encore un signe. Par exemple, la chaîne 'Bonjour ! ><' se compose de douze caractères : B, o, n, j, o, u , r, !, >, <.
(/!\ Remarque : Un caractère minuscule n'égale pas un caractère majuscule ! Ainsi, 'B' ≠ 'b').
Retenez donc ceci de ce paragraphe :
Chaîne de caractère ou String : Suite de lettres, signes et espaces constituant un mot, une phrase, un texte, ou encore toute autre assemblage de caractères.
II/ Connaissances requises
-Comprendre les déclencheurs d'incrémentation de variable entière. (N'ayez pas peur du mot incrémenter : il signifie simplement augmenter de une unité une variable numérique. Ainsi, si on incrémente 1 de 1, on a 2...)
-Utilisation des variables
III/ Détails des fonctions en rapport avec des strings
a) String
Cette fonction est la plus basique, elle vous permet de taper directement le texte dans une petite boîte blanche précédée par le mot 'Valeur' prévue à cet effet.
b) Concatenate Strings & Convert Integer To String
Cette fonction est un peu plus évoluée que la précédente, tout en restant vraiment basique : elle vous permet "d'additionner" plusieurs chaînes de caractères. Ainsi, une expression telle que :
Bonjour j + e m'appelle Norbert
est identique à l'expression :
Bonjour je m'appelle Norbert
Mais attention, vous pourriez vous dire 'Mais à quoi ça sert si on peut déjà le faire en un seul string ?' Et là vous vous trompez. Elle sert très bien cette fonction, et est souvent utilisée dans des messages de quête pour indiquer un avancement numérique dans la quête.
Par exemple, la quête a pour exigence de ramasser sept oeufs. On voudrait donc afficher au joueur :
Warcraft III a écrit:
QUETE PRINCIPALE
- Ramasser sept oeufs (0/7 récoltés)
Mais vous n'allez pas faire un déclencheur pour chaque message, un pour 1/7, un autre pour 2/7 etc. Vous allez utiliser des variables de type Entier, car vous êtes très intelligent.
Créez votre variable et appelez-là NombreOeufs. Indiquez que son type est Entier, et que sa valeur initiale est 0. (Pour plus d'infos sur les variables en GUI, allez voir ici)
AIE, vous remarquez qu'il y a un hic... Si ce n'est pas le cas... Mais vous êtes aveugles ou quoi ? Je plaisante. EN effet, je viens de vous demander de créer une variable de type Entier et pas Chaîne... On va donc devoir recourir à une autre fonction : Convert Integer To String.
Celle-ci est très facile à comprendre : elle traduit un nombre en chaîne de caractères. Eh oui, pour un ordinateur, le chiffre 6 n'est pas égal au caractère '6'... Donc si on a une variable MaVariable contenant le nombre 128 965 478, elle est inutilisable tel quel pour une chaîne de caractère : vous ne la trouverez pas dans la liste déroulante des choix de variables. Par contre, si on utilise la fonction suivante :
Gui:
Trigger:
Quête - Display to (All players) the Quête mise à jour message: (String(MaVariable))
Comme il y a eu conversion de la variable en chaîne de caractères, c'est accepté par le jeu.
Capiche ?
Créez donc ce déclencheur :
Gui:
Trigger:
Incrementer et Afficher
Evénements
Unité - A unit owned by Joueur 1 (Rouge) Acquiert un objet
Conditions
(Item-type of (Item being manipulated)) Egal à Oeuf d'expérience
Actions
Set NombreOeufs = (NombreOeufs + 1) Quête - Display to (All players) the Quête mise à jour message: QUETE PRINCIPALE MISE A JOUR Quête - Display to (All players) the Conditions de quête message: ( - Ramasser sept oeufs ( + ((String(NombreOeufs)) + /7 récoltés)))
Comme vous pouvez le constater (oui, constatez-le si vous ne l'avez pas encore fait !), j'ai utilisé trois strings pour à la fin en afficher un seul.
Le premier, "- Ramasser sept oeufs (" sera la première partie du message. Le deuxième, ((String(NombreOeufs)), convertira le nombre contenu dans la variable NombreOeufs en chaine de caractère, et l'affichera à à l'écran. Donc si elle vaut 3, on a déjà : "- Ramasser sept oeufs (3". Le dernier string, "/7 récoltés", ferme le tout pour qu'on ne reste pas sur notre faim en lisant seulement une parenthèse et un chiffre.
Ainsi, à chaque fois qu'une unité appartenant au joueur 1 ramassera un oeuf, on affichera aux joueurs le nombres d'oeufs sur 7 déjà ramassés. Si NombreOeufs vaut 4, on nous affichera :
Warcraft III a écrit:
QUETE PRINCIPALE MISE A JOUR
- Ramasser sept oeufs (4/7 récoltés)
Et tout ça en seul déclencheur !
c) Substring
Cette fonction, encore un peu plus élaborée, vous permet de sélectionner seulement une partie de string. L'exemple donné par Blizzard comme explication est très explicite :
la fonction Substring("Les Grunts puent", 6, 8) retournera le string "run".
Warcraft III a écrit:
Substring(String, X, Y)
où String représente la chaîne de caractère en son entier ;
où X symbolise le numéro du caractère qui commencera la nouvelle chaîne de caractère résultante ;
où Y symbolise le numéro du caractère qui terminera la chaîne de caractère résultante ;
d) Conversion - Convert Integer To String
Je vous renvois plus haut pour cela :)
e) Conversion - Convert Real To String
Cette fonction vous permet d'afficher une variable de type Réel dans un string. Pour ceux qui n'ont pas écouté au cours, je refais un petit briefing :
2,4869 est un réel.
2/3 est un réel.
32,5 est un réel.
12 n'est PAS un réel.
2/4 n'est PAS un réel.
4,0000 est un réel.
Donc si vous avez bien compris, un réel est un nombre suivi d'une virgule et d'autres nombres, même si c'est 0. Je parle dans le jeu en tout cas, car en mathématiques, 4,0000 est un réel tout en étant un entier. Car l'ensemble des réels englobe celui des entiers... Vous suivez toujours ? Bon.
Il faut aussi ajouter une chose : Lorsque vous faites un calcul dans le jeu et voulez l'affichez, comme par exemple l'action :
Gui:
Trigger:
Partie - Display to (All players) the text: (String((1.00 / 3.00)))
Le jeu n'affichera pas 0,3, ni 0,3333333333333333333333..., mais bien 0,3333, donc le nombre ainsi que ses quatre premiers chiffres après la virgule. Si vous voulez afficher un nombre tel que 16 758,206099, le jeu affichera 16 758,2060. Et si vous voulez afficher un réel qui est aussi un entier tel que 4,00000000..., le jeu affichera quand même 4,0000, et pas 4.
f) Conversion - Convert Real To Formatted String
Cette fonction est plus intéressante. Elle agit à l'identique de la première, sauf que vous pouvez choisir le nombre de chiffre affiché à gauche de la virgule, et le nombre de chiffres affichés à droite de la virgule. Ainsi, une action telle que :
Gui:
Trigger:
Partie - Display to (All players) the text: (String((4.00 / 3.00), 1, 8))
On affichera 1 chiffre avant la virgule et 8 chiffres après la virgule. Cette action affichera donc 1,33333333.
g) Conversion - Convert Order To String
Comme son nom l'indique, cette fonction convertit un ordre en une chaîne de caractères. Donc si vous voulez afficher l'ordre actuel d'une unité donnée, vous ferez comme suit* :
Gui:
Trigger:
Partie - Display to (All players) the text: (Ordre actuel de l'unité : + (String((Current order of UnitéChoisie))))
* : J'ai utilisé en même temps la fonction Concatenate String vue plus haut.
h) Conversion - Convert Unit-Type To String
Comme son nom l'indique, cette fonction transforme en une chaîne de caractère le type d'une unité donnée. Pas de commentaires spéciaux.
i) Conversion - Convert Externalized String
En gui, tout string que vous tapez vous-même est automatiquement convertit en string extérieur.
C'est utile quand vous utilisez des strings extérieurs du fichier.
Les strings extérieurs ont été implantés pour une traduction facile tout en gardant le même map.
Le gui en utilise mais c'est inutile car dans le cas d'une map custom les strings extérieurs font partie de la map, et donc c'est la même chose pour tout le monde.
De plus ca rallonge le temps de chargement de la map et ca rend le code difficilement lisible une fois convertit en jass.
Et ca doit surement être plus lent à utiliser.
Par contre dans les maps mélée de blizzard, les strings extérieurs sont incorporés dans les archives mopaq (ou codés en dur).
Enfin en même temps ils ne s'amusent pas à afficher des textes autre que ceux indispensables au jeu.
Un anglais aura Footman pour le fantassin et un français Fantassin
On peut ainsi par exemple savoir en cours de partie en quelle langue a été installé warcraft.
j) Conversion - Convert String Case
Remet tout les caractères constituantla chaîne en minuscules.
k) Destructible - Destructible Name
Affiche le nom d'un destructible donné sous forme de chaîne de caractère.
l) Réponse Evénement - Entered Chat String
Cette fonction donne (on dit qu'elle 'retourne') à la lettre près et à la majuscule/minuscule près la chaîne de caractère envoyée par le biais du chat, en réponse à un évènement tel que "Joueur - Chat Message".
m) Matched Chat String
Cette fonction retourne la partie de la chaîne désignée dans un évènement, tel le déclencheur suivant :
Gui:
Trigger:
Afficher message Evénements Joueur - Joueur 1 (Rouge) types a chat message containing le as Une sous-chaîne Conditions Actions Partie - Display to (All players) the text: (Matched chat string)
Si le joueur rouge tape "aller", "le" s'affichera uniquement.
n) Saved-Game Filename
Cette fonction retourne à la lettre près et à la majuscule/minuscule près la chaîne de caractère qui nomme le fichié sauvegardé, en réponse à un évènement tel que "Partie - A Game Save".
o) Partie - Ability Name
Comme son nom l'indique, cette fonction affiche sous forme de chaîne de caractère le nom de la compétence spécifiée. Pas de commentaires spéciaux.
p) Partie - Ability Effect Art Path
Cette fonction retourne à la lettre près et à la majuscule/minuscule près la chaîne de caractère qui compose le chemin d'accès à un modèle d'effet. Vous pouvez aussi préciser de quel effet de la compétence vous cherchez le chemin, ainsi que son index (1 pour cible1 par exemple)
q) Partie - Ability Sound Name
Cette fonction retourne à la lettre près et à la majuscule/minuscule près la chaîne de caractère qui compose le chemin d'accès au son attaché à une compétence. Vous pouvez aussi préciser si vous voulez le chemin d'un son en boucle ou d'un son d'activation.
r) Cache du Jeu - Loading String Value
Cette fonction retourne le contenu d'un emplacement de type String depuis le cache d'un jeu. Si le nom de l'emplacement du string à charger (on dit l'"adresse") n'est pas trouvé, la fonction ne fait pas planter le jeu mais charge une chaîne vide.
s) Héros - Hero Proper Name
Cette fonction retourne le nom propre (PAS le type) d'un héros donné.
t) Objet - Item Name
Cette fonction retourne le nom d'un objet donné.
u) Multitable - Multiboard Title
Cette fonction retourne le titre actuel d'une multitable donnée.
v) Joueur - Player Name
Cette fonction retourne le nom du joueur. Elle est très fréquemment utilisées dans les TD et autres scénarios spéciaux en ligne pour afficher le nom du joueur sur une multitable ou un panneau de commande.
w) Déclencheur - Trigger Name
L'interface gui génère un string en fonction du nom du déclencheur dans lequel se trouve cette action.
Autrement dit si le déclencheur s'appelle Mon Trigger, le string utilisé sera "Mon Trigger".
Très utile pour débugger.
x) Unité - Unit Name
Cette fonction retourne le nom actuel d'une unité. Je ne crois pas qu'il y a de différence entre une action telle que :
Gui:
Trigger:
Partie - Display to (All players) the text: (Name of CetteUnité)
et
Gui:
Trigger:
Partie - Display to (All players) the text: (String((Unit-type of CetteUnité)))
Si ce n'est qu'elle prendra moins de temps à s'exécuter, car c'est une seule fonction au lieu de plusieurs.
IV/ Conclusion
Et voilà, vous savez désormais tout (ou presque) sur les strings !
Et pour les retardés, je précise ici qu'il peuvent arrêter de se tourmenter, en se demandant pourquoi je dis une fois string, une fois chaîne, une fois chaîne de caractères : String = Chaîne = Chaîne de caractères...
Bon vent ! _________________
Dernière édition par The Shadow of Death le 02/06/08 19:10; édité 7 fois
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 27/05/08 12:59 Sujet du message:
Très bien fait ce tuto. T'explique vraiment bien, mais bon... Est-ce que quelqu'un pourrait faire un tuto sur les "Convert ... into..."
J'ai eu quelques menus emmer..ments dans un sort que j'ai voulus créer. Merci. _________________
Très bien fait ce tuto. T'explique vraiment bien, mais bon... Est-ce que quelqu'un pourrait faire un tuto sur les "Convert ... into..."
J'ai eu quelques menus emmer..ments dans un sort que j'ai voulus créer. Merci.
Cela arrive, mais je n'ai pas pu l'écrire tout d'un coup ^^ _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 27/05/08 18:15 Sujet du message:
Quelques erreurs de frappe et d'orthographe, dont je te laisse le bonheur de les trouver
Une autre erreur mineur tu as oublié de remplacer les caractères spéciaux par leur accent :
si tu veux y'a jass shop pro qui le fait pour toi (passer de la norme UTF-8 à ASCII et inversement)
i) Conversion - Convert Externalized String
C'est assez compliqué à expliquer.
Tout d'abord ce que tu as dit est faux.
En gui, tout string que tu tapes toi même, est automatiquement convertit en string extérieur.
C'est utile quand tu utilises des strings extérieurs du fichier.
Les strings extérieurs ont été implantés pour une traduction facile tout en gardant le même map.
Le gui en utilise mais c'est inutile car dans le cas d'une map custom les strings extérieurs font partie de la map, et donc c'est la même chose pour tout le monde.
De plus ca rallonge le temps de chargement de la map et ca rend le code difficilement lisible une fois convertit en jass.
Et ca doit surement être plus lent à utiliser.
Par contre dans les maps mélée de blizzou les string extérieurs sont incorporés dans les archives mopaq (ou codés en dur).
Enfin en même temps ils ne s'amusent pas à afficher des textes autre que ceux indispensables au jeu.
Y'a pas de display text message ...
un anglais aura Footman pour le fantassin et un français Fantassin
on peut ainsi par ex savoir en cours de partie en quelle langue a été installée warcraft.
En espérant que tu ais compris
m) Matched Chat String
Gui:
Trigger:
test
Evénements
Joueur - Joueur 1 (Rouge) types a chat message containing le as Une sous-chaîne
Conditions
Actions
Partie - Display to (All players) the text: (Matched chat string)
si le joueur rouge tape "aller", "le" s'affichera
x) Unité - Unit Name
Le résultat est identique mais autant utiliser la première, moins de fonctions appelées, donc plus rapide et aussi à coder de toute façon.
Conclusion :
Joli tuto pour les débutants, quelques erreurs à corriger et il sera idéal
PS : Pourquoi cacher cette phrase : Pour ceux qui savent déjà ce qu'est une chaîne et un caractère, ils peuvent passer au paragraphe suivant.
Je la mettrais plutôt en évidence _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 28/05/08 16:21 Sujet du message:
w) Déclencheur - Trigger Name
en fait ce n'est pas une fonction, c'est l'interface gui qui génère un string en fonction du nom du déclencheur dans lequel se trouve cette "action", ce n'est donc utilisable qu'au sein même du déclencheur.
C'est d'ailleurs en gui, les seuls strings non extérieurs
ex :
Gui:
Trigger:
myTrigger Evénements Conditions
Actions
Partie - Display to (All players) the text: (Name of the current trigger)
Je parle dans le jeu en tout cas, car en mathématiques, 4,0000 n'est pas un réel mais bien un entier.
Je me trompe peut-être (ça fait longtemps) et je cherche la petite bête c'est sûr, mais il me semble que 4,000 est certes un entier mais c'est aussi un réel, puisqu'un réel c'est un nombre compris dans l'intervalle [-infini ; +infini] _________________
... en effet tu as raison. On a l'ensemble des réels qui englobe l'ensemble des entiers... Donc un entier est un réel... Mais unréel n'est pas forcéement un enier. Je vais changer ca.
PS :TrollBarin, j'ai déjà changé les trucs que tu m'as dit _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 28/05/08 19:05 Sujet du message:
The Shadow of Death a écrit:
... en effet tu as raison. On a l'ensemble des réels qui englobe l'ensemble des entiers... Donc un entier est un réel... Mais unréel n'est pas forcéement un enier. Je vais changer ca.
PS :TrollBarin, j'ai déjà changé les trucs que tu m'as dit
TrollBarin omfg
Sauf que c'est pas encore exact
allez après manger je te dirais quoi écrire pour corriger _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2, 3Suivante
Page 1 sur 3
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum