Cours de Scripts pour les Quiches. Leçon Deux.

Répondre
Partager Rechercher
Par Celowin mailto:james.foxglove@verizon.net
traduit par Amaranthe mailto:amaranthe@free.fr

Introduction
Le but de cette série de leçons, est d'apprendre a se servir des scripts a n'importe qui. Cette deuxième leçon porte sur les variables. Il est toujours possible de trouver la première leçon <a href = «https://forums.jeuxonline.info/showthread.php?t=101346 »>ici</a>

Cette leçon risque d’être un peu plus longue que la précédente. Les concepts abordés sont également un peu plus complexes. Si ma manière de présenter les choses n’est pas assez claire, n’hésitez pas a posez des questions. Partez toujours du principe que pour une personne qui pose la question, il y en a cinq qui attendent la réponse.

Modifions donc notre module de test. Ouvrez le dans l’éditeur.
Cliquez droit sur le npc que nous avions crée. Choisissez propriétés et allez dans l’onglet des scripts.

Nous allons cette fois ci écrire deux petits scripts.

Le premier va dans le « OnSpawn »

Code PHP:

void main()
{
  
SetLocalInt(OBJECT_SELF“CHANTEUR_COUNT”0);

Sauvegardez le en tm_chanteur_os ( « os » pour « OnSpawn » )
Bien, même si ce script ne fait qu’une seule ligne, il est du genre a faire fuir la plupart des gens qui n’ont pas l’expérience de la programmation. Essayons donc d’expliquer un peu avant de s’attaquer au script réel.

Premièrement, remarquez que ce script est placé dans le « OnSpawn ». Ce qui signifie qu’il ne sera exécuté qu’une seule fois, lorsque le npc apparaît pour la première fois dans le jeu. C’est donc l’endroit idéal pour initialiser des choses, et c’est justement ce que nous cherchons a faire.

Cette ligne définit une variable. Souvenez vous de vos cours de math, qu’est ce qu’une variable ? Une lettre qui représente un nombre. C’est a peu près la même chose ici, mis a part qu’au lieu d’utiliser une simple lettre, nous lui donnons un nom.

La commande SetLocalInt est une fonction que sert a définir une variable. Elle nécessite trois paramètres, séparés par des virgules.
- Le premier est ce a quoi la variable va être attachée.
- Le second est le nom que nous voulons donner a la variable.
- Le troisième est la valeur que nous voulons mettre dans la variable.

J’espère que vous avez compris que nous voulions créer une variable, nommée CHANTEUR_COUNT et que nous voulions lui donner la valeur 0. Le premier paramètre nécessite un peu plus d’explications.

Tout ou presque dans un module, est un objet ( object ). Les npcs sont des objets, les Placeables sont des objets. Même les pcs eux mêmes sont des objets. Avec tant et tant d’objets dans un module, il est vital de savoir s’y retrouver et de toujours savoir duquel on parle.

OBJECT_SELF est un des moyens les plus pratique de se référer a un objet. Comme vous pouvez le deviner, il fait référence a l’objet qui l’appelle. Dans notre cas, notre script est attaché a un npc, donc OBJECT_SELF est ce npc. Aussi simple que cela.

Nous avons donc, par le truchement de cette simple ligne, définis une variable nommée CHANTEUR_COUNT, qui a pour valeur 0. Cette variable étant attachée au npc CHANTEUR.

Il est intéressant aussi de noter que le Int de SetLocalInt est pour « Integer » ce qui veut dire Entier. C’est a dire un nombre entier. Nous aurions pu mettre 2, 15 et même –7 mais pas 3,8 par exemple.

Le deuxième script maintenant. Nous allons écraser le « OnHeartbeat » de notre première leçon.

Code PHP:

int nCount=GetLocalInt(OBJECT_SELF"CHANTEUR_COUNT");
void main()
{
    
nCount nCount+1;
    
ActionSpeakString("J’ai parle "+IntToString(nCount)+" fois.");
    
SetLocalInt(OBJECT_SELF"CHANTEUR_COUNT"nCount);

Sauvegardez le, gardez le nom tm_singer_hb.

Avant que j’explique, regardez donc ce que fait ce script. Fermez la fenêtre de script. Cliquez sur Ok pour le npc, et sauvegardez le module. Lancez le module de test et regardez comment se comporte votre chanteur.

C’est votre premier script avec quelque chose d’écrit avant le void main() et cela mérite donc d’être signalé. Ceci est appelé la phase d’Initialisation du script. Nous parlons ici des choses auxquelles le script va se référer. Contrairement a la variable locale que nous avons défini précédemment, ce nCount n’aura d’existence que le temps que ce script tourne. Des que ce script sera terminé, nCount n’existera plus. C’est pour cette raison que ces variables sont nommées « Temporaires ».

Remarquez combien de fois nous utilisons nCount dans notre fonction, et imaginez combien cela serait long et déroutant si nous devions a chaque fois réécrire a la place quelque chose comme GetLocalInt(OBJECT_SELF, "CHANTEUR_COUNT").

Pour ce qui est du nCount. A chaque fois que vous déclarez une variable temporaire, la première lettre est un tag qui sert a déterminer le type de valeur que cette variable peut prendre. Ce n’est nullement obligatoire, c’est simplement une convention. N est ici mis pour Integer. Quelque soit le nom que vous donnez a votre variable, vous savez qu’elle va contenir un Integer.

Les « int » signifie donc que nous définissons une variable de type integer, le « = » signifie que nous allons lui donner une valeur et le GetLocalInt récupère la valeur de la variable CHANTEUR_COUNT.

Notez au passage la similarité entre les fonctions SetLocalInt et GetLocalInt.

Cette première ligne crée donc une variable temporaire nCount, que notre script va pouvoir utiliser, et lui assigne la valeur de CHANTEUR_COUNT stockée au niveau de notre npc. Donc la première fois que le script est appelé, nCount vaut 0. Puisque c’est ce que nous avons initialisé dans notre script « OnSpawn ».

Je sais que cela fait beaucoup d’explication pour une simple ligne de code. Et je me doute que beaucoup ne comprendrons pas du premier coup. Relisez et si cela n’est toujours pas clair, attendez de l’avoir utilisé deux ou trois fois et vous verrez alors…

Voyons maintenant le corps du script et décortiquons le.

nCount = nCount+1;

Cela ne fait que prendre notre variable temporaire et lui ajouter 1. Il suffit de lire : Affectez a la variable nCount le contenu de la variable nCount + 1.

Si nCount vaut 9, alors après cette ligne, elle vaudra 10.

( Il est également possible d’écrire cela : nCount++ ;
le ++ est l’incrément de 1. C’est parfait une fois que l’on y est habitué, mais au début c’est généralement assez déroutant. )

La deuxième ligne est une commande connue : ActionSpeakString. Par contre le paramètre demande peut être explication. Il est composé de trois parties, séparées par des +. Lorsqu’on l’applique a des chaînes de caractères ( String ) le + sert a la concaténation. Par exemple :
« Ceci est une String » est équivalent à : « Ceci est » + « une String ».

Cela n’a que peu d’intérêt écrit comme cela, mais prends tout son sens quand on regarde la partie du milieu de l’expression : IntToString(nCount).
Ce qui fait exactement ce que ça veut dire. nCount est un integer, et cela transforme sa valeur en une chaîne de caractère de façon a ce qu’elle puisse être concaténée et utilisée par la commande ActionSpeakString.

Vous devriez maintenant facilement comprendre la dernière ligne. Cela ne fait que stocker la nouvelle valeur de nCount dans notre variable locale. Si nous voulons que cette variable soit réutilisée, il faut stocker sa valeur. Rappelez vous que nCount n’existera plus une fois que vous serez sortis de la fonction.

Amaranthe.
merci beaucoup encore pour tout ce boulot
c bien qu il y ai des gens comme toi
ca prouve que la communauté fr bougent et tente d 'avancer

encore bon boulot
Unhappy
quand je rentre le premier script de cette page j ai un message d erreur sur la ligne:
SetLocalInt(OBJECT_SELF, “CHANTEUR_COUNT”, 0);

le message dit que j utilise une variable non definie...
ayant fait un peu de C et de php j ai reussi a faire marcher le script en rajoutant une ligne au script:

void main ()
{
int CHANTEUR_COUNT=0;
SetLocalInt(OBJECT_SELF,"CHANTEUR_COUNT",0);
}

Vala j espere que ca pourra servir a quelqu un qui se trouve dans le meme cas que moi.
Sinon c est tres bien de faire cette aide. pour quand la suite?
Tres bien faits ces tuts!!

Je suppose que c'est donc avec cette meme technique que l'on peut implémenter le nom du joueur dans la conversation!
Citation :
Provient du message de Grunk
quand je rentre le premier script de cette page j ai un message d erreur sur la ligne:
SetLocalInt(OBJECT_SELF, “CHANTEUR_COUNT”, 0);

le message dit que j utilise une variable non definie...
ayant fait un peu de C et de php j ai reussi a faire marcher le script en rajoutant une ligne au script:

void main ()
{
int CHANTEUR_COUNT=0;
SetLocalInt(OBJECT_SELF,"CHANTEUR_COUNT",0);
}

Vala j espere que ca pourra servir a quelqu un qui se trouve dans le meme cas que moi.
Sinon c est tres bien de faire cette aide. pour quand la suite?
Ce script marche parfaitement !

Le SetLocalInt fait la définition et l'initialisation de la variable locale.
Si tu ajoutes un int CHANTEUR_COUNT=0 il n'aura de portée qu'au sein de ton script... en en théorie tes deux CHANTEUR_COUNT ne seront pas les mêmes !

Tu as du faire une erreur en tapant les scripts

Amaranthe.
Citation :
Provient du message de Pierrot
Tres bien faits ces tuts!!

Je suppose que c'est donc avec cette meme technique que l'on peut implémenter le nom du joueur dans la conversation!
Il ne s'agit pas a proprement parler d'une conversation puisque le joueur n'a aucune possibilité de réponse.

Mais pour poursuivre cet exemple... on peut tres bien faire en sorte que le garde salue le personnage par son nom... même si on empiete un peu sur le 3eme cours

Il suffit de mettre dans le OnHeartbeat

Code PHP:

object oPlayer GetLastPerceived() ;
string oName GetName(oPlayer) ;
void main()
{
    
ActionSpeakString("Bonjour " oName) ;


Amaranthe
Quelle est justement la différence entre un objet Player et un oPlayer ? (o représente un pointeur ?) Est-ce que les variables déclarées avant le main sont visibles ailleurs (comme des variables globales ?)
C'est pas important pour moi pour l'instant donc si ça interfère avec tes futures lessons c pas grave.
Bonjour tt le monde!
Bon j'ai lu ces tutos qui sont franchement trés bons (étant donné que je suis un debutant dans le domaine des scripts) et je bloque malheureusement dans cette partie du tuto étant donné que le script "tm_chanteur_os" tout simplement ne veut pas se compiler... et donc a la fin je ne peux pas observer aucun resultat .

L'erreur qui m'apparait sans cesse est:
ERROR: VARIABLE DEFINED WITHOUT TYPE

Au debut je croyais que javais mal écrit la ligne mais aprés en ayant fait une copie directe de la ligne de code l'erreur a continué persister... help! (merci d'avance)
Citation :
Provient du message de Tofileco
L'erreur qui m'apparait sans cesse est:
ERROR: VARIABLE DEFINED WITHOUT TYPE

Au debut je croyais que javais mal écrit la ligne mais aprés en ayant fait une copie directe de la ligne de code l'erreur a continué persister... help! (merci d'avance)
Essaye de faire un copier / coller de tout le code.

Ce code fonctionne parfaitement... il n'y a pas de raison que ca ne marche pas chez toi.

Amaranthe.
Bonjour tout le monde,

j'essaie les scripts seulement maintenant, je suis bien une vrai quiche mais j'ai préféré commencé par decouvrir ce que je pouvais pour mieux comprendre :-)

Mes deux questions sont les suivantes :

- quel est l'interet concret de passer par une declaration dans le onspawn qu'on reprend apres dans le onheartbeat ?

-a quoi sert d'utiliser les fonctions SetLocalInt et GetLocalInt.

- Pour résumer ne peut on pas faire un truc tout simple qui ressemblerait dans le OnHeartBeat à :

int ncount ;
ncount = 0 ;
void
{
ncount=ncount+1 ;
actionspeak.........
}

Je pense que c'est pour disposer d'une variable qu'on puisse réutiliser ailleurs et aussi pour pouvoir ratacher la variable à un objtet bien que le besoin ou l'utilite ne m'apparaisse pas directement.. d'ailleurs ce que j'ai ecrit la c'est ce que javais essaye instinctivement mais ca marche po :-(

A oui dans la belle version qui marche a quoi sert la derniere ligne (le SetLocalInt) sur lequel on remet a jour la variable generique ("chanteur_count") par rapport à la variable locale ncount qui vient d'être implémentée....


Je sais bien que je pressent un peu les raisons mais j'ai encore du mal a bien préciser le besoin de (pour moi) se compliquer la tache par ces declarations partout..... enfin si le besoin cest d'avoir un truc qui marche :-)


en tout cas merci pour ces cours, ils vont avoir pour merite d'apprendre plein de trucs et surtout ce qui est indispensable d'apprendre a structurer notre code a nous les quiches
Je ne vais pas te répondre directement mais essayer de te faire te poser les bonnes questions.

