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


Forum d'entraide à la création de jeux d'aventure
 
PortailAccueilRechercherS'enregistrerConnexion
Le Deal du moment :
TINEO Matelas bébé climatisé 60 x ...
Voir le deal
36.99 €

 

 Les Struct / Les scripts ... et la logique AGS ?

Aller en bas 
AuteurMessage
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyVen 19 Avr 2019 - 8:06

Bonjour,

J'observe parfois quelques comportements un peu bizarre de la part d'AGS et je voulais en savoir plus sur la logique des choses.

Déjà, j'ai crée un fichier script que j'ai nommé "Quête" , il est placé au dessus de "GlobalScript" dans l'ordre des scripts. J'ai cru comprendre que AGS lisait de haut en bas, du moins j'ai cru comprendre que lorsque AGS exécute une partie du code, il ignore totalement ce qui se trouve en dessous de la ligne qu'il exécute actuellement. Ce qui veut dire qu'il ne reconnait pas les variables ou les fonctions, si elles sont déclarées plus bas.. Bref

Dans mon fichier "Quête" , j'ai crée la structure :
Code:
struct Objectif {
 bool On;  
  String name;
 int Etape;
  String description;
bool Validation;
};
 
Objectif quete[10];

Que j'ai ajouté dans le Edit Header du fichier Script Quete, afin de pouvoir appeler quete[] ailleurs.
Déjà, là, première question, est-ce que j'ai bien déclaré tout ça ?


Ensuite,
Dans function game_start()  du GlobalScript, j'ai entrée comme valeur initiale à quete[0].Etape = -99;

Durant un dDialog, je lui donne l'information = > quete[0].Etape = -2
Puis je lance une fonction directement issue du fichier Script Quete. Cette fonction devrait donner une consigne au jeu, qui nécessite la condition que if( quete[0].Etape ==-2) , pourtant, rien ne fonctionne.
Néanmoins, lorsque j'ajoute un Display que je lance durant mon dialogue pour vérifier la valeur de quete[0].Etape, il m'indique bien -2;

Or, et c'est là où je suis perdu... j'ai fait un petit GuiDebug pour surveiller certaines valeurs en direct.  J'ai donc ajouté un Label.text pour contrôler la valeur quete[0].Etape (placé dans repeatedly_execute() ) et il m'indique que la valeur de quete[0].Etape est toujours égal à -99.
Et le meilleur pour la fin ....! En ajoutant un Display pour vérifier la valeur de quete[0].Etape au moment où il lance la function dans le fichier Script Quete, il me donne la valeur quete[0].Etape = 0 !!!

Chelou non ?
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann

Nombre de messages : 268

Date d'inscription : 06/04/2016


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyVen 19 Avr 2019 - 17:27

Salut,
@filoulefilou a écrit:
J'ai cru comprendre que AGS lisait de haut en bas, du moins j'ai cru comprendre que lorsque AGS exécute une partie du code, il ignore totalement ce qui se trouve en dessous de la ligne qu'il exécute actuellement. Ce qui veut dire qu'il ne reconnait pas les variables ou les fonctions, si elles sont déclarées plus bas.. Bref
Exactement.

Une piste pour ton problème serait de vérifier que ta variable quete[] ne se multiplie pas autant de fois qu'elle est importée dans un autre script.
Logiquement il faudrait l'exporter depuis ton script.

Mais pour faire plus simple tu devrais essayer de créer une fonction dans ton fichier script Quête qui te permettrait de modifier tes variables directement dans ce script surtout si tu cherches à tout centraliser dans ce dernier.
Par exemple:
Code:
// dans le script Quête
void EtapeQuete(int quete, int etape) {
      quete[quete].Etape = etape ;
}

//et depuis ton dialogue
EtapeQuete(0,-2);

Pour faire encore mieux et plus propre pour gérer tes structs, je te conseille la lecture de ceci
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyVen 19 Avr 2019 - 19:22

Exactement ce que dit Arlann: Déclaration de variables dans le script header sourire

Un peu plus d'explications : en plaçant Objectif quete[10]; dans l'en-tête, chaque script se retrouve avec sa propre instance du tableau. Dans ton GlobalScript, quete[0].Etape est bien égale à -99 (après le game_start) dans le script de dialogues, quete[0].Etape est égale à -2 (après la commande d'assignation tout du moins) et dans ton script Quete quete[0].Etape n'a probablement jamais été assignée de valeur initiale donc elle vaut 0.

La solution, comme le dit Arlann encore une fois, c'est créer ton tableau dans le script de Quete, pas dans l'en-tête, puis l'exporter comme expliqué dans la documentation.

L'idée d'une fonction setter est bonne aussi, mais je ne suis pas convaincu par l'approche d'Arlann qui consiste à passer l'ID de la quête comme premier paramètre et sa valeur comme deuxième paramètre (ça me fait un peu penser à des nombres magiques).
Une suggestion alternative, un peu moins orientée "nombre magique" selon moi :
Code:
Quete.quete[0].setEtape(-2);

Oh et tu pourrais trouver ça intéressant : Keyword: attribute
Ça explique comment utiliser des getter et setter pour une meilleure gestion de l'accès aux valeurs des structures.

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptySam 20 Avr 2019 - 12:32

Merci les gars.  

En lisant suivant un peu vos lectures, voilà ce que j'ai pondu :

Code:

//Dans le module header



 struct Objectif {

 
 int Etape;
 import static void get_Etape();
 import void set_Etape(int etape);

 String name;
 String description;
 String etat_de_quete;
 
 bool Enregistrement;
  
 };
 

Code:


//Dans le Edit Script

 Objectif quete[10];

 

 
 void Objectif::set_Etape(int etape) {
    
 
  
  
      this.Etape = etape ;
      
  
   if (etape < 0) { this.etat_de_quete = "null" ; this.Enregistrement = false;}// etape -1 => "null" ; etape 100 => "valide" ; etape >-1  <100 => "encours"
    else if (etape  == 100) this.etat_de_quete = "valide";
        else { this.etat_de_quete = "encours"; this.Enregistrement = true;}
        
        //////////////// Retire de la liste la quête validée//
        
             if((this.Etape == 100)&& (this.Enregistrement == true))  {
  
              int n;
              for (n=0; ListQueteOn.Items[n]!= this.name;n++){
  
                if(ListQueteOn.Items[n]== this.name) { ListQueteOn.RemoveItem(n); ListQueteOff.AddItem(this.name);}
                          }
      
                this.Enregistrement = false;
                  }
  

        ///////Ajouter la quête non enregistrée ////
        
          if((this.Etape ==0 ) && (this.Enregistrement == false)) {
            
            ListQueteOn.AddItem(this.name);
            
          }
        
        
        

 }


Déjà, est-ce que j'ai bon ? Je vous avoue que apprenant sur le tas, tout ça me parait encore très compliqué.
Et dernière chose, je voudrais pouvoir utiliser quete[] partout, notamment durant les dialogues. Or, je ne sais pas du tout où déclarer
Code:
export quete;

Dans la notice il est indiqué à la fin de mon Global script, sauf que j'ai noté ce script dans un fichier script nomme "Quete" à part, se trouvant en haut du Global.
Si je l'export à la fin de "Quete", il n'est pas trouvable pour les autres script, si je l'export ailleurs ... il n'est plus identifié.
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptySam 20 Avr 2019 - 19:39

@filoulefilou a écrit:
Déjà, est-ce que j'ai bon ?
Je pense que c'est presque ça (même si j'ai pas inspecté le contenu de ta fonction set_Etape dans le détail). Tu devrais probablement rajouter le séquence de mots-clés import attribute devant int Etape; et ajouter une variable interne nommée par exemple etape (même nom que l'attribut, sans majuscule---mais c'est arbitraire, tu pourrais aussi la nommer Etape_privee) et la déclarer comme protected afin d'y empêcher un accès direct hors des fonctions internes à ta struct. Ensuite remplace toutes les occurrences de Etape par etape dans ta fonction set_Etape. Ça donne ça :

Code:
// En-tête de Quete
struct Objectif {
  protected int etape;
  import attribute int Etape;
  import void get_Etape();                    // Pas de static : il y a une Etape différente par instance de quete
  import void set_Etape(int etape);
 
  writeprotected String name;               // J'imagine que ces variables
  writeprotected String description;       // devraient uniquement être modifiées
  writeprotected String etat_de_quete;  // au sein des fonctions internes
 
  writeprotected bool Enregistrement;    // Même chose
};

Code:
// Corps de Quete

Objectif quete[10];

void Objectif::set_Etape(int etape) {

  this.etape = etape;
  
  if (etape < 0) { this.etat_de_quete = "null" ; this.Enregistrement = false;} // etape -1 => "null" ; etape 100 => "valide" ; etape >-1  <100 => "encours"
  else if (etape == 100) this.etat_de_quete = "valide";
  else { this.etat_de_quete = "encours"; this.Enregistrement = true; }
        
  //////////////// Retire de la liste la quête validée//
        
  if ((this.etape == 100) && (this.Enregistrement == true)) {
    int n;
    for (n=0; ListQueteOn.Items[n]!= this.name;n++){
      if (ListQueteOn.Items[n]== this.name) {
        ListQueteOn.RemoveItem(n);
        ListQueteOff.AddItem(this.name);
      }
    }
    this.Enregistrement = false;
  }
  
  ///////Ajouter la quête non enregistrée ////
        
  if (this.etape == 0 && this.Enregistrement == false) {
    ListQueteOn.AddItem(this.name);
  }
}

Je me suis permis de ré-arranger un peu les indentations d'une façon que je trouvais plus claire.

Aussi, j'ai pas mis les export et import, d'ailleurs...

@filoulefilou a écrit:
Dans la notice il est indiqué à la fin de mon Global script, sauf que j'ai noté ce script dans un fichier script nomme "Quete" à part, se trouvant en haut du Global.
Si je l'export à la fin de "Quete", il n'est pas trouvable pour les autres script, si je l'export ailleurs ... il n'est plus identifié.
C'est effectivement une simplification de dire "à la fin du Global Script," ça devrait être "à la fin du corps de votre script." Je pense que ce passage oppose Global Script à scripts de pièce, pour lesquels il n'existe pas de fichier d'en-tête.

La méthode consacrée c'est effectivement exporter ta variable tout à la fin du corps de ton script Quete, mais n'oublie pas non plus de l'importer ensuite là où tu en as besoin. Le plus simple c'est de placer la déclaration import dans l'en-tête de ton script Quete, comme ça la variable sera accessible à tous les fichiers scripts plus bas (y compris les scripts de dialogue et les scripts de pièce, qui sont plus bas que le Global Script).

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptySam 20 Avr 2019 - 21:56

Je n'ai pas compris ce que tu voulais dire par // J'imagine que ces variables devraient uniquement être modifiées au sein des fonctions internes // ?
A propos du writeprotected ? Ca change quoi du coup ?

Je peux modifier en inscrivant un truc du genre :
Code:
if(quete[0].get_Etape()==0 ) quete[0].description = "Voilà bien que la quête commence, nous sommes à 0 ...blablabla";

Ou bien je dois procéder comme pour les etape avec un

Code:
writeprotected String description;
import void set_EtapeDescription(String description);

Puis ajouter ensuite un truc du genre :

Code:

quete[0].set_EtapeDescription("Voilà bien que la quête commence, nous sommes à 0 ...blablabla");


En gros, je voudrais avoir un Gui qui afficherait les descriptions de chacune des quête selon leur avancement dans un Label.Text, en listant les noms des quêtes dans une Listbox.
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyLun 22 Avr 2019 - 16:11

@filoulefilou a écrit:
Je n'ai pas compris ce que tu voulais dire par // J'imagine que ces variables devraient uniquement être modifiées au sein des fonctions internes // ?
A propos du  writeprotected ? Ca change quoi du coup ?
En fait dans ta fonction set_Etape, tu modifies les valeurs de this.etape, this.Enregistrement et this.etat_de_quete, donc j'ai supposé que tu voudrais te prémunir de toute modification de ces variables en dehors de la fonction. C'est ce que fait writeprotected : ça ne laisse modifier les valeurs de variables de ta struct que depuis l'intérieur d'une fonction elle-même propre à ta struct. Comme ça, si tu essaies quelque part dans un script de pièce, par exemple, de faire quete[0].etat_de_quete = "valide"; bah ça marchera pas. La seule façon de modifier etat_de_quete, étant donné le code actuel, ce serait de faire quete[0].Etape = 100;

J'ai été un peu vite en mettant aussi description comme writeprotected, j'avais pas vu que la variable était pas manipulée dans set_Etape. Si tu veux laisser une grande flexibilité dans la modification de sa valeur, tu devrais enlever le writeprotected devant description, afin de pouvoir modifier la description d'une quête directement depuis un script de pièce par exemple.

@filoulefilou a écrit:
Je peux modifier en inscrivant un truc du genre :
Code:
if(quete[0].get_Etape()==0 ) quete[0].description = "Voilà bien que la quête commence, nous sommes à 0 ...blablabla";

Ou bien je dois procéder comme pour les etape avec un

Code:
writeprotected String description;
import void set_EtapeDescription(String description);

Puis ajouter ensuite un truc du genre :

Code:

