Aide - Recherche - Membres - Calendrier
Version complète : exporter une variable dans un sandy event...
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Intégration 3D > Sandy
ChapF
Salut à tous.
J'aimerai savoir s'il est possible d'exporter une variable dans un sandyevent, ou trouver un moyen alternatif. Un petit exemple pour voir ce que je veux faire

Action Script

function principal()
{
var ma_var:uint = 1
swf_queue.add( "myClip", new URLRequest("/Site/Flash/pack/pages/text.swf"),ma_var );
swf_queue.addEventListener(SandyEvent.QUEUE_COMPLETE, swf_queue_Complete );
swf_queue.start();
}

function swf_queue_Complete(e:QueueEvent,ma_var)
{
var material01:MovieMaterial = new MovieMaterial(swf_queue.data["myClip"],0,new MaterialAttributes(), false);
var app01:Appearance = new Appearance( material01);

support_swf_list[ma_var][0].getChildByName("screen").appearance = app01;
support_swf_list[ma_var][0].getChildByName("screen").enableForcedDepth = true;
}

Peut être modifier le code de sandy, ou bien une maniere plus simple?
ChapF
Bon j'ai trempé les mains dans l'huile et sa marche, en modifiant le code source de sandy, c'est sale, c'est moche et sa fait tache mais je post quan même la modif pour ceux qui aurrait le même sousci.
Ceci est le contenu modifié de sandy/util/LoaderQueue.as :

Action Script

/*
# ***** BEGIN LICENSE BLOCK *****
Copyright the original author or authors.
Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

# ***** END LICENSE BLOCK *****
*/

package sandy.util
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.utils.Dictionary;

import sandy.events.QueueEvent;
import sandy.events.SandyEvent;

[Event(name="queueComplete", type="sandy.events.QueueEvent")]
[Event(name="queueLoaderError", type="sandy.events.QueueEvent")]

/**
* Utility class for loading resources.
*
* <p>A LoaderQueue allows you to queue up requests for loading external resources</p>
*
* @author Thomas Pfeiffer - kiroukou
* @version 3.0
* @date 26.07.2007
*/
public class LoaderQueue extends EventDispatcher
{
private var m_oLoaders : Object;
private var m_nLoaders : int;
private var m_oQueueEvent : QueueEvent;

public var data:Dictionary = new Dictionary( true );
/**
* Creates a new loader queue.
*
*/
public function LoaderQueue()
{
m_oLoaders = new Object();
m_oQueueEvent = new QueueEvent( QueueEvent.QUEUE_COMPLETE );
}

/**
* Adds a new request to this loader queue.
*
* <p>The request is given its own loader and is added to a loader queue<br/>
* The loding is postponed until the start method of the queue is called.</p>
*
* @param p_sID A string identifier for this request
* @param p_oURLRequest The request
*/
public function add( p_sID : String, p_oURLRequest : URLRequest, p_oArg : * = null ) : void
{
m_oLoaders[ p_sID ] = new QueueElement( p_sID, new Loader(), p_oURLRequest, p_oArg );
// --
m_nLoaders++;
}

private function getIDFromLoader( p_oLoader:Loader ):Array
{
for each( var l_oElement:QueueElement in m_oLoaders )
{
if( p_oLoader == l_oElement.loader )
{
var l_o_Array:Array = new Array (l_oElement.name , l_oElement.arg);
return l_o_Array as Array;
//return l_oElement.name;
}
}
return null;
}

/**
* Starts the loading of all resources in the queue.
*
* <p>All loaders in the queue are started and IOErrorEvent and the COMPLETE event are subscribed to.</p>
*/
public function start() : void
{
for each( var l_oLoader:QueueElement in m_oLoaders )
{
l_oLoader.loader.load( l_oLoader.urlRequest );
l_oLoader.loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeHandler );
l_oLoader.loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler );
}
}

/**
* Fires a QueueEvent, once all requested resources are loaded.
* Type QUEUE_COMPLETE
*/
private function completeHandler( p_oEvent:Event ) : void
{
var l_oLoaderInfos:LoaderInfo = p_oEvent.target as LoaderInfo;
var l_oLoader:Loader = l_oLoaderInfos.loader;

var l_oArray:Array = getIDFromLoader( l_oLoader )
var l_oObject:Object = new Object();
l_oObject.data = l_oLoaderInfos.content;
l_oObject.arg = l_oArray[1];
var l_sName:String = l_oArray[0];
data[ l_sName ] = l_oObject;

// --
m_nLoaders--;
// --
if( m_nLoaders == 0 )
{
m_oQueueEvent.loaders = m_oLoaders;
dispatchEvent( m_oQueueEvent );
}
}

/**
* Fires an error event if any of the loaders didn't succeed
*
*/
private function ioErrorHandler( p_oEvent : IOErrorEvent ) : void
{
trace( p_oEvent.text );

m_nLoaders--;

if( m_nLoaders == 0 )
{
m_oQueueEvent.loaders = m_oLoaders;
dispatchEvent( m_oQueueEvent );
}
}
}
}

import flash.display.Loader;
import flash.net.URLRequest;

internal class QueueElement
{
public var name:String;
public var loader:Loader;
public var urlRequest:URLRequest;
public var arg:*
// --
public function QueueElement( p_sName:String, p_oLoader:Loader, p_oURLRequest : URLRequest, p_oArg:* )
{
name = p_sName;
loader = p_oLoader;
urlRequest = p_oURLRequest;
arg = p_oArg;
}
}


Pour l'utiliser, il faut faire votre code comme suit (en partant de mon exemple premier post):
Attention, mon_LoaderQueue.data["myClip"] ne contient plus l'Object chargé, vous devez aller chercher sa propriété "data", et votre argument sa propriété "arg". Donc :
mon_LoaderQueue.data["myClip"].data contient votre fichier à importer.
mon_LoaderQueue.data["myClip"].arg contient votre argument.

Action Script

function principal()
{
var ma_var:uint = 1
swf_queue.add( "myClip", new URLRequest("/Site/Flash/pack/pages/text.swf"),ma_var );
swf_queue.addEventListener(SandyEvent.QUEUE_COMPLETE, swf_queue_Complete );
swf_queue.start();
}

function swf_queue_Complete(e:QueueEvent)
{
var material01:MovieMaterial = new MovieMaterial(
swf_queue.data["myClip"].data,0,new MaterialAttributes(), false);
var app01:Appearance = new Appearance( material01);
support_swf_list[swf_queue.data["myClip"].arg][0].getChildByName("screen").appearance = app01;
support_swf_list[swf_queue.data["myClip"].arg][0].getChildByName("screen").enableForcedDepth = true;
}


Pour passer plusieurs arguments, utilisez un tableau (cet argument est optionnel mais vous devez quand même utiliser .data pour trouver votre fichier.
ChapF
Y a certainement une manière plus optimisé pour faire sa mais mon language s'arrête aux Array icon_razz.gif

edit :Heu,, je sais pas si j'ai le droit de poster un truc comme sa vis à vis de la licence, j'essaye de la lire mais je comprend rien, moi et l'anglais sa fait 2. Kikourou, tu peu supprimer le post si nécessaire?
kiroukou
Hello,

aucun soucis pour la licence, tu es en plein dedans là de toute façon smile.gif Partager du code basé sur un autre code open source, c'est à ma connaissance toutes les licences open source qui le permettent (celle de Sandy ne l'oblige pas cependant).
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.