SharedObject : problème avec le passage de variable par référence

Résolu
Ranzac Messages postés 3 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 14 décembre 2009 - 12 déc. 2009 à 22:19
Ranzac Messages postés 3 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 14 décembre 2009 - 14 déc. 2009 à 21:36
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

cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 1
14 déc. 2009 à 10:23
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....=]
3
Ranzac Messages postés 3 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 14 décembre 2009
12 déc. 2009 à 23:44
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
0
Ranzac Messages postés 3 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 14 décembre 2009
14 déc. 2009 à 21:36
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 :)
0
Rejoignez-nous