La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 19:47:13
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Biplip Voyageur Messages: 4 |
Posté le : 13/01/2005 16:38:14 Sujet du message : GetFirstPC() + GetNextPC() dans le HeartBeat du module
Tout d'abord bonjour à tous, étant donné que c'est mon premier message.
Je parcourais le forum en simple visiteur jusqu'ici, mais puisque un problème me bloque actuellement au niveau scripting, je sollicite votre aide à tous. J'en profiterai également pour éclairer ceux qui ont des problèmes, au cas où j'y comprendrais quelque chose (ce qui serait un miracle). Le problème est le suivant (je place le code (tout simple, enfin c'est ce que je pensais)) C'est le script placé dans le OnHeartBeat du module. Code : void main()
{ object oPC = GetFirstPC(); while (GetIsObjectValid(oPC) == TRUE) { SendMessageToPC(oPC, "test"); object oPC = GetNextPC(); } } J'attendais donc, que lors du HeartBeat (toutes les 6 secondes donc), le module envoie le message "test" à tous les PJs connectés. Or, quand je teste en allant dans le jeu (je suis le seul joueur présent), le module m'envoie "test" tout le temps et sans interruption, causant des erreurs de type Too Many Instructions. J'en déduis donc que GetNextPC() ne renvoie pas OBJECT_INVALID, alors que je suis le seul joueur sur le module ? Si vous pouvez m'aider à faire fonctionner ça, je vous en serais très reconnaissant. J'ai pris l'exemple avec un SendMessageToPC() pour tester simplement, mais si cela marche bien, le but est en fait de sauvegarder la localisation de chaque PJ connecté toutes les 6 secondes. |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
oops, navré...
|
Revenir en haut | |
Athanagorn Acolyte Messages: 38 |
Alors, bienvenue pour ton premier post.
La réponse simple à ton problème est : "Supprime le "object" devant le oPC = GetNextPC();." Parce que j'ai une âme de professeur, je vais donc donner une réponse plus complète, et expliquer pourquoi le compilateur n'a pas généré d'erreurs. Dans les languages évolués (comme le C, le C++, le java... desquels descend le nwscript), il existe une chose appelée portée d'une variable. La portée d'une variable représente la portion de code dans lequel la variable sera visible et accessible. Les portées peuvent être globales, ou locales. En Nwscript, une variable sera considérée comme globale si elle est définie en dehors d'une fonction, et locale si elle est définié dans une fonction. Dans le code ci-dessous, la variable "Globale" est globale, et la variable "Locale" est locale. NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
Tiens, au fait, il ont une balise spéciale pour les scripts nwn ici, c'est mieux que la balise "code". Donc, une variable globale sera utilisable dans tout le script où elle est définie, et une variable locale dans tous le bloc ou elle est définie, mais pas ailleurs. Tu aura peut-être remarqué que j'ai dit bloc, alors que tout à l'heure j'avais dis fonction... C'est parce qu'une fonction contient forcement au moins un bloc. Donc si on ajoute une fonction au code précedent on obtient: NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Si on reviens sur la définition d'un bloc, en général un bloc commence par { et finis par }, et il faut savoir que les blocs sont imbriquables, c-à-d qu'un bloc peux contenir un bloc qui peux contenir un bloc etc. Tu me diras: "Bien, c'est bien beau, mais qu'est-ce que ça a à voir avec mon problème?". En fait, il existe aussi un autre phénomène: le masquage. Si tu définis dans un bloc une variable (locale, donc) de même nom qu'une variable globale ou locale de portée superieure, cette dernière est masquée par la nouvelle variable, et on ne peux plus y acceder, tant que l'on reste dans le bloc en cours. C'est un peu nébuleux? Voyons avec un exemple: NWScript :
int a; void fonction() { int a; a = 2; // on affecte la variable locale, et non la globale } void main() { a = 1; // on affecte la variable globale fonction(); SpeakString(IntToString(a)); // ici, on va "dire" 1, et non pas 2, // en effet, fonction ne modifie pas la variable globale. } C'est un problème similaire qui s'applique dans ton cas. Dans le "bloc" du while, tu définis un nouvel objet oPC de portée plus réduite que l'objet précedent et tu initialises à GetNextPC(), mais ce n'est pas lui que tu testes, c'est le oPC de portée supérieure. |
Revenir en haut | |
S@ntoS Seigneur Messages: 169 Localisation: J'aimerais bien le savoir. |
Salut,
Donc, dans sa ligne de code « while », comme l'objet oPC est bien valide, la fonction est bien activé (message « test » envoyé). Par contre, dans la ligne « object oPC = GetNextPC(); » l'objet Next PC étant similaire à l'objet First PC, celui-ci devient de porté inférieur. Le message n'est donc jamais envoyé au prochain PC mais toujours au premier PC. D'où la boucle. C'est bien ça ? @+. F€r _________________ L'oiseau vole, le serpent rampe et l'homme... heu, j'en sais rien. Le RP, cé vrémant tro z'injuste ! |
Revenir en haut | |
Athanagorn Acolyte Messages: 38 |
Oui, c'est ça. Pour être plus précis, la boucle s'execute comme ceci:
0: Bloc de la fonction main 1: Création d'un object oPC(1) 2: Affectation du premier joueur à oPC(1) 3: Test du while sur oPC(1) 4: Bloc du while 5: Transmission du message à oPC(1) 6: Création d'un object oPC(2) qui viens masquer oPC(1) 7: Affectation du joueur suivant à oPC(2) 8: Fin du bloc du while, destruction de l'object oPC(2), et retour en 3 9: Fin du bloc du main Comme la valeur de oPC(1) ne change jamais, la condition du while est toujours bonne, donc on reste dans la boucle. |
Revenir en haut | |
S@ntoS Seigneur Messages: 169 Localisation: J'aimerais bien le savoir. |
Merci pour le sujet Biplip, et merci d'avoir pris de ton temps pour les explications, Athanagorn. J'ai appris un truc, et ça, c'est pas tous les jours.
@+. F€r. _________________ L'oiseau vole, le serpent rampe et l'homme... heu, j'en sais rien. Le RP, cé vrémant tro z'injuste ! |
Revenir en haut | |
Biplip Voyageur Messages: 4 |
Un grand merci à toi Athanagorn, pour m'avoir corrigé mais aussi expliqué en détail ce qui n'allait pas. Ton explication était superbe, merci d'avoir pris de ton temps pour répondre ! J'aurais moi aussi appris quelque chose.
|
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Page 1 sur 1 ¤
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