Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -47%
SAMSUNG T7 Shield Bleu – SSD Externe 1 To ...
Voir le deal
89.99 €

 

 La get_ set_ !

Aller en bas 
2 participants
AuteurMessage
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


La get_ set_ ! Empty
MessageSujet: La get_ set_ !   La get_ set_ ! EmptyJeu 14 Juil 2022 - 18:30

Salut à tous !

Alors voilà je me lance. Voilà depuis 2 ans que j'ai commencé AGS, et je peux dire que j'ai énormément progressé grâce à votre communauté !

J'ai eu envie de revenir sur un truc qu'on m'avait fait, ce qui m'a bien aidé, mais je n'ai jamais compris comment ça marchait. Il est temps de dissiper le brouillard !

@Arlann (de ce forum, encore merci à lui !) m'avait créé une structure pour gérer les personnages de mon jeu.

Voilà comment ça se présentait dans le .ash :

Code:

struct Personnage
{
// un exemple de variables gérées par la struct grâce à des Get/Set
  import attribute int Blessure, Maladie, Zombivant, Infecte; // L'usage de ces variables est protégé par la struct
  protected int blessure, maladie, zombivant, infecte;
  import attribute bool Mort;
  protected bool mort;
  // les fonctions suivantes sont internes à la struct, elles ne peuvent pas être appeler directement
  import int get_Blessure(); // $AUTOCOMPLETESTATICONLY$
  import void set_Blessure(int _blessure); // $AUTOCOMPLETESTATICONLY$
  import int get_Maladie(); // $AUTOCOMPLETESTATICONLY$
  import void set_Maladie(int _maladie); // $AUTOCOMPLETESTATICONLY$
  import int get_Infecte(); // $AUTOCOMPLETESTATICONLY$
  import void set_Infecte(int _infecte); // $AUTOCOMPLETESTATICONLY$
  import int get_Zombivant(); // $AUTOCOMPLETESTATICONLY$
  import void set_Zombivant(int _zombivant); // $AUTOCOMPLETESTATICONLY$
  import bool get_Mort(); // $AUTOCOMPLETESTATICONLY$
  import bool set_Mort(); // $AUTOCOMPLETESTATICONLY$
};

Quelqu'un pourrait me dire comment ça marche les variables protégées par la structure ? Et ce que ça implique ? Les "$AUTOCOMPLETESTATICONLY$" veulent dire quoi ? Comment on les utilise ? et doit-on obligatoirement utiliser les préfixes "get_" et "set_" ?

Parce que j'ai l'impression de voir ce que ça produit en jeu, j'ai l'impression que les int protégées appellent les fonctions "set_" lorsqu'on fait par exemple "personnage.blessure++". Je me demande juste comment tout ça fonctionne concrètement. J'ai rien vu à ce propos dans le manuel. C'est un secret d'AGS ? grand sourire
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 : 2907

Date d'inscription : 01/08/2006


La get_ set_ ! Empty
MessageSujet: Re: La get_ set_ !   La get_ set_ ! EmptyJeu 14 Juil 2022 - 20:08

Tu trouveras des infos (en anglais) sur protected ici mais aussi ici

Quand tu utilises ce mot-clé devant une déclaration de variable dans struct, ça fait que la variable en question peut être accédée uniquement depuis l'intérieur d'une méthode de cette structure, via le mot-clé this. Par exemple, si tu as une instance de Personnage nommée mettons raoul, tu pourras pas faire simplement Display("Raoul a %d blessure", raoul.blessure); : ça déclenchera une erreur, parce que tu y accèdes via raoul dans la commande Display, qui se trouve (probablement) dans un environnement qui n'est pas une méthode de la structure Personnage. De même, tu peux pas essayer de faire raoul.blessure = 0; dans l'espoir d'annuler les blessures, puisque la variable est protégée en lecture aussi bien qu'en écriture : la seule façon de faire ce serait d'utiliser this.blessure = 0; dans un environnement où this renvoie bien à l'instance, c'est-à-dire dans une méthode de la structure Personnage

Note que le mot-clé writeprotected est un peu plus libéral : si tu avais utilisé writeprotected à la place de protected dans le code de ton message, AGS te laisserait faire Display("Raoul a %d blessure", raoul.blessure); (accès à la variable en lecture, ce qui est autorisé par writeprotected) mais continuerait de t'empêcher de faire raoul.blessure = 0; (accès en écriture, toujours pas autorisé par writeprotected)

Les préfixes get_ et set_ dans les noms de méthodes vont de paire avec les mot-clés import attribute, comme expliqué dans la page "Object Oriented Programming" dont j'ai donné le lien plus haut. Ça permet de définir des attributs auxquels tu pourras référer comme tu réfèrerais à des variables (non-protégées) d'une instance de structure (donc par exemple Display("Raoul a %d blessure", raoul.Blessure); ou encore raoul.Blessure = 0; -- cette fois avec une majuscule) alors qu'en réalité le programme exécute une fonction dans ces cas là. Autrement dit, les exemples que je viens de donner sont équivalents à Display("Raoul a %d blessure", raoul.get_Blessure()); et raoul.set_Blessure(0);. Ça peut paraître inutilement compliqué, mais c'est utile notamment pour empêcher par exemple qu'un attribut puisse avoir une valeur négative : en ajoutant quelque chose comme if (_blessure < 0) this.blessure=0; dans set_Blessure, tu peux t'assurer que get_Blessure (et donc par conséquent raoul.Blessure) ne retournera jamais de valeur négative, puisque get_Blessure retourne la valeur de la variable blessure, qui est protégée en écriture et uniquement définie dans set_Blessure à une valeur toujours (null ou) positive

Enfin, les commentaires spéciaux $AUTOCOMPLETEIGNORE$ ont pour effet de garder le nom de l'élément importé hors de l'autocomplétion lorsque tu tapes du code dans une fenêtre de script. Puisqu'on se donne le mal de créer un attribut Blessure utilisable comme une simple variable (alors qu'en réalité on exécute les fonctions get_Blessure et set_Blessure sous le capot) ce serait con d'encourager le programmeur à malgré tout utiliser les fonctions en faisant apparaître leur nom dans l'autocomplétion, en plus de créer de la redondance

_________________
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
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


La get_ set_ ! Empty
MessageSujet: Re: La get_ set_ !   La get_ set_ ! EmptyJeu 14 Juil 2022 - 20:33

Whaoo, merci beaucoup Kitai ! C'est super clair, merci beaucoup !

Tu es le Gandalf de ce forum sourire
Revenir en haut Aller en bas
Contenu sponsorisé





La get_ set_ ! Empty
MessageSujet: Re: La get_ set_ !   La get_ set_ ! Empty

Revenir en haut Aller en bas
 
La get_ set_ !
Revenir en haut 
Page 1 sur 1

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: