[RESOLU]3.6.76 - Instances d'objet sans variables de l'objet

Yop !

Un problème sur lequel je viens de tomber : la version 3.6.76 ne conserve pas les variables d’objets entre l’objet de l’éditeur et ses instances dans le jeu.

C’est à dire : créer un nouvel objet et lui donner des variables d’objet donne des instances d’objet sans ces mêmes variables d’objet (il faut les recréer à la main dans chaque instance).

Il est d’ailleurs difficile dans la dernière version de donner des variables d’objet à un objet (par défaut, il faut sélectionner une instance de cet objet, puis cliquer sur l’objet de l’éditeur pour avoir la fenêtre d’édition des variables).

Bref, un gros bug.

Chez moi, il suffit de cliquer sur l’objet dans l’éditeur d’objet pour voir apparaître la grille de propriété permettant d’éditer les variables d’objets (attention, si on clique sur une instance, on obtient les propriétés de l’instance). De plus, les variables sont bien conservée. :open_mouth:

Crée un nouvel objet sprite.
Dépose le sur la scène (création d’une instance).
Tu n’as plus accès aux “autres propriétés” de l’objet. Seulement à celles de l’instance.

Il faut cliquer sur “groupes” puis recliquer sur l’objet pour voir ses “autres propriétés”.

Ajoute une variable d’objet à l’objet, et clique sur l’instance précédemment ajoutée.
Cette instance n’a pas reçue la variable d’objets.

En effet, la liste des propriétés ne se met pas à jour quand on clique sur l’objet dans l’éditeur d’objets alors que cet objet est déjà sélectionné.
Sinon, si j’ajoute une variable à un objet, elle est bien remise sur ses instances lors de l’aperçu/exécution du jeu. C’est là ou tu sembles avori mal compris le logiciel : les liste des variables d’instance montre les variables que tu définis que pour cette instance (ou les variables d’objet que tu changes par rapport à l’objet, puisque rien ne t’empêche de “redéfinir” une variable), par contre, elle n’affichera pas la liste des variables de l’objet dont l’instance est issue.

Donc, si je crée une variable dans mon objet, il faut que je la crée aussi dans toutes ses instances, passées, présentes et à venir, pour avoir confirmation qu’elles sont bien accessibles et modifiables ?
Parce que c’est le cas actuellement : les variables que je crée dans l’objet ne sont pas répercutées “visuellement” dans les instances de cet objet.


Je n’ai jamais remarqué ce comportement lors des précédentes versions de GD.

Et pour un projet web, comment je fait le debug avec les fenetres de GD depuis le navigateur ? :sunglasses:

Non, tu n’as pas compris. Les variables de l’objet sont bien appliquées à toutes les instances lors du démarrage du jeu et les variables d’instances sont appliquées à leurs instances respectives. Les variables d’objet ne sont néanmoins pas visible dans la liste des variables d’instance mais seront bien mises dans toutes les instances de l’objet.

Si ton objet a maVar = 10 et ton instance a rien, lors de l’exécution, ton instance aura maVar=10.

Ça a toujours fonctionné comme ça.
Par contre, on devrait peut-être rajouter une seconde catégorie Variables dans la grille des propriétés d’instance qui correspond aux variables de l’objet en général pour avoir qqch du genre :
Sans titre.png

Pour le debug en web, tu n’as qu’à afficher le contenu de la variable dans un objet Texte.

Si ça a toujours fonctionné comme ça, je passe en résolu alors.
(mais quelle idée d’autoriser la création de variables uniques à une instance … )

Pour mettre une variable seulement sur cette instance ? Je ne vois pas en quoi ça gène.

En dehors de violer un des fondamentaux de la programmation orientée objet ?

  • Cela oblige le logiciel à garder une trace de toute instance comme étant un objet avec ses propres propriétés/variables.
  • Cela encourage le développeur à moins réfléchir sur ses objets et à leur usage réel en jeu.
  • Cela complexifie le travail des algorithmes, qui doivent vérifier chaque instance au cas où la variable mise en condition serait propre à une instance précise (au lieu de se baser sur la def de l’objet).

C’est quoi le rapport en GD et la POO ?
En outre, les variables ne sont pas stockées comme de vraies variables en C++ (d’ailleurs, rien ne t’oblige de les définir, tu peux utiliser une variable sans jamais la définir dans GD) mais dans un conteneur.

En plus, cela permet mettre une valeur différente à une variable d’objet uniquement pour l’instance : comme si tu construisais un objet avec un autre constructeur que celui par défaut (j’avoue que c’est sûrement l’utilité principale, bcp plus utile que de définir une variable uniquement pour une instance).

Il n’y a pas de violation de “programmation” ou quoi que ça soit.
Les variables d’instances sont juste un moyen facile de définir une valeur spécifique à une instance particulière d’un objet, pour déclarer par exemple que “tel objet que je viens de poser sur la scène doit exploser au lancement” ou que “tel objet doit être considéré comme plus résistant car j’ai augmenter ses PV, mais juste lui”.

Exact, l’utilité principale est simplement de pouvoir spécialiser facilement une instance, pas forcément de lui attribuer des variables qui viennent de nul part.

Vraiment, il faut considérer ça comme une feature, je suis sur que si ça y était pas j’en aurai plein qui me crieraient que c’est un scandale qu’on puisse pas modifier des variables spécifiquement pour une instance alors qu’on peut le faire pour un objet.
Il n’y a aucun perte de performance en plus, les évènements sont optimisés au besoin si les variables sont déclarées dans les objets.

Par contre, et là je rejoins mtarzaim sur ce point, c’est vrai qu’actuellement la limite est très floue.
Le vrai soucis c’est que l’interface est pas claire et donc la solution à chercher c’est :

Comment on fait pour que l’utilisateur voit clairement qu’il peut définir des variables pour un objet, mais qu’au besoin il y aussi la possibilité d’en mettre spécifquement à des instances ? Victor donne un début de solution en séparant par exemple dans la liste les variables d’objets et d’instance.