quete[0].set_EtapeDescription("Voilà bien que la quête commence, nous sommes à 0 ...blablabla");

C'est une option en effet, tu pourrais comme tu le suggères ici passer par une fonction pour contrôler les valeurs possibles de description. Ce sera plus ou moins judicieux selon que tu prévois ou non un ensemble restreint de valeurs possible (par exemple, seulement : "Voilà que la quête commence" et "Quête terminée"). Si c'est les seules valeurs possibles et qu'elles correspondent systématiquement à une valeur de Etape, t'as même pas besoin d'avoir un setter pour description puisque dans ce cas tu peux assigner chaque valeur de description au sein de set_Etape. Et pas besoin de getter non plus, le writeprotected suffit dans ce cas. En revanche si la valeur de description est déterminée de façon beaucoup moins systématique (par exemple chaque quête a des descriptions différentes qui ont pas de correspondance particulière avec la valeur de Etape) et que tu veux pouvoir directement manipuler cette valeur depuis, par exemple un script de pièce, comme je disais plus haut, je mettrais pas le writeprotected pour description et je manipulerais directement sa valeur en faisant référence comme ça : quete[0].description = "yo !"


NB: toute l'idée d'avoir le mot-clé attribute avec des setters et des getters c'est justement pouvoir te passer d'appeler directement les fonctions get_Etape ou set_Etape (en dehors de ton script Quete tout du moins). Donc en supposant que la première ligne de code que tu donnes se trouve dans un script de pièce, ou même dans le Global Script, tu devrais directement faire if (quete[0].Etape == 0)

@filoulefilou a écrit:
En gros, je voudrais avoir un Gui qui afficherait les descriptions de chacune des quête selon leur avancement dans un Label.Text, en listant les noms des quêtes dans une Listbox.
Oui tu me parais plutôt bien parti pour ça. Mais c'est vrai que si t'es pas super habitué aux struct et aux tableaux, ça peut prendre un peu de temps avoir de se faire une idée claire de comment toutes ces choses là sont organisées au niveau du script.

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMar 23 Avr 2019 - 7:58

Alors, en inscrivant quete[0].set_Etape(0) durant un dialog, j'ai un crash du type "Null Pointer référence" ! hm...?
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMar 23 Avr 2019 - 14:44

@filoulefilou a écrit:
Alors, en inscrivant quete[0].set_Etape(0) durant un dialog, j'ai un crash du type "Null Pointer référence" ! hm...?
Comme je disais à la fin de mon message précédent, l'idée c'est de ne pas utiliser les setter et getter en dehors du script Quete, mais plutôt de manipuler la variable de type attribute comme si c'était une variable ordinaire (alors qu'en fait, sous le capot, chaque fois que tu redéfinis la variable ça appellera set_Etape et chaque fois que tu accéderas à la valeur ça appellera get_Etape).

Dans ton script de dialogue donc, tu peux tranquillement faire quete[0].Etape = 0 et toute ta machinerie attribute avec ta fonction setter se chargera de contrôler et synchroniser les valeurs.

Je soupçonne que ton problème de Null pointer vient de ta boucle for : en l'état, elle commence par regarder la ligne de ListQueteOn à l'index 0 et, si ça correspond pas à this.name, ça va à l'index 1, puis l'index 2, et ainsi de suite tant que ça trouve pas this.name dans la liste. Dans le cas où this.name ne se trouve tout simplement pas du tout dans la liste, n continuera d'augmenter jusqu'à dépasser la valeur du dernier index de ListQueteOn, et alors tu te retrouveras à tenter de référer à un index dépassant la borne de ListQueteOn, ce qui causera le problème que tu rapportes.
La boucle for que tu cherches à écrire c'est probablement plutôt for (n=0 ; n < ListQueteOn.ItemCount ; n++)

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMar 23 Avr 2019 - 15:54

Hum, je doutais que le problème vienne du for, tout simplement parce que la condition de lancement de cette for était que quete[0].Etape soit à 100. Dans le doute, j'ai quand modifié cette for.
Le problème reste le même.

J'ai dû me mélanger les panards quelque part.

Code:
// header
struct Objectif {
  protected int etape;
  import attribute int Etape;
  import void get_Etape();                   
  import void set_Etape(int etape);
 
  String name;   
           
  String description; 

 
  String etat_de_quete;

  bool Enregistrement; 
};


import function ini_Quete();
import Objectif quete[];

et

Code:
 //Quete.asc


 
 Objectif quete[];


function ini_Quete() {
 
 
 quete[0].name="Test 0";

} // Je lance cette fonction au démarrage du jeu, dans le Game Start du Global Script.





 void Objectif::get_Etape() {
 
 }


void Objectif::set_Etape(int etape) {
 
 

 
 
  this.etape = etape;
 
  if (etape < 0) { this.etat_de_quete = "null" ; this.Enregistrement = false;} // etape -1 => "null" ; etape 100 => "valide" ; etape >-1  <100 => "encours"
  else if (etape == 100) this.etat_de_quete = "valide";
  else { this.etat_de_quete = "encours"; this.Enregistrement = true; }
 
 
 

 
  //////////////// Retire de la liste la quête validée//
       
  if ((this.etape == 100) && (this.Enregistrement == true)) {
    int n;
    for (n=0;  n < ListQueteOn.ItemCount ;n++){
      if (ListQueteOn.Items[n]== this.name) {
        ListQueteOn.RemoveItem(n);
        ListQueteOff.AddItem(this.name);
      }
    }
    this.Enregistrement = false;
  }
 
  ///////Ajouter la quête non enregistrée ////
       
  if (this.etape == 0 && this.Enregistrement == false) {
    ListQueteOn.AddItem(this.name);
  }


 }
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMar 23 Avr 2019 - 18:07

Est-ce que tu instancies ton tableau quete quelque part ?
En l'état actuel tu déclares l'existence d'un tableau dynamique avec la ligne Objectif quete[]; mais tu ne l'instancies jamais : AGS n'a aucun moyen de savoir, à un moment donné, combien d'entrées il y a dans ton tableau. Si tu as un nombre fixe de quêtes dans ton jeu (par exemple, 10) je te conseille d'utiliser un tableau statique : Objectif quete[10];

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMer 24 Avr 2019 - 5:26

Bon, c'est officiel ! Je suis TOTALEMENT perdu.
C'est toujours un peu le bordel dès que je veux scripter en dehors du GlobalScript.
Dans l'ordre, j'ai déjà fait des struct, comme expliqué dans la notice et ça fonctionne...
De ce genre :
Code:
struct Weapon {
  int damage;
  int price;
  String name;
};



// at top of script
Weapon weapons[10];

Mais alors dès qu'il faut passer par l'import, les header ...etc ! Là, c'est le bordel.
Je dois dire que voulant plus ou moins faire la même chose que dans l'exemple, je me retrouve avec des messages des bugs plutôt chelou... Concrètement, je ne sais pas trop où foutre
Code:
Objectif quete[10];
 !

Si je me le mets au top du script Quete (comme expliqué dans la notice) , il me dit :
Code:
Attributes of identifier do not match prototype


Dans le Header, j'inscris
Code:
import Objectif quete[];
pour eviter le msg d'erreur (...)export quete (...) " quete is not an array"  et là, j'ai comme msg d'erreur : " cannot export an import" qui semble indiqué un problème au niveau de mon
Code:
export quete;
situé a la fin de mon code dans Script.
Code:
export quete[10];
ne fonctionne pas non plus.


En gros, j'ai des erreurs qui se répondent comme une sorte de Ping-Pong ! Je ne peux pas tout simplement déclarer ma struct dans le Header.
Puis instancier le tableau dans le top du Script.
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyMer 24 Avr 2019 - 15:11

Voilà un code qui marche :

Quete.ash
Code:
struct Objectif {
  protected int etape;
  import attribute int Etape;
  import int get_Etape();                  
  import void set_Etape(int etape);
 
  String name;  
          
  String description;
 
 
  String etat_de_quete;
 
  bool Enregistrement;
};
 
import Objectif quete[10];

Quete.asc
Code:
Objectif quete[10];
 
 int Objectif::get_Etape() {
   return this.etape;
 }
 
 
void Objectif::set_Etape(int etape) {
  
  this.etape = etape;
 
  ///////Ajouter la quête non enregistrée ////
      
  if (this.etape == 0 && this.Enregistrement == false) {
    ListQueteOn.AddItem(this.name);
  }
 
  if (etape < 0) { this.etat_de_quete = "null" ; this.Enregistrement = false;} // etape -1 => "null" ; etape 100 => "valide" ; etape >-1  <100 => "encours"
  else if (etape == 100) this.etat_de_quete = "valide";
  else { this.etat_de_quete = "encours"; this.Enregistrement = true; }
 
 
  //////////////// Retire de la liste la quête validée//
      
  if ((this.etape == 100) && (this.Enregistrement == true)) {
    for (int n=0 ; n < ListQueteOn.ItemCount ; n++){
      if (ListQueteOn.Items[n]== this.name) {
        ListQueteOn.RemoveItem(n);
        ListQueteOff.AddItem(this.name);
      }
    }
    this.Enregistrement = false;
  }
}

export quete;

Comme tu peux le voir, j'importe quete comme un tableau Objectif de taille 10, et je l'exporte sans préciser son type (tel qu'indiqué dans le manuel).

J'ai aussi fait quelques modifications. La première c'est que j'ai défini get_Etape comme un int plutôt que void, puisque l'idée c'est justement de retourner la valeur de this.etape (ce que fait désormais la fonction).
J'ai aussi monté plus haut le bout de code qui gère l'ajout des quêtes non enregistrées, puisque tel qu'était ton code, ton else se chargeait de définir this.Enregistrement à true dès que this.etape valait 0, et du coup la condition pour ajouter à ListQueteOn était jamais satisfaite.

Je me suis aussi débarassé de ini_Quete parce que j'aimais pas être obligé de passer par set_Etape plutôt que directement modifier la valeur de Etape. Du coup j'ai mis ça dans ma fonction game_start du Global Script :
Code:
function game_start(){
  quete[0].name = "Test 0";
  quete[0].Etape = 0;
}

Histoire de pouvoir tester un peu, j'ai aussi mis ça dans ma fonction on_key_press du Global Script :
Code:
function on_key_press(int keycode){
  if (keycode == eKeySpace)
    quete[0].Etape++;
}

Lorsque je lance la partie, j'ai bien Test 0 qui apparaît dans ma ListQueteOn, et si j'appuie une centaine de fois sur la touche espace, la ligne disparaît de ListQueteOn et apparaît dans ListQueteOff.


Ton message "Attributes of identifier do not match prototype" venait du fait que tu déclarais ton tableau quete comme un tableau statique de taille 10, mais après la ligne import que tu donnes essaye de l'importer comme un tableau dynamique (parce qu'elle ne contient pas le nombre 10 entre les crochets).

C'est un peu crade et déroutant la façon dont c'est fait, mais en gros voilà la règle : tu crées ta variable en haut du corps de ton script avec son type et tout et tout, tu copie-colles exactement la même ligne dans ton en-tête que tu précèdes avec le mot-clé import, puis tu ajoutes tout en bas du corps de ton script export suivi du nom de ta variable sans son type ni rien d'autre, juste le nom.

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou

Nombre de messages : 347

Date d'inscription : 24/05/2010


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyJeu 25 Avr 2019 - 8:32

Merci !
Je n'aurais jamais trouvé.
C'est d'autant plus frustrant que déclarer deux fois Objectif quete[10] , une fois en import , une fois dans le corps du script ne me serait jamais venu a l'idée, pour la simple raison que souvent lorsqu'on déclare une variable en import, il ne faut plus la déclarer dans le corps du script au risque d'avoir le msg d'erreur comme quoi cette variable "is already declared" et visiblement ...pour cette fois-ci ...nan grand sourire
C'est a rendre zinzin Les Struct / Les scripts ... et la logique AGS ? 1507758844
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai

Nombre de messages : 2815

Date d'inscription : 01/08/2006


Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? EmptyJeu 25 Avr 2019 - 14:33

Oui c'est un peu contre-intuitif, mais en gros dis toi que la vraie déclaration se trouve dans le corps du script, et le import dans l'en-tête est juste un artifice copié aux scripts plus bas pour référer à la variable précédemment déclarée dans le corps du script.

Autrement dit, imagine que le import n'existe que pour les scripts plus bas mais n'a de sens que s'il existe une vraie déclaration plus haut : comme ça, pas de message comme quoi la variable serait déjà déclarée dans ton script Quete (puisqu'import ne le vise pas) et pas de message comme quoi le nom de variable pointerait vers rien dans les scripts plus bas (puisqu'il pointe vers la vraie variable dans Quete plus haut).

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Contenu sponsorisé




Les Struct / Les scripts ... et la logique AGS ? Empty
MessageSujet: Re: Les Struct / Les scripts ... et la logique AGS ?   Les Struct / Les scripts ... et la logique AGS ? Empty

Revenir en haut Aller en bas
 
Les Struct / Les scripts ... et la logique AGS ?
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Logique provençale
» La logique Interne du combat médiéval
» La logique de Pokémon en vrai
» La suite logique...ou pas
» Script météo Zscripts en panne ?

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: