La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 11/11/2024 20:05:17


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Biplip
Voyageur
Inscrit le: 13 Jan 2005
Messages: 4
Répondre en citant
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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 13/01/2005 17:54:45 Sujet du message :

oops, navré...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Athanagorn
Acolyte
Inscrit le: 12 Déc 2004
Messages: 38
Répondre en citant
Posté le : 13/01/2005 18:01:35 Sujet du message :

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. Wink
NWScript :
int Globale;
void main()
{
  int Locale;
  // faire quelque chose avec Globale et Locale ...
}
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 :
int Globale;
void main()
{
  int Locale;
  // faire quelque chose avec Globale et Locale ...
}
void autrefonction()
{
  int autreLocale;
  // faire quelque chose avec Globale et autreLocale , mais pas avec Locale...
}
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.
}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
S@ntoS
Seigneur
Inscrit le: 12 Déc 2004
Messages: 169
Localisation: J'aimerais bien le savoir.
Répondre en citant
Posté le : 13/01/2005 20:46:59 Sujet du message :

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 Surprised
_________________
L'oiseau vole, le serpent rampe et l'homme... heu, j'en sais rien. Surprised
Le RP, cé vrémant tro z'injuste !Calimero
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Athanagorn
Acolyte
Inscrit le: 12 Déc 2004
Messages: 38
Répondre en citant
Posté le : 13/01/2005 21:06:26 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
S@ntoS
Seigneur
Inscrit le: 12 Déc 2004
Messages: 169
Localisation: J'aimerais bien le savoir.
Répondre en citant
Posté le : 13/01/2005 21:27:51 Sujet du message :

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. Surprised
_________________
L'oiseau vole, le serpent rampe et l'homme... heu, j'en sais rien. Surprised
Le RP, cé vrémant tro z'injuste !Calimero
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Biplip
Voyageur
Inscrit le: 13 Jan 2005
Messages: 4
Répondre en citant
Posté le : 14/01/2005 01:49:55 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 48.337ms