SharedObject : problème avec le passage de variable par référence [Résolu]

Signaler
Messages postés
3
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
14 décembre 2009
-
Messages postés
3
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
14 décembre 2009
-
Bonjour le forum,

J'ai un petit soucis avec Flash 8 dont je n'ai pas trouvé la solution sur internet...

Je programme le système de sauvegardes d'un jeu. Je souhaite créer 3 sauvegardes possibles : j'ai donc créé un sharedObject qui est un tableau d'enregistrements, chaque ligne contenant les données d'une sauvegarde.
_root.sauvegarde.data.Jeu = new Array(4);
for(i=1;i<4;i++)
{_root.sauvegarde.data.Jeu[i]=new Object;}

(en fait le tableau fait 4 lignes parce que je n'utilise pas la ligne zéro, pour une raison de clarté de numérotation)

Donc, quand je sauvegarde sur la piste 2, je fais tout simplement :
_root.sauvegarde.data.Jeu[2]=_root.Jeu;
_root.sauvegarde.flush();

(_root.Jeu est l'enregistrement de toutes les variables qui stockent la progression dans le jeu, il contient donc des données de plusieurs sortes : Number, String, Array)

Si c'est la première fois que je sauvegarde, on obtiendra, pour chaque variable, sur les différentes lignes :
undefined
"valeur 2"
undefined

Pour l'instant tout marche parfaitement.

Si ensuite quelques temps plus tard je sauvegarde sur la piste 3, même manipulation :
_root.sauvegarde.data.Jeu[3]=_root.Jeu;
_root.sauvegarde.flush();


Mais là, ô stupeur : toutes les valeurs de la 2ème sauvegarde ont été changées. Pour chaque objet, on obtient sur les différentes lignes :
undefined
"valeur 3"
"valeur 3"


En fait le code su comporte comme si les variables des objets sauvegardés étaient passées par référence et non par valeur : toute modification ultérieure d'une variable du jeu affecte toutes les sauvegardes (toutes les lignes de l'Array sharedObject).

Je n'arrive pas à passer ces variables par valeur... Comment faire ? Merci pour votre aide !

3 réponses

Messages postés
1378
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
1 novembre 2010
1
Salut,
je dirais même : ainsi va la dure loi de la programmation objet !
C'est pour cela que j'implémente toujours ces deux méthodes à une classe : MaClasse.copy( o:MaClasse):void et MaClasse.clone() :MaClasse
La première récupère toute les propriétés de l'objet 'o' et l'assigne à l'objet courant. Et la seconde renvoie une copie de l'objet courant.
Tu peux aussi créer des méthodes qui "serialize" ou "deserialize" ton objet.

bali_balo....=]
Messages postés
3
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
14 décembre 2009

Bon, je crois que j'ai trouvé ma réponse en fouillant un peu... Avec actionscript les types complexes comme les objets (classe Object, appelés "enregistrements" dans ma folle jeunesse) sont forcément passés par référence, et jamais par valeur.

D'après ce que j'ai compris, on ne peut donc pas initialiser un objet indépendant avec les valeurs d'un autre par une seule ligne de code : il faut le faire variable par variable.

C'est triste, mais ainsi va la dure loi d'actionscript
Messages postés
3
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
14 décembre 2009

Merci pour les éclaircissements ! Mais comme je ne suis pas un pro de la programmation orientée objet, j'en profite pour abuser : tes classes "copie" et "clone" sont codées comment ? "A la barbare" en listant à la main tous les attributs de l'objet à copier, ou il y a une astuce de code pour faire ça plus rapidement ?

Tu peux aussi créer des méthodes qui "serialize" ou "deserialize" ton objet.

Et là du coup j'ai pas compris du tout, mais ça a l'air super intéressant, alors je veux bien une petite explication :)