| Problème sur un script | |
|
|
Auteur | Message |
---|
Ethelbert Génération spontanée
Nombre de messages : 647 Localisation : Lyon Date d'inscription : 11/01/2006
| Sujet: Problème sur un script Mar 18 Avr - 20:48 | |
| Voilà, je suis en train d'essayer de placer deux scripts sur un coffre (un OnOpen et un OnClose). Le but de ces scripts est de créer un objet dans le coffre lorsqu'un PJ l'ouvre (OnOpen), et de détruire tout objet déposé dans le coffre, ainsi que d'éviter que le PJ ne puisse se servir en n'arrêtant pas d'ouvrir le coffre (OnClose). Ce dernie rpoint doit être réglé par une variable placée sur le PJ. Petit souci: sans la variable le script de création d'objet fonctionne au poil, ainsi que celui détruisant tout objet déposé dans le coffre. Mais avec la variable, plus rien ne se créée. Voici les scripts en question. Le script OnOpen: - Code:
-
//definition du PJ sur lequel va être stockee la variable object oOuvreur = GetLastOpenedBy(); //definition de la variable nTresor int nTresor = GetLocalInt(oOuvreur, "nTresor");
void main() { //on verifie que la variable nTresor n'a jamais ete stockee sur le PJ if (nTresor = 0) { //si tel est le cas, on détruit tout ce que renferme le coffre lors de l'ouverture DestroyObject(GetFirstItemInInventory(OBJECT_SELF), 0.0); DestroyObject(GetNextItemInInventory(OBJECT_SELF), 0.0); //puis on crée l'objet souhaite (la variable nTresor sera creee par le script de fermeture CreateItemOnObject("journaldepoica", OBJECT_SELF, 1); }
//si la variable a deja ete stockee sur le PJ else if (nTresor > 0) { //on rappelle au PJ qu'il a deja ramasse le tresor ActionSpeakString("Vous avez eu votre part du tresor. Ne soyez pas trop gourmand."); } } Script OnClose - Code:
-
//definition du PJ fermant le coffre (on peut aussiutiliser la fonction GetLastOpenedBy() object oFermeur = GetLastClosedBy();
void main() { //on détruit tou objet depose dans le coffre DestroyObject(GetFirstItemInInventory(OBJECT_SELF), 0.0); DestroyObject(GetNextItemInInventory(OBJECT_SELF), 0.0); //on definit la variable nTresor SetLocalInt(oFermeur, "nTresor", 1); }
Et voilà. Je pense que ces scripts sont assez simples (simplistes ?). Donc je ne comprends pas pourquoi ça ne fonctionne pas. Peut-être une mauvaise définition de ma variable, peut-être une erreur de syntaxe quelque part, bien que l'éditeur de script n'en ait pas détecté. Je précise que j'avais commencé par définir la variable nTresor après la création de l'objet dans le script OnOpen. Mais cela ne changeait rien au problème. Et il m'a semblé plus logique de placer la définition de la variable sur un script de OnClose. Merci de vos éclairicssements. | |
|
| |
Furious Hedgehog Génération spontanée
Nombre de messages : 217 Localisation : Anglet Date d'inscription : 22/01/2006
| Sujet: Re: Problème sur un script Mar 18 Avr - 21:23 | |
| - Ethelbert a écrit:
- Le script OnOpen:
- Code:
-
[...]
void main() { //on verifie que la variable nTresor n'a jamais ete stockee sur le PJ if (nTresor = 0) { [...] }
//si la variable a deja ete stockee sur le PJ else if (nTresor > 0) { [...] } }
Petit cours de programmation : il faut faire attention de ne pas confondre le "=" d'affectation et le "==" de comparaison logique. - Code:
-
iVar = 3; // affectation
if (iVar == 2) { // comparaison //instructions } Les symboles de comparaison sont les suivant : == : égal < : strictement inférieur <= : inférieur ou égal > : strictement supérieur >= : supérieur ou égal != : différent && : ET logique || : OU logique Cette erreur est commune durant les débuts de programmeurs, après on commence a avoir l'habitude de faire la distinction | |
|
| |
Ethelbert Génération spontanée
Nombre de messages : 647 Localisation : Lyon Date d'inscription : 11/01/2006
| Sujet: Re: Problème sur un script Mar 18 Avr - 21:28 | |
| Autant pour moi, je vais essayer avec ça alors, et je te tiens au courant. Mais je ne sais plus où, il m'avait semblé voir que "=" ou "==", il n'y avait aucune différence pour tester une condition. Mes yeux ont dû fourcher... En tout cas merci. Edition: ça marche nickel. Quand on pense que tout peut ne pas marcher à cause d'un seul caractère... Merci beaucoup ! | |
|
| |
DarkSideRC
Nombre de messages : 63 Date d'inscription : 03/01/2006
| Sujet: Re: Problème sur un script Mer 19 Avr - 10:12 | |
| Autre chose : cela me choque que tu ai mis les variables en globales en dehors du main() ... mais apres tout si ca marche . | |
|
| |
Ethelbert Génération spontanée
Nombre de messages : 647 Localisation : Lyon Date d'inscription : 11/01/2006
| Sujet: Re: Problème sur un script Mer 19 Avr - 10:28 | |
| Euh... ? "Variables en globale" ça donne quoi en français ? Désolé, avec un bac L spécialité Latin, j'ai un peu de mal à suivre certains termes d'informatique... ^^ | |
|
| |
Furious Hedgehog Génération spontanée
Nombre de messages : 217 Localisation : Anglet Date d'inscription : 22/01/2006
| Sujet: Re: Problème sur un script Mer 19 Avr - 11:03 | |
| Les variables créées a l'intérieur des accolades ("{","}") de la fonction main (), ici définissant les limtes de la fonction, ne sont utilisable qu'a l'intérieur de cette fonction. si tu y faisais référence dans une autre fonction, le compilateur te dirait qu'elles sont inconnues. On dit alors que les variables sont locales a la fonction. Dépendant des langages, ces variables sont détruites automatiquement ou non a la fin du bloc de fonction. Cependant, même si elles n'étaient pas détruites elles seraient quand même inaccessibles par la suite (ce qui revient a perdre de la mémoire car jamais plus le script/programme ne pourra vider ces zones de la mémoires ou elles sont stocké, car il les suppose en cours d'utilisation). Quand on défini une variables en dehors des bloc de fonction, on dit que ce sont des variables globales. Celles-ci sont accessible n'importe ou dans le script/programme a partir de la ligne suivante ou elles ont été déclaré. - Code:
-
// Ceci est un code d'exemple, je ne suis pas sur qu'il compile
string sVar = "3"; // declaration d'une variable globale
void main () {
string sMessage = "12"; // declaration d'une variable locale à la fonction main() sMessage = sMessage + sVar; // sMessage contient maintenant "123" parce que sVar est vune variable globale, visible hors du bloc de la fonction.
/* NOTE : le "+" est utilisé comme opérateur de concaténation quand les 2 opérandes sont des chaines de caractères (string) */
}
sMessage = sMessage + sVar; // Genere une erreur parce que sMessage n'a pas été déclaré. le sMessage dans la fonction main() a été détruit a la fin de la fonction.
Maintenant, que ce passerait-il si on utilisait une variables globale et une variable local du même nom ? - Code:
-
// Ceci est un code d'exemple, je ne suis pas sur qu'il compile
string sMessage = "3"; // declaration d'une variable globale
void main () {
/* Ici, sMessage vaut toujours "3"
string sMessage = "12"; /* Ici, sMessage vaut maintenant "12" mais je ne sais pas comment le compilateur de NWN réagit ici, dans le sens où une variable du même nom a été déclaré 2 fois (erreur). Dans d'autres langage, on peut voir ce qu'on appelle de la surcharge, c'est a dire que seul sMessage déclaré en local sera utilisé dans la fonction tandis qu'il reprendra sa valeur global au terme de la fonction */
}
/* Est-ce que sMessage vaut "3" ici ? mystère... */
Pour plus de clarté, il est de convention de réunir les variables et les fonctions auquelles elles sont associées en déclarant ces variables de façon locale, ce qui lèvera toute ambiguïté pour le compilateur et le programmeur si des variables, représentant des données différentes, devaient porter le même nom...
Dernière édition par le Mer 19 Avr - 12:35, édité 2 fois | |
|
| |
DarkSideRC
Nombre de messages : 63 Date d'inscription : 03/01/2006
| |
| |
Gimli Oakenshield L'ignorant en Hardware
Nombre de messages : 783 Localisation : Près de mon ordi ! Date d'inscription : 15/12/2005
| Sujet: Re: Problème sur un script Lun 24 Avr - 15:50 | |
| - Citation :
- Est-ce que sMessage vaut "3" ici ? mystère...
Le compilateur de NWn va te demander de choisir un autre nom car ce dernier est déja pris ... | |
|
| |
Contenu sponsorisé
| Sujet: Re: Problème sur un script | |
| |
|
| |
| Problème sur un script | |
|