Il faut que tu comprennes a quel moment sont appelés chacuns des scripts... quand tu auras parfaitement intégré cela... tu aura compris tout le sens de la programmation évenementielle.

Il ya plusieurs type de programmation...

La programmation linéaire, celle a laquelle beaucoup d'entre nous tentent encore de se raccrocher et qui est de loin la plus "lisible", mais qui est completement dépassée de nos jours...

La programmation objet, qui est la moins lisible mais la plus facilement réutilisable et qui est tres "a la mode"...

Et la programmation évenementielle qui se rapproche beaucoup de la programmation objet, et qui est utilisée par Neverwinter.

Dans la programmation évenementielle, comme son nom l'indique, le code est "porté" par l'évenement qui le sous tend.

Chaque "objet" ayant ses propres evenements.

Pour revenir a nos moutons et si tu n'as pas déja trouvé par toi même, le "OnHeartbeat" est appelé a chaque battement de coeur, soit toutes les 6 secondes. Cela veut dire que TOUT le code placé dans le "OnHeartbeat" est ré-éxécuté a chaque fois. Y compris une éventuelle initialisation de variable...

En espérant avoir été plus claire.

Amaranthe.
Citation :
nCount = nCount+1;

Cela ne fait que prendre notre variable temporaire et lui ajouter 1. Il suffit de lire : Affectez a la variable nCount le contenu de la variable nCount + 1.

Si nCount vaut 9, alors après cette ligne, elle vaudra 10.

( Il est également possible d’écrire cela : nCount++ ;
le ++ est l’incrément de 1. C’est parfait une fois que l’on y est habitué, mais au début c’est généralement assez déroutant. )
La vitesse d'éxécution de nCout++ est plus rapide que celle de nCout + 1. Je vais pas expliquer le pourquoi ni le comment mais c cme ca. En fait, au final ca ne change rien étant donné la vitesse des proc actuels, mais conventionnelement on écrit plutot nCout++ et nCout--

Bon tout le monde s'en fout alors j'arrete la !!!
Citation :
Provient du message de Grunk
quand je rentre le premier script de cette page j ai un message d erreur sur la ligne:
SetLocalInt(OBJECT_SELF, “CHANTEUR_COUNT”, 0);

le message dit que j utilise une variable non definie...
ayant fait un peu de C et de php j ai reussi a faire marcher le script en rajoutant une ligne au script:

void main ()
{
int CHANTEUR_COUNT=0;
SetLocalInt(OBJECT_SELF,"CHANTEUR_COUNT",0);
}

Vala j espere que ca pourra servir a quelqu un qui se trouve dans le meme cas que moi.
Sinon c est tres bien de faire cette aide. pour quand la suite?
je vois pas à quoi ça sert de définir CHANTEUR_COUNT vu que tu ne t'en sers pas, il ne faut pas oublier que "CHANTEUR_COUNT", qui est une chaîne de caractères n'a rien à voir avec une variable qui porterait le nom CHANTEUR_COUNT.
Citation :
Provient du message de Amaranthe
La programmation linéaire, celle a laquelle beaucoup d'entre nous tentent encore de se raccrocher et qui est de loin la plus "lisible", mais qui est completement dépassée de nos jours...

La programmation objet, qui est la moins lisible mais la plus facilement réutilisable et qui est tres "a la mode"...
C'est pas un peu pédant et réducteur de dire ça ?
Programmation linéaire ou objet, ça dépend surtout de ce qu'on veut faire. Puis Neverwinter se rapproche beaucoup plus du code linéaire que du code objet. La seule chose c'est que les fonctions sont appelés par des évènements à l'instar de Visual Basic par exemple, mais du reste il n'y a pas d'objets au sens de la programmation objet (classes, membres, méthodes, polymorphisme etc ...).
Sa veut dire quoi le "o" devant oPlayer :bouffon:

et "IntToString(nCount)" sa veut bien dire que au string on y ajoute la variable "nCount"?
Par exemple
________________


int nCount = "tu sais que tu es moche"

void main()
{
ActionSpeakString ("Salut," + IntToString(nCount) + "?")
Actionwait (1.5)
}

________________

sa veut dire que le PNJ ve dire "Salut, tu sais que tu es moche ?" ?

Ou je me trompe completement et je suis la pire des Quiches

(si j'ai fait de la programmation avec WinDev et tu Basic ca me servira a qqchose ce que j'ai appris?)

Mitilifrit
"o", c une convention, quand la variable renvoi a un objet
et IntToString, c'est un fonction qui transforme une int en string, de int 1; tu passe a string"1";

et mettre int nCount = "tu sais que tu est moche"

ne done rien
c'est pas le bon type de variable, tu donne à un entier la valeur d'une chaine de caractère
(en plus manque le ";" )

fait plutot ca :

Code PHP:

void main()
{
int nCount 3;
string sCount "tu sais que t'es moche"
ActionSpeakString (IntToString(nCount) + "Salut," sCount "?")
Actionwait (1.5)

ca a pas grd sens dsl, chuis pas bon pour les exemple
alors la ca diras:


3Salut,tu sais que t'es moche?

donc bon ...

mais si tu fais :

Code PHP:

void main()
{
int nCount 3;
nCount++;
string sCount "tu sais que t'es moche"
ActionSpeakString (IntToString(nCount) + "Salut," sCount "?")
Actionwait (1.5)

ca diras

4Salut,tu sais que t'es moche?

donc on est d'accord, c tjrs aussi nul comme exemple, mais tu vois comment ca marche


(je sais pas, connais ni WinDev ni Basic )
Merci mais le truc que je voulait comprendre c si on peut mettre n'importe quoi sur un truc du genre nCount mais maintenant j'ai compris (me rectifier (ce qui est sûr) si je me trompe (encore plus sûr)) quand on met un "s" a la place du "n" devant "Count" sa veut dire que a "Count" on lui associe une chaine de caractére (c ca?)

sinon je comprend rien au script j'ai connu Aurora ya 5 jours maintenant donc vous foutez pas de moi (c déja arriver je crois)

Mitilifrit
Pour le script en lui même, que tu mette nCount, sCount ou poireauCount ça n'y changera rien du tout.
L'interet de la petite lettre qu'on met devant sert uniquement à se repérer rapidement dans des diverses variables du script.

Quelques petits exemples :
Dans le cas d'une location on utilise la lettre L
Code PHP:

location lLieu
Dans le cas d'un objet on utilise la lettre O
Code PHP:

object oLieu
Dans le cas d'un entier on utilise la lettre N
Code PHP:

int nLieu
Maintenant imagine un script ou ces trois variables, lLieu, oLieu et nLieu existent, ça te permet de savoir à quoi elle correspondent au premier coup d'oeil. Ca facilite de debuggage, si tu as un oLieu là où une fonction te demande un integer, tu verras rapidement d'où viens le problème.

C'est juste pour simplifier la lecture.

Jaha Effect
mm, en fait, les "s" et les "o" c'est des conventions, donc tu pourrais très bien mettre n'importe quoi a la place de "nCount", avec ou sans n, ce qui compte, c'est le "int" la premire fois que tu l'utilise (tu déclare le type de variable que tu utilise) donc int, object, string, etc..
Pas d'accord. Imagine que tu veuilles recupérer tous tes nCounts (nMonster, nEsrinda, nThallie, nVampire... etc.).
Tu utiliseras (merci Reyan ) quelque chose comme :
Code PHP:

DebString("n",1); 

pour tous les sélectionner.
ex :

Code PHP:

//prend tous les nCounts et les suppriment.
void main()
{
if(
nDeclencheur==&& nDeclencheur2 >> 5)
 {
 
// La fonction suivante n'existe pas, c'est un exemple, certainement mauvais, car à part le binaire, je ne crois pas qu'on puisse stocker plusieurs variables en une, mais bon.
 
group gTotal GetVariablesWithDebTag("n"));
 
DelayGroup(gTotal,TRUE);
 
ActionSpeakString("je viens d'inventer un nouveau type de variable... Ouais !");
  }

Comme quoi même les protocoles peuvent être utiles...
mm, il me semble bien que les "nCount" "nMonster" et autre "nMachin" ne sont que des noms valable uniquement dans le script où ils sont déclarés.
après, pour stocké un "in", on utilise "SetLocalInt", donc en fait qd tu définini une variable, comme
Code PHP:

 int nMachin 123
, tu ne peu l'utiliser avec ce nom que dans le script (en fait, la fonction, le " void main() {} " )
pour y faire appel plus tard, tu dois la stocker, en faisant par exemple
Code PHP:

SetLocalInt(OBJECT_SELF"NOM_DE_LA_VARIABLE"nMachin); 

puis ailleur, tu peux retrouver une variable stocker en faisant qq chose genre
Code PHP:

int nTruc//remarquer le nom arbitraire idiot
nTruc GetLocalInt(OBJECT_SELF"NOM_DE_LA_VARIABLE"); 
après ca, le "GetStringLeft()" peut servir a récuperer le début d'une chaine de caractere, mais ca marcheras pas sur un entier, ca répondras probablement un truc moche qui comence par ERREUR
donc, pour résumer ce bord**, un nMachin ne peut être utiliser que dans uns cript où il est définie, et c'est un int, imagine que tu met des étiquettes sur tes outils ^_^
fin bon, c p-e que des ineptie, mais pour l'instant avec ca je m'en sortais
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés