Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [AS3] Assegnare valori di posizione a moviclip ricavandoli da una classe

    ho una classe che mi legge un file xml e ne ricava dei valori. Questa classe viene richiamata poi dalla document class (con import). Ho dei movieclip sullo stage e vorrei assegnare i valori dell'xml alla x e y di ogni moviclp... come si fa? lo trovo impossibile... prima era tanto semplice....

    vi posto la classe che legge l'XML che ho ritoccato da roba trovata in giro...
    Codice PHP:
    package lib.utility //percorso (cartelle) in cui si trova la classe
    {
        
    import flash.display.MovieClip;
        
    import flash.events.*; //senza non fungono gli eventi
        
    import flash.net.*;  //senza non funge urlloader
        
    import flash.display.Sprite;

        public class 
    CaricaXML extends MovieClip {
            var 
    xmlData:XML = new XML();
            public function 
    CaricaXML()
            {
                
    trace('La Document Class di CaricaXML è stata instanziata correttamente');
                
    //parto con la funzioncina per caricare XML
                
    var xmlLoader:URLLoader = new URLLoader();
                var 
    nomeXML:String "data/percorsi.xml";
                
    xmlLoader.addEventListener(Event.COMPLETELoadXML);
                
    xmlLoader.load(new URLRequest(nomeXML));
                
                  
    //fine della funzioncina per caricare XML
            
    }
                    
            private function 
    LoadXML(e:Event):void  {
                  
    xmlData = new XML(e.target.data);
                  
    ParseXML(xmlData);  
                }
                
            
            function 
    ParseXML(recordXMLInput:XML):void  {
                  var 
    recordXMLChildren:XMLList recordXMLInput.percorso.children();
                  var 
    i:int 0;
                  for 
    each (var XMLInfo:XML in recordXMLChildren)  {
                    
    trace(XMLInfo+" "+XMLInfo.attribute("h"));
                    
    this["mc"+i].XMLInfo.attribute("coords"); //ovviamente questa riga non funziona....
                    
                  
    }
                }
                
    //fine functions
            
    }

    sul fla ho questa funzione che genera i movieclip...
    Codice PHP:
    for (var i:int 0i<10i++) {
        var 
    mc:citystart = new citystart();
        
    mc.name "mc"+i;
        
    mc.+= 100*i//in realtà vorrei dargli i valori che ho in un xml...
        
    mc.+= 100*i;
        
    mc.nomecitta.nomecity.htmlText="mc"+i;
        
    addChild(mc);
    }

    vi ringrazio anticipatamente... 
    Rey
    La vita è un panaro, non sai mai quello che ti esce!
    photorealistic 3D rendering and animations and WEB Design

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Se vuoi utilizzare una classe esterna per gestire il caricamento di un determinato xml, devi comunque tener conto del fatto che i dati saranno disponibili solo a caricamento effettuato (perciò sull'evento COMPLETE).

    Per specificarti meglio il discorso avrei però bisogno dello schema xml che intendi utilizzare per la tua applicazione.

    In ogni caso ti assicuro che è molto più facile ora gestire gli xml, grazie al supporto pieno dell'E4X.

  3. #3
    ti ringrzio per la risosta...

    ecco l'XML che utilizzo...

    Codice PHP:
    <?xml version="1.0" encoding="UTF-8"?>
    <porti>
            <percorso id="1">
                <partenza coords="123,123">Cagliari</partenza>
                <arrivo h="06:45" h_m="17:08" h_t="12.45" coords="233,234">Roma</arrivo>
                <arrivo h="06:45" h_m="21:00" h_t="12.45" coords="253,244">Genova</arrivo>
                <arrivo h="06:45" h_m="18:15" h_t="12.45" coords="243,114">Napoli</arrivo>            
            </percorso>
            <percorso id="2">
                <partenza coords="12,147">Genova</partenza>
                <arrivo h="06:45" h_m="17:08" h_t="12.45" coords="143,154">Lecce</arrivo>
                <arrivo h="06:45" h_m="21:00" h_t="12.45" coords="1123,434">Cagliari</arrivo>
                <arrivo h="06:45" h_m="18:15" h_t="12.45" coords="333,334">Venezia</arrivo>            
            </percorso>
    </porti>
    e le coordinate di posizionamento sono da estrapolare con uno split dalla proprietà coords...

    oggi pomeriggio faccio due prove e ti dico se ce l'ho fatta... sono un po' ignorantello, ma con tanta voglia di imparare per cui prima provo con le mie mani. oggi ti fo sapere.

    grazie
    Rey
    La vita è un panaro, non sai mai quello che ti esce!
    photorealistic 3D rendering and animations and WEB Design

  4. #4
    Guarda io di solito uso una classe per fare tutti i caricamenti xml, unica cosa li carico solo, mentre il parsing lo faccio dentro la main.
    Questo perchè, a seconda dell'xml, il codice può essere diverso.

    La classe che carica:

    Codice PHP:
    package utils 
    {
        
    import flash.events.Event;
        
    import flash.events.EventDispatcher;
        
    import flash.events.IOErrorEvent;
        
    import flash.net.URLLoader;
        
    import flash.net.URLRequest;
        
        public class 
    LoaderXML extends EventDispatcher
        
    {
            private var 
    loader:URLLoader;
            private var 
    path:String;
            private var 
    file:String;
            private var 
    _xmlData:XML;
            
            static public const 
    END_XML:String "endXml";
            static public const 
    ERROR_XML:String "errorXml";
            
            public function 
    LoaderXML() 
            {
                
    // constructor.
            
    }
            
            public function 
    load(path:Stringfile:String):void
            
    {
                
    this.path path;
                
    this.file file;
                
                
    loader = new URLLoader();
                
    loader.addEventListener(IOErrorEvent.IO_ERRORonError);
                
    loader.addEventListener(Event.COMPLETEonComplete);
                
    loader.load(new URLRequest(path+file));
            }
            
            private function 
    onError(e:IOErrorEvent):void 
            
    {
                
    dispatchEvent(new Event(LoaderXML.ERROR_XML));
            }
            
            private function 
    onComplete(e:Event):void
            
    {
                
    _xmlData = new XML(e.target.data);
                
    dispatchEvent(new Event(LoaderXML.END_XML));
            }
            
            public function 
    get xmlData():XML
            
    {
                return 
    _xmlData;
            }
            
        }

    Mentre questa è un'eventuale main che la usa.

    Codice PHP:
    package 
    {
        
    import flash.display.MovieClip;
        
    import flash.events.Event;
        
    import flash.events.IOErrorEvent;
        
    import flash.events.MouseEvent;
        
    import utils.LoaderXML;
        
        public class 
    Main extends MovieClip
        
    {
            
            private var 
    loaderXML:LoaderXML;
            private var 
    settingData:XML;

            private var 
    photos:Array = [];
            private const 
    PATH_XML:String "data/xml/";
            
            public function 
    Main() 
            {
                if (
    stageinit();
                else 
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            
            private function 
    init(e:Event null):void
            
    {
                if (
    eremoveEventListener(Event.ADDED_TO_STAGEinit);
                
                
    loadSettings();
            }
            
            private function 
    loadSettings():void
            
    {
                
    loaderXML = new LoaderXML();
                
    loaderXML.addEventListener(LoaderXML.ERROR_XMLonErrorSetting);
                
    loaderXML.addEventListener(LoaderXML.END_XMLonCompleteSetting);
                
    loaderXML.load(PATH_XML"config.xml");
            }
            
            private function 
    createMc():void
            
    {
                
    // qui ti fai il ciclo per creare gli mc
            
    }
            
            private function 
    parseSetting():void
            
    {
                
    // qui fai il parsing dell'xml. una volta finito
                // chiami la funzione che crea i tuoi mc
                
    createMc();
            }
            
            private function 
    onErrorSetting(e:IOErrorEvent):void 
            
    {
                
    // gestire l'errore.
            
    }
            
            private function 
    onCompleteSetting(e:Event):void 
            
    {
                
    settingData = new XML(loaderXML.xmlData);
                
    parseSetting();
            }
            
        }
        


  5. #5
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da Kaneda81
    Guarda io di solito uso una classe per fare tutti i caricamenti xml, unica cosa li carico solo, mentre il parsing lo faccio dentro la main.
    Questo perchè, a seconda dell'xml, il codice può essere diverso.
    In generale sono d'accordo, anche io utilizzo una classe esterna con un riferimento, è più naturale quando si usa un approccio oop.

    Comunque, rispondendo alla domanda, così com'è, possiamo avere la classe che carica l'xml scritta in questo modo:
    Codice PHP:
    package {
        
    import flash.events.ErrorEvent;
        
    import flash.events.Event;
        
    import flash.events.EventDispatcher;
        
    import flash.events.IOErrorEvent;
        
    import flash.geom.Point;
        
    import flash.net.URLLoader;
        
    import flash.net.URLRequest;
        public class 
    XMLLoader extends EventDispatcher {
            private var 
    L:URLLoader;
            private var 
    A:Array;
            public function 
    XMLLoader (xml_url:String null):void {
                if (
    xml_urlinit(xml_url);
            }
            public function 
    load (s:String):void {
                
    init(s);
            }
            private function 
    init (s:String):void {
                
    = [];
                
    = new URLLoader(new URLRequest(s));
                
    L.addEventListener(Event.COMPLETEcomplete);
                
    L.addEventListener(IOErrorEvent.IO_ERRORio_error);
            }
            private function 
    complete (evt:Event null):void {
                var 
    xml:XML = new XML(evt.target.data);
                
    parse(xml);
                
    dispatchEvent(evt);
            }
            private function 
    io_error (evt:IOErrorEvent null):void {
                
    dispatchEvent(evt);
            }
            private function 
    parse (xml:XML):void {
                for (var 
    i:uint=0i<xml.percorso.length(); i++) {
                    
    A.push({
                           
    id:xml..@id[i],
                           
    partenza:xml..partenza[i],
                           
    partenza_coords:new Point(xml..partenza[i].@coords.split(",")[0], xml..partenza[i].@coords.split(",")[1]),
                           
    arrivi: [xml.percorso[i].arrivo[0], xml.percorso[i].arrivo[1], xml.percorso[i].arrivo[2]],
                           
    arrivi_coords:[
                                          new 
    Point(xml.percorso[i].arrivo[0].@coords.split(",")[0], xml.percorso[i].arrivo[0].@coords.split(",")[1]),
                                          new 
    Point(xml.percorso[i].arrivo[1].@coords.split(",")[0], xml.percorso[i].arrivo[1].@coords.split(",")[1]),
                                          new 
    Point(xml.percorso[i].arrivo[2].@coords.split(",")[0], xml.percorso[i].arrivo[2].@coords.split(",")[1])                          
                                          ],
                           
    arrivi_h:[
                                     
    xml.percorso[i].arrivo[0].@h,
                                     
    xml.percorso[i].arrivo[1].@h,
                                     
    xml.percorso[i].arrivo[2].@h
                                     
    ],
                           
    arrivi_h_m:[
                                       
    xml.percorso[i].arrivo[0].@h_m,
                                       
    xml.percorso[i].arrivo[1].@h_m,
                                       
    xml.percorso[i].arrivo[2].@h_m
                                       
    ],
                           
    arrivi_h_t:[
                                       
    xml.percorso[i].arrivo[0].@h_t,
                                       
    xml.percorso[i].arrivo[1].@h_t,
                                       
    xml.percorso[i].arrivo[2].@h_t
                                       
    ]
                           });
                }
            }
            public function 
    get data ():Array {
                return 
    A;
            }
        }

    Mentre il codice as per testare il parsing può assomigliare a questo:

    Codice PHP:
    var parser:XMLLoader = new XMLLoader("data/percorsi.xml");
    parser.addEventListener(Event.COMPLETEcomplete);
    function 
    complete (evt:Event null):void {
        var 
    el:Array = evt.target.data;
        
    el.forEach(callback);
    }
    function 
    callback (e:*, i:uinta:Array):void {
        
    trace(e.id);
        
    trace(e.partenza);
        
    trace(e.partenza_coords);
        
    trace(e.arrivi);
        
    trace(e.arrivi_coords);
        
    trace(e.arrivi_h);
        
    trace(e.arrivi_h_m);
        
    trace(e.arrivi_h_t);

    Come puoi vedere la proprietà "data" dell'xmlloader è l'array che contiene una serie di oggetti con le proprietà che fanno parte di ogni nodo dell'xml.

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Mmh, ho notato ora una cosa nell'xml, c'è un nodo partenza e tre nodi arrivo, per ogni nodo percorso, quindi nel parsing bisogna considerare anche quelli.

    edit, ok ho modificato il messaggio precedente con il parsing corretto.

  7. #7
    Ho timore che mi manchino delle basi.... dunque ho fatto queste due prove...

    ho creato un file XMLLoader.as dove ho messo il codice che mi hai scritto...

    poi in un'altro package (game.as legato come DocumentClass al fla principale) lo ho importato ed in questo ho messo il codice per fare il test... ma non ha funzionato...

    in game ho scritto questo...

    Codice PHP:
    package lib //percorso (cartelle) in cui si trova la classe
    {
        
    import flash.display.MovieClip;
        
    //import flash.display.Sprite;
        
    import lib.utility.*;
        
        public class 
    Game extends MovieClip
        
    {
            private var 
    aggiorna:Aggiornamento;
            
            function 
    complete (evt:Event null):void {
                var 
    el:Array = evt.target.data;
                
    el.forEach(callback);
            }
            function 
    callback (e:*, i:uinta:Array):void {
                
    trace(e.id);
                
    trace(e.partenza);
                
    trace(e.partenza_coords);
                
    trace(e.arrivi);
                
    trace(e.arrivi_coords);
                
    trace(e.arrivi_h);
                
    trace(e.arrivi_h_m);
                
    trace(e.arrivi_h_t);
            }        

            public function 
    Game()
            {
                
    trace('La Document Class è stata instanziata correttamente');
                
    aggiorna=new Aggiornamento();
                
                var 
    parser:XMLLoader = new XMLLoader("data/percorsi.xml");
                
    parser.addEventListener(Event.COMPLETEcomplete);
            
                
    //duplico i movieclip delle città
                
    for (var i:int 0i<10i++) {
                    var 
    mc:citystart = new citystart();
                    
    mc.name "mc"+i;
                    
    mc.+= 100*i;
                    
    mc.+= 100*i;
                    
    mc.nomecitta.nomecity.htmlText="mc"+i;
                    
    addChild(mc);
                }
            }
        }

    ma mi è stato restituito un errore:
    1046: Type was not found or was not a compile-time constant: Event.
    function complete (evt:Event = null):void {
    allora ho fatto una seconda prova...
    il file xmlloader lo ho legato direttamente ad un fla...
    e nel fla ho inserito il codice del test...
    ma a questo punto l'errore è:
    1137: Incorrect number of arguments. Expected no more than 0.
    var parser:XMLLoader = new XMLLoader("data/percorsi.xml");
    che mi devo fare?
    Rey
    La vita è un panaro, non sai mai quello che ti esce!
    photorealistic 3D rendering and animations and WEB Design

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Devi importare Event, dove ci sono gli altri import aggiungi: import flash.events.Event

  9. #9
    e se nella document tu creassi un array

    mioarray

    poi passi la document alla classe che ti legge gli xml

    tipo loadXmlClass(this,xmlurl)

    public function load (docClass,s:String):

    e li metti i dati dentro l'array

    docClass.mioarray


    in questo modo hai i dati disponibili nativi nella document


    ovviamente tneendo sempre presente l'evento complete che ti hanno già descritto
    Photogallery Flash Gratis - http://www.flashfiles.biz -
    Template in Flash con pannello di Amministrazione e deeplinking Guarda il template qui

  10. #10
    siete fantastici.
    Grazie. ora faccio le varie prove. Vedo che sta funzionando.
    Rey
    La vita è un panaro, non sai mai quello che ti esce!
    photorealistic 3D rendering and animations and WEB Design

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.