Forums Développement Multimédia

Aller au contenu

Mon event ne remonte pas jusqu'au parent

CODE Actionscript

4 réponses à ce sujet

#1 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 26 December 2012 - 10:12 AM

Bonjour à tous,

Aujourd'hui, je rencontre un problème d'event dispatcher...

Après une première bataille, où je découvrait que les fonctions de type 'static' ne peuvent pas émettre d'évènement (si quelqu'un peut m'expliquer pourquoi je serais très intérréssé), je m'aperçois que mon évènement ne semble pas remonter jusqu'au parent, qui dans ce cas n'est autre que l'application elle même.

J'en appelle donc a votre aide afin de comprendre ce qui bloque mon processus.

Explications :

Objectif : charger et stocker une suite de bitmap l'un après l'autre, en attendant que chaque chargement soit complété avant d'entamer le suivant.


Fichier d'application xml :

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:s="library://ns.adobe.com/flex/spark"
          frameRate= "24"
       
          backgroundColor="0x000000"
       
          resizeForSoftKeyboard="true"
       
          splashScreenImage="@Embed('icons/splashscreen.png')"
          splashScreenScaleMode="letterbox"
       
          creationComplete="startup(event)">


<fx:Script>
   <![CDATA[
        import configs.*;  
        import events.*;
        import mx.events.FlexEvent;  
        import utils.*;
 
 
    // la classe qui s'occupe de charger mes bitmaps, ici je l'instancie car je ne peux dispatcher d'event depuis des functions statiques
        private var bitmapFactory  :Bitmap_Factory  = new Bitmap_Factory ();
 
 
                                               
        private function startup (e:FlexEvent):void
        {
        loadAssets ();
        }
      // Je charge un fichier cible
          private function loadAssets () : void
          {
           addEventListener(ContextEvent.BITMAP_LOAD_COMPLETE, onBitmapLoadComplete);
           bitmapFactory.loadBitmap('assets/btn_bonus.png');
          }
       
      // lorsque je recois l'event Complete du chargement
          private function onBitmapLoadComplete (e:ContextEvent):void
          {
           trace ('load completed');
           this.addChild(e.data);
          }
 
       
   ]]>
</fx:Script>

</s:Application>
 


La classe ContextEvent

package events
{

import flash.events.Event;
public class ContextEvent extends Event
{

  public static var BITMAP_LOAD_COMPLETE  :String = 'BITMAP_LOAD_COMPLETE';


  public var data :* = null;

  public function ContextEvent (type:String, data:* = null, bubbles:Boolean=true, cancelable:Boolean=false):void
  {
   super (type, bubbles, cancelable);
   this.data = data;
  }
}
}
 


La classe Bitmap_Factory qui s'occupe de générer des bitmaps

package utils
{
import events.ContextEvent;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLRequest;

public class Bitmap_Factory extends EventDispatcher
{

  private static var loader:Loader = null;

  // cette function cree le loader et charge l'image cible
  public function loadBitmap (source:String) : void
  {
   trace ('loading');
   loader  = new Loader ();
 
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadBitmapComplete);
   loader.load(new URLRequest(source));
  }

    // lorsque l'image est chargé, je la traite pour en faire un bitmap, puis je dispatche l'event voulu
        private function onLoadBitmapComplete (e:Event) : void
        {
         trace ('loaded');
         loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoadBitmapComplete);
       
         var img   :Bitmap   = new Bitmap ();
       
         var imgData:BitmapData = new BitmapData (loader.width, loader.height, true, 0xFF0000);
         imgData.draw(loader);
       
         img.bitmapData = imgData;
         img.smoothing  = true;
       
         dispatchEvent(new ContextEvent(ContextEvent.BITMAP_LOAD_COMPLETE));
        }

}
}
 


Mes traces démontrent que : 1 Le bitmap est bel et bien chargé, 2 L'event ContextEvent..BITMAP_LOAD_COMPLETE est envoyé, 3 la fonction onBitmapLoadComplete de l'application mère n'est jamais appellée.

#2 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 26 December 2012 - 11:18 AM

Salut

Il faut abonner l'événement sur la référence qui le dispatch.

bitmapFactory.addEventListener(ContextEvent.BITMAP_LOAD_COMPLETE, onBitmapLoadComplete); dans ta classe mère

Bonne fêtes.
Morgan
Word hard, play hard.

#3 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 26 December 2012 - 12:15 PM

Coucou,

Hum merci, mais je ne comprends pas pourquoi mon application ne peut pas écouter d'évènement a l'aveugle pour le coup. Dans une autre application que j'ai créé, je peux écouter des évènements du ContextEvent sans forcement abonner l'évènement a une quelquonque référence.

Aurais-tu la gentillesse de m'expliquer pourquoi, dans ce cas précis, l'écoute a l'aveugle ne fonctionne pas ?

Merci beaucoup, bonnes fêtes a toi aussi !

#4 çayjb

    dadaaaa

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2770 messages

Posté 26 December 2012 - 13:27 PM

Salut,

le phénoméne que tu décris n'est possible que sur des élèments présents dans la liste d'affichage. Ce n'est sans doute pas le cas de ta factory.

Sinon la classe EventDispatcher est conçue pour foncionner avec des instances tout simplement, on peut trouver des tricks, mais bon le besoin est assez rare (d'ou l'absence peut-etre), mieux vaut rejeter un oeil à la conception avant, on tombe facilement dans le principe pernicieux des variables globales :P

#5 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 26 December 2012 - 21:22 PM

Coucou,

Ha d'accord, je comprends mieux, en effet l'usine a bitmap n'est pas dans la liste d'affichage ^^.
Merci pour les explications et les liens!



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)