Forums Développement Multimédia

Aller au contenu

Monsieur Spi

Inscrit(e) (le) 10 Mar 2005
Connecté Dernière activité aujourd'hui, 01:01 AM
*****

Messages que j'ai postés

Dans le sujet : optimisation appli, movieClip et autres...

06 July 2017 - 21:13 PM

Citation

Comment ici je peux Rendre l'état de mon objet NULL.

Ma méthode (on a chacun la sienne) c'est d'utiliser des tableaux pour stocker mes objets, puis de parcourir le tableau pour supprimer les références ou gérer les displaylists, ça m'évites à parcourir mes displaylists pour gérer mes objets, peu importe où l'objet est affiché, sa référence est dans le tableau. Il en va de même pour les supprimer.

Un exemple simple :


var unclip:MovieClip();
var stock:Array = [];

for(var i:int; i<10; i++){
        unclip = new MovieClip();
        stock.push(unclip);
        addChild(unclip);
}

// puis plus tard
while(this.numChildren) this.removeChildAt(0);
stock = [];
unclip = null;
 

Une seule variable temporaire (unclip) pour générer tous mes objets.
Tous les objets sont placés dans un tableau et affiché dans un conteneur.
Pour détruire tous les objets je les retires de l'affichage (plus d'objets affichés).
Puis je vide le tableau (plus aucun objet n'existe).
Et je m'assure enfin que la petite variable temporaire est bien vidée (null).

Dans le sujet : optimisation appli, movieClip et autres...

06 July 2017 - 20:48 PM

Citation

Ça efface ok mais non éligible de ce que j'ai compris au garbage collector....

Le Garbage collector passe un peu quand il veut, il supprimera tous les objets n'ayant plus aucune référence ou des références faibles (weaks).
Pour qu'un objet n'ai plus de référence il faut qu'il ne soit plus présent nulle part (dans un tableau, dans un autre objet, etc...), n'ai plus d'écouteur (sauf avec une référence faible : weak) et que la variable soit passée à "null" ou d'utiliser "dispose".

Ce que tu fais avec :
while (this.numChildren) this.removeChildAt(0);

C'est de supprimer des objets de la liste d'affichage, mais les objets continuent d'exister.
Il faut bien comprendre la différence entre un truc qui existe et un truc qui est affiché.
Un objet existe dans le code sans pour autant qu'il soit affiché, donc le retirer d'une liste d'affichage ne suffit pas à détruire l'objet.

Exemple, si je fais :


var monobjet = new MovieClip();
monobjet.x = 120;
trace(monobjet.x);
 

On récupère bien la propriété x de l'objet, pourtant il n'est affiché nulle part.
C'est pour ça que je te dis plus haut que te fier à l'affichage d'un objet pour connaitre son existence n'est pas une bonne solution.

Pour détruire l'objet tu dois faire :

monobjet = null;

Là il est éligible au GC, qui passera quand il veut.

Dans le sujet : optimisation appli, movieClip et autres...

06 July 2017 - 20:40 PM

Citation

2 : Sauf votre Honneur Mr. Spi la propriété du clip est "true" par défaut, qu'il soit affiché ou non, qu'il soit addChildé ou non :

Si tu lis la description de la propriété :


Citation

Indique si l’objet d’affichage est visible ou non. Les objets d’affichage qui ne sont pas visibles sont désactivés. Par exemple, si visible=false pour une occurrence InteractiveObject, il est impossible de cliquer sur cette dernière.

Exemple :
Le code suivant utilise un objet Timer pour appeler une fonction qui modifie de façon périodique la propriété visible d’un objet d’affichage, ce qui produit un effet de clignotement :


import flash.text.TextField;
import flash.utils.Timer;
import flash.events.TimerEvent;

var tf:TextField = new TextField();
tf.text = "Hello.";
addChild(tf);

var tim:Timer = new Timer(250);
tim.start();
tim.addEventListener(TimerEvent.TIMER, blinker);

function blinker(event:TimerEvent):void {
        tf.visible = !tf.visible;
}
 
Donc tu peux utiliser la propriété "visible" pour afficher ou cacher un objet d'affichage, comme un clip ou un sprite.
Puis vérifier que cet objet est visible ou non à n'importe quel moment.
Ca n'a pas de rapport direct avec "addchild" qui ajoute un objet à une liste d'affichage, "visible" indique si ce clip est visible ou pas dans la liste d'affichage (mais il y reste présent).
AddChild permet d'ajouter un objet à une liste d'affichage, par défaut sa propriété est "visible=true" donc par défaut il est aussi affiché, mais tu peux le cacher en passant la propriété à "false", il reste présent mais on ne le vois plus et il n'est plus interactif.

Dans le sujet : optimisation appli, movieClip et autres...

06 July 2017 - 17:45 PM

Salut,

1 - parce qu'un écouteur écoute un événement (click, mousemove, ...), tu ne fais que l'activer ou le désactiver, si tu le désactive sans l'avoir activé il ne fait tout simplement rien, tandis qu'un clip ne peut être effacé si il n'a pas été créé car il n'a pas de référence qui y correspond. Pour effacer ce clip en particulier le programme à besoin de savoir où il se trouve, qui il est, et si il n'est pas créé alors il n'existe pas.

2 - if(this.visible==true)
Un movieClip hérite de DisplayObject (un objet d'affichage de base), pour les propriétés c'est ici : http://help.adobe.co...playObject.html

3 - oui, quand tu créer une variable (var) elle prend de la place en mémoire, si tu la vide (null) alors elle sera supprimée au prochain passage du ramasse miettes (garbage collector), mais la question ainsi que celle du dessus dévoilent un problème de structure de ton code.

Pourquoi créer une variable de type MovieClip si tu n'en as pas besoin dans le programme ?
Crée une variable vide (si tu veux qu'elle soit globale) et valorise là avec un movieClip quand tu en as besoin.

Pourquoi vouloir savoir si un clip est affiché ou pas ?
Tu devrais normalement savoir exactement ce que contiennent tes displayList à n'importe quel moment, si ce n'est pas le cas c'est que tu perds la maitrise de ton code et ne sais plus ce qui est affiché et quand. C'est comme jouer du piano mais devoir regarder le clavier car on ne connaît pas les touches. Prenons l'exemple d'un jeu vidéo, je ne dois en aucun cas regarder ce qu'il se passe à l'affichage pour savoir comment doit réagir mes personnages, l'affichage c'est le truc qu'on fait en dernier après avoir tout calculé dans le code, donc vouloir savoir si un truc est affiché ou pas c'est dépendre de l'affichage pour créer des actions, et ça c'est pas bon, ton programme tourne plus vite que l'affichage ne se crée, tu va donc perdre en précision et dans un jeu ça peut être catastrophique, par exemple pour les collisions ou les événements timés.

Dans le sujet : créer une liste déroulante sous flash cs4

26 June 2017 - 12:42 PM

Re,

Ajouter un calque au dessus de tous les autres, sans images clés dessus (ceci permet au code d'exister au delà de la première image du scénario). Ajouter sur ce calque le code suivant :

// arrêter la lecture
stop();

// ajouter des options à ton select
cbposition.addItem( { label : "test 1"})
cbposition.addItem( { label : "test 2"})
cbposition.addItem( { label : "test 3"})
cbposition.addItem( { label : "test 4"})

// écouter les changements du select
cbposition.addEventListener ("change", changeimage);

// quand l'utilisateur fait un choix
function changeimage (event:Event):void {
        if (cbposition.selectedItem.label == "test 1") gotoAndStop(2);
        if (cbposition.selectedItem.label == "test 2") gotoAndStop(3);
        if (cbposition.selectedItem.label == "test 3") gotoAndStop(4);
        if (cbposition.selectedItem.label == "test 4") gotoAndStop(5);
}
 

Si tu as déjà ajouté des options à ton select (liste déroulante) il est inutile de reprendre les lignes "addItem", ceci ne sert que si tu veux ajouter des options par le code.

Les majuscules sont importantes dans l'écriture du code : "gotoandstop()" ne veut pas dire la même chose que "gotoAndStop()"

Pour savoir quelle option à été choisie, il suffit de regarder son label :


if (cbposition.selectedItem.label == "le label que tu souhaite") {
   // action à déclencher quand on choisi cette option
}

 

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP