Ranzac
Messages postés3Date d'inscriptionjeudi 17 janvier 2008StatutMembreDernière intervention14 décembre 2009
-
12 déc. 2009 à 22:19
Ranzac
Messages postés3Date d'inscriptionjeudi 17 janvier 2008StatutMembreDernière intervention14 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.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 :
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 !
cs_bali_balo
Messages postés1378Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention 1 novembre 20101 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.
Ranzac
Messages postés3Date d'inscriptionjeudi 17 janvier 2008StatutMembreDernière intervention14 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
Ranzac
Messages postés3Date d'inscriptionjeudi 17 janvier 2008StatutMembreDernière intervention14 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 :)