Aelor
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Aelor

Forum officiel du module NeverWinter Nights et role play Aelor.
 
AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  

 

 Problème sur un script

Aller en bas 
4 participants
AuteurMessage
Ethelbert
Génération spontanée
Ethelbert


Nombre de messages : 647
Localisation : Lyon
Date d'inscription : 11/01/2006

Problème sur un script Empty
MessageSujet: Problème sur un script   Problème sur un script EmptyMar 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.
Revenir en haut Aller en bas
Furious Hedgehog
Génération spontanée
Furious Hedgehog


Nombre de messages : 217
Localisation : Anglet
Date d'inscription : 22/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMar 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 Smile
Revenir en haut Aller en bas
Ethelbert
Génération spontanée
Ethelbert


Nombre de messages : 647
Localisation : Lyon
Date d'inscription : 11/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMar 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. Wink

Edition: ça marche nickel. Quand on pense que tout peut ne pas marcher à cause d'un seul caractère... Merci beaucoup !
Revenir en haut Aller en bas
DarkSideRC

DarkSideRC


Nombre de messages : 63
Date d'inscription : 03/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMer 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 .
Revenir en haut Aller en bas
Ethelbert
Génération spontanée
Ethelbert


Nombre de messages : 647
Localisation : Lyon
Date d'inscription : 11/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMer 19 Avr - 10:28

Euh... ? Suspect
"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... ^^
Revenir en haut Aller en bas
Furious Hedgehog
Génération spontanée
Furious Hedgehog


Nombre de messages : 217
Localisation : Anglet
Date d'inscription : 22/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMer 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
Revenir en haut Aller en bas
DarkSideRC

DarkSideRC


Nombre de messages : 63
Date d'inscription : 03/01/2006

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyMer 19 Avr - 12:13

Ethelbert a écrit:
Euh... ? Suspect
"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... ^^

Désolé, ceci explique cela .... la prochaine fois je tacherai d'etre pédagogue Very Happy
Revenir en haut Aller en bas
Gimli Oakenshield
L'ignorant en Hardware
Gimli Oakenshield


Nombre de messages : 783
Localisation : Près de mon ordi !
Date d'inscription : 15/12/2005

Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script EmptyLun 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 ...
Revenir en haut Aller en bas
Contenu sponsorisé





Problème sur un script Empty
MessageSujet: Re: Problème sur un script   Problème sur un script Empty

Revenir en haut Aller en bas
 
Problème sur un script
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» script apparition
» script pr qu'un pnj s'assied
» Script de porte
» Script de kain
» script quête

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Aelor :: Archives :: Editeur :: Script-
Sauter vers: