IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Travailler sur les Bitmap, ou sur les loaders directement


Sujet :

ActionScript 3

  1. #1
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Travailler sur les Bitmap, ou sur les loaders directement
    Bonjour à tous,

    Voilà un petit mois que je me forme à FLASH, avec l'AS3 (je n'ai pas connu as1 ni as2).

    Et me voilà confronter à une question assez simple.

    Lorsque je charge via un loader, une image jpg ou png :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var monLoader:Loader = new Loader();
    var monLoaderInfo:LoaderInfo = monLoader.contentLoaderInfo;
     
    monLoader.load(new URLRequest("monImage.png"));
    Si je veux copier mon image chargée dans un nouveau movieClip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var monLoader:Loader = new Loader();
    var monLoaderInfo:LoaderInfo = monLoader.contentLoaderInfo;
     
    monLoader.load(new URLRequest("monImage.png"));
     
    var monMC:MovieClip = new MovieClip();
    monMC = monLoaderInfo.content;
    Cela soulève une erreur, qui indique qu'il y a un problème de type entre Bitmap et MovieClip.

    Mais je souhaiterai tout de même travailler avec cette image.
    Car Si je crée un objet Sprite ou Bitmap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var monLoader:Loader = new Loader();
    var monLoaderInfo:LoaderInfo = monLoader.contentLoaderInfo;
     
    monLoader.load(new URLRequest("monImage.png"));
     
    var monBitmap:Bitmap= new Bitmap();
    monBitmap = monLoaderInfo.content;
    Cela fonctionne, mais je suis incapable de travailler sur mon "monBitmap" en tant qu'objet (movieclip) par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var monLoader:Loader = new Loader();
    var monLoaderInfo:LoaderInfo = monLoader.contentLoaderInfo;
     
    monLoader.load(new URLRequest("monImage.png"));
     
    var monBitmap:Bitmap = new Bitmap();
    monBitmap = monLoaderInfo.content;
     
    var unExemple:Shape = new Shape();
     
    monBitmap.addChild(unExemple);
    Cela ne marchera pas, car on ne peut ajouter un enfant à un objet de type Bitmap

    Donc pour palier à ce problème, la solution est simple :

    Pourquoi essayer de recuperer l'objet Bitemap alors qu'on peut se servir du Loader directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var monLoader:Loader = new Loader();
    var monLoaderInfo:LoaderInfo = monLoader.contentLoaderInfo;
     
    monLoader.load(new URLRequest("monImage.png"));
    //unExemple est un shape crée juste avant
    monLoader.addChild(unExemple)
    Çela fonctionnerai très bien, car l'objet Loader hérite de tel façon :
    Loader => DisplayObjectContainer => InteractiveObject => DisplayObject => EventDispatcher => Object


    Donc ma question au final est (Roulement de tambours !!!!) :

    Est ce "mauvais" de travailler avec les loaders directement, ou est ce que je suis le seul à me prendre la tête à ce point ?

    Car pour l'instant, pour chaque loader que je crée, je copie le bitemap dans un autre objet, et je détruit en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monLoader.unload();
    monLoader = null;
    Pour que lorsque le ramasse miette passera, il ne restera plus rien ^^.

    Merci de vos réponses constructives

    Bonne après midi à tous !

    Si vous avez des questions

  2. #2
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    C'est encore moi ! ^^

    Vu que j'ai peu de retour sur ma question (ici comme sur d'autres forums), alors jme suis repondu tout seul ^^.

    J'utilise le Loader en tant que tel, comme ça, j'économise des ressources, car je transformais mon loader en bitmap.

    En revanche, j'ai besoin d'une explication sur la documentation officielle d'Adobe.

    Documentation ActionScript 3

    A la page "Loader", il y est écrit :

    Héritage : Loader => DisplayObjectContainer => InteractiveObject => DisplayObject => EventDispatcher => Object

    Ce qui signifie que Mon objet Loader hérite bien de DisplayObjectContainer, et c'est bien grâce à DisplayObjectContainer que l'on peut ajouter des enfants dans la liste d'affichage, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var monSprite:Sprite = new Sprite();
     
    var monClip:MovieClip = new MovieClip();
    monClip.addChild(monSprite);
     
    var monLoader:Loader = new Loader();
    monLoader.addChild(monSprite);
    Avec monClip, le "addChild" se passe bien evidement, car MovieClip hérite de DisplayObjectContainer, mais avec l'objet Loader, ca soulève une erreur :

    Error: Error #2069: La classe Loader ne met pas en oeuvre cette méthode.
    at Error$/throwError()
    at flash.display::Loader/addChild()
    at deplacementFluide_fla::MainTimeline/frame1()
    ET pourtant, monLoader hérite bien du même objet DisplayObjectContainer.

    Alors je ne comprend pas bien.

    Merci de m'eclairer sur ce point.

    Bye

  3. #3
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    C'est encore, encore moi !

    Comme j'ai pu avoir une réponse sur un autre post, je donne la réponse ici aussi :

    La doc Abode :
    La classe Loader bloque les méthodes indiquées ci-dessous dont elle hérite, car un objet Loader ne peut disposer que d’un seul objet d'affichage enfant, celui qu’il charge. L'appel des méthodes suivantes renvoie une exception : addChild(), addChildAt(), removeChild(), removeChildAt() et setChildIndex(). Pour supprimer un objet d'affichage chargé, vous devez supprimer l’objet Loader du tableau des enfants de l’occurrence de DisplayObjectContainer parent.
    Voila pourquoi, le fait d'ajouter un enfant à un Loader bug !

    Bonne soirée

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    le plus simple et de faire comme ceci (aprés chargement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var monMC:MovieClip = new MovieClip();
    monMC.addChild(monLoader.content);
    la tu peux faire tout ce que tu veux avec le MC

    et n'oublie pas les écouteurs, ils servent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    monLoader.contentLoaderInfo.addEventListener(Event.OPEN, this.evtDebutChargement);
    monLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.evtErreurChargement);
    monLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , this.evtFinChargement);
    monLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.evtMoteurChargement);
    monLoader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, this.evtHttp);
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  5. #5
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci de ta réponse.

    Je vais pour la compléter aussi.

    Etant donné qu'il est impossible d'utiliser la scène d'un MovieClip crée en AS3, pour des questions d'optimisation, il est préférable d'utiliser plutôt un Sprite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var monSprite:Sprite= new Sprite();
    monSprite.addChild(monLoader.content);
    Voila, bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/12/2014, 14h33
  2. [XL-2007] comparer les données reçues sur un mois et completer les données manquantes par une macro.
    Par wisemanvsfatboy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/11/2010, 17h16
  3. Réponses: 12
    Dernier message: 23/12/2009, 10h56
  4. Réponses: 5
    Dernier message: 19/10/2006, 23h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo