JeuxOnLineForumsPlusConnectés : 805 (sites) | 1436 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Cours de Scripts pour les Quiches. Leçon Deux. RSS
   
Répondre
Partager Outils Rechercher
Amaranthe
Reine
 
Lightbulb

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

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 = «http://forums.jeuxonline.info/showth...hreadid=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.
Lien direct vers le message - Vieux
Avatar de Neko - BlueFrog
Neko - BlueFrog
Roi
 
Avatar de Neko - BlueFrog
 
... ...

Whôa !

Merci

Neko
Lien direct vers le message - Vieux
Avatar de John Hawkmoon
John Hawkmoon
Roi
 
Avatar de John Hawkmoon
 
merci pour les belles leçons
mais maudit que je hais coder avec du "case sensitive"
je suis habituer a Visual Basic
Lien direct vers le message - Vieux
Avatar de turk182
turk182
Roi / Reine
 
Avatar de turk182
 
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
Lien direct vers le message - Vieux
GrunkOld
Roi
 
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?
Lien direct vers le message - Vieux
Compte #17073
Invité
 
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!
Lien direct vers le message - Vieux
Amaranthe
Reine
 
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.
Lien direct vers le message - Vieux
Amaranthe
Reine
 
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
Lien direct vers le message - Vieux
Avatar de Aldrya
Aldrya
Alpha & Oméga
 
Avatar de Aldrya
 
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.
Lien direct vers le message - Vieux
Tofileco [L.D.D]
Roi
 
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)
Lien direct vers le message - Vieux
Amaranthe
Reine
 
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.
Lien direct vers le message - Vieux
Avatar de Syilph
Syilph
Roi
 
Avatar de Syilph
 
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
Lien direct vers le message - Vieux
Amaranthe
Reine
 
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.
Lien direct vers le message - Vieux
Avatar de Syilph
Syilph
Roi
 
Avatar de Syilph
 
Merci, une fois de plus j'ai oublie de reflechir.... pourtant j'avais bien cru avoir refléchi avant d'écrire, mais en fait non

zetes bien patient :-)
Lien direct vers le message - Vieux
Avatar de 'Az
'Az [P.H.]
Alpha & Oméga
 
Avatar de 'Az
 
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 !!!
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Cours de Scripts pour les Quiches. Leçon Deux.
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 12h51.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite