Folosire swf embeduit ca library

Intrebari despre Actionscript 3.0

Folosire swf embeduit ca library

Mesajde ciorty » Vin Aug 03, 2012 10:45 am

Probabil o problema simpla, dar, cel putin pana acum ... indelung provocatoare de dureri de cap......

Deci am un swf cu cateva png-uri incluse in library (nimic added pe scena)
pe care vreau sa-l embeduiesc si sa-l folosesc ca library de assets-uri incluse (chiar aceste png-uri:g1, g2, g3... sunt numele lor din AS Linkage Library)

Am o data...
Varianta 1:
Embeduiesc EXACT un asset component al swf-ului, respectiv fiecare din png-urile din library-ul acestuia.
Exemplu:
Cod: Selectaţi tot

package {   
   import flash.display.*;
   import flash.events.*;
   import flash.net.*
   import flash.geom.*;
   import flash.utils.*;
   
   public class Main extends Sprite {
      [Embed(source = "/../assets/anim/impact1.swf", symbol = "g1")] public var imp1:Class;
      [Embed(source = "/../assets/anim/impact1.swf", symbol = "g2")] public var imp2:Class;
      //etc...
      
      public var seq1 = new imp1()
      
      public function Main(){         
         addChild(seq1)
      }
   }   
}



si, desi imi da o eroare cu privire la "paternitatea" lui seq1,
aceasta folosire a unui asset(png) embeduit individual functioneaza.

Acum incerc si varianta mult mai cuprinzatoare si , evident, mult mai logica:
Varianta 2:
Embeduiesc NUMAI swf-ul in intregul sau si incerc sa extrag ulterior assets-urile(png-urile) , individual din acesta , nu ca "getChild" ci ca "getDefinition" ...

Cod: Selectaţi tot

package {   
   import flash.display.*;
   import flash.events.*;
   import flash.net.*
   import flash.geom.*;
   import flash.utils.*;
   
   public class Main extends Sprite {
      [Embed(source = "/../assets/anim/impact1.swf")] public var imp1:Class;
      
      public var mySwflibs = new imp1()
      
      public function Main(){         
         var instance1:Class = mySwflibs.getDefinitionByName("g1") as Class;// sau asemanator ...
         
         addChild(instance1)//sau asemanator.....
      }
   }   
}



....nu functioneaza

Nu gasesc sub nici o forma varianta corecta de accesare a unui png inclus in library-ul swf-ului embeduit.
O sugestie ?
Multumesc
Ultima oară modificat de ciorty pe Vin Aug 03, 2012 2:58 pm, modificat 1 dată în total.
ciorty
 
Mesaje: 166
Membru din: Dum Aug 24, 2008 2:29 pm

Re: Folosire swf embeduit ca library

Mesajde ciorty » Vin Aug 03, 2012 2:57 pm

Aflu de pe internet ca embedingul nu permite . In fine. Inclin sa cred ca cei care o scriu se inseala.
Aflu ca este posibil doar loadand swf-ul .
Nu am incotro. Raman la folosirea librariei de assetsuri doar prin intermediul swc.
ciorty
 
Mesaje: 166
Membru din: Dum Aug 24, 2008 2:29 pm

Re: Folosire swf embeduit ca library

Mesajde Barna Biro » Sâm Aug 04, 2012 3:44 pm

Working fine for me ( .swf view: http://megaswf.com/s/2460564 ):

Cod: Selectaţi tot
package
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
   
    public class Embedding extends Sprite
    {
        [Embed(source="../assets/swf/Library.swf", symbol="Square")]
        public var SQUARE:Class;
       
        [Embed(source="../assets/swf/Library.swf", symbol="Circle")]
        public var CIRCLE_ANIMATION:Class;
       
        public function Embedding()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.showDefaultContextMenu = false;
           
            // Instantiate and display Square
            var square:Sprite = new SQUARE() as Sprite;
            square.x = (stage.stageWidth - square.width) >> 1;
            square.y = (stage.stageHeight - square.height) >> 1;
            addChild(square);
           
            // Instantiate and display Circle
            var circle:MovieClip = new CIRCLE_ANIMATION() as MovieClip;
            circle.x = circle.y = 50;
            addChild(circle);
        }
    }
}

Incearca sa reproduci problema intr-un proiect nou daca tot nu-ti merge si uploadeaza sursele ;)

Embedding.zip
(8.61 KiB) Descărcat de 215 ori
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Folosire swf embeduit ca library

Mesajde Barna Biro » Sâm Aug 04, 2012 4:13 pm

Additional note: In cazul in care obiectele tale din librarie contin ceva cod AS care vrei sa fie luat in considerare, atunci ba exporti acele obiecte separat ( .swc-uri ), ba embed-ui din prima tot .swf-ul si accesezi obiectele pe urma ( poti implementa un LibraryManager propriu ):

Cod: Selectaţi tot
package
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
   
    public class Embedding extends Sprite
    {
        [Embed(source="../assets/swf/Library.swf", mimeType="application/octet-stream")]
        public var LIBRARY:Class;
       
        public function Embedding()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.showDefaultContextMenu = false;
           
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLibraryLoaded);
            loader.loadBytes(new LIBRARY());
        }
       
        protected function handleLibraryLoaded(event:Event):void
        {
            var loaderInfo:LoaderInfo = event.currentTarget as LoaderInfo;
           
            // Get the "Circle" class definition, instantiate it and display it
            var CircleClass:Class = loaderInfo.applicationDomain.getDefinition("Circle") as Class;
            var circle:MovieClip = new CircleClass() as MovieClip;
            circle.x = (stage.stageWidth - circle.width) >> 1;
            circle.y = (stage.stageHeight - circle.height) >> 1;
            circle.addEventListener("animationEnded", handleAnimationEnded);
            addChild(circle);
        }
       
        protected function handleAnimationEnded(event:Event):void
        {
            trace("Circle animation ended!");
        }
    }
}


Embedding.zip
Embedding .swf that holds ActionScript code.
(9.34 KiB) Descărcat de 212 ori

PS: In cazul in care tot nu executa codul ( desi in mod normal ar trebui sa mearga ), atunci instantiaza si paseaza un LoaderContext la Loader in momentul chemarii metodei loadBytes(); ( context-ul trebuie sa aiba proprietatea "allowCodeImport" setata pe "true" ).
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Folosire swf embeduit ca library

Mesajde Barna Biro » Sâm Aug 04, 2012 4:28 pm

Ok, hai ca spamez acest thread azi calumea :D Doar ce am citit mai bine post-ul tau si am vazut treaba cu "accesarea unui png" din librarie ( nu stiu cum mi-a scapat asta la inceput, dar mi-a scapat ) =)) Accesarea o poti face ca si in ultimul snippet ce am postat ( urmatorul exemplu presupune ca in libraria ta exista un png ( sau alt format grafic valid ) raw care a fost exportat pentru AS, avand numele clasei "Logo" - clasa de baza fiind BitmapData ):

Cod: Selectaţi tot
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
   
    public class Embedding extends Sprite
    {
        [Embed(source="../assets/swf/Library.swf", mimeType="application/octet-stream")]
        public var LIBRARY:Class;
       
        public function Embedding()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.showDefaultContextMenu = false;
           
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLibraryLoaded);
            loader.loadBytes(new LIBRARY());
        }
       
        protected function handleLibraryLoaded(event:Event):void
        {
            var loaderInfo:LoaderInfo = event.currentTarget as LoaderInfo;
           
            var LogoClass:Class = loaderInfo.applicationDomain.getDefinition("Logo") as Class;
            var bitmapData:BitmapData = new LogoClass() as BitmapData;
            var logo:Bitmap = new Bitmap(bitmapData);
            logo.x = (stage.stageWidth - logo.width) >> 1;
            logo.y = (stage.stageHeight - logo.height) >> 1;
            addChild(logo);
        }
    }
}

Sincer, nu vad de ce ai vrea sa faci asa ceva... In locul tau, tineam grafica raw ( png-uri, jpg-uri, etc. ) separat de .swf si le embed-uiam separat, evitand astfel load-uri si accesari oarecum mai "tricky". Anyway, daca totusi vrei, poti sa accesezi pozele raw din librarie just like in the above example...

Varianta embeduirii directe cu "symbol=" ( asa cum ai incercat initial ) nu merge deoarece pozele raw exportate din librarie nu sunt DisplayObject-uri, ci sunt exportate ca si BitmapData. N-am incercat sa vad ce s-ar intampla in cazul schimbarii Base Class-ului in Bitmap din BitmapData ( evident, ar exista si varianta sigura de wrap-uire al pozelor in MovieClip / Sprite si exportate asa ), dar daca vrei ( si esti tare curios ), you can give it a shot yourself...

... hope any of the above examples helped. :geek:
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Folosire swf embeduit ca library

Mesajde ciorty » Sâm Aug 04, 2012 8:19 pm

Excelent, excelent, azi am fost ocupat si abia acum am deschis calculatorul.
Nu cred ca am timp sa desfasor in seara asta FlashDevelop-ul pe solutiile trimise dar chiar si numai citite par a fi solutii perfecte si logice.
Am sa ma ocup de ele si voi scrie rezultatul
ciorty
 
Mesaje: 166
Membru din: Dum Aug 24, 2008 2:29 pm

Re: Folosire swf embeduit ca library

Mesajde ciorty » Dum Aug 05, 2012 1:16 pm

Aici este atashamentul cu modalitatea simplificata a utilizarii, in proiect flashdevelop......
....adica nu mai e. Doamne ce putin se poate uploda!
Voi reveni cu un link cu proiectul pe domeniul meu, dar momentan acesta este inactiv.

codul este asa:
Cod: Selectaţi tot
package
{
   import alternativa.engine3d.core.*
   import alternativa.engine3d.materials.*
   import alternativa.engine3d.objects.*
   import alternativa.engine3d.primitives.*
   import alternativa.engine3d.resources.*
   import alternativa.engine3d.lights.*

   import flash.display.*;
   import flash.events.*;
   import flash.net.*
   import flash.geom.*;
   import flash.utils.*

   public class Embeddings extends Sprite
   {
      [Embed(source = "/../assets/anim/impact1.swf", mimeType="application/octet-stream")] public var lib1:Class;
      
      private var stage3D:Stage3D;
      private var scene:Object3D = new Object3D();      
      private var camera:Camera3D;
      private var light:OmniLight;
      
      private var backgroundBox:Box
      
      private var hit:Sprite3D;
      private var textHit1:Array = new Array();
      //private var textHit2:Array = new Array();
      //private var textHit3:Array = new Array();      
      private var tx:int
      private var hj:int

      public function Embeddings()
      {
         stage3D = stage.stage3Ds[0];
         stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);
         stage3D.requestContext3D();
      }
      
      private function init(event:Event):void
      {
         //defaults
         camera = new Camera3D(1, 10000);   
         camera.view = new View(1000, 600);
         addChild(camera.view);
         camera.rotationX = 270*Math.PI/180;
         camera.fov = 60*Math.PI/180
         scene.addChild(camera);
         camera.view.hideLogo();
         camera.view.antiAlias = 4
         camera.y = -300
         camera.view.backgroundColor = 0xFFDD97
         
         //lights
         light = new OmniLight(0xFFFFFF, 2000 , 3000);
         light.intensity = 6;
         light.z= 1000;
         scene.addChild(light);
         
         //background objs
         var boxText:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0x7F7FFF));
         boxText.upload(stage3D.context3D);                  
         backgroundBox = new Box(300, 300, 300, 1, 1, 1)
         backgroundBox.setMaterialToAllSurfaces(new VertexLightTextureMaterial(boxText));
         scene.addChild(backgroundBox);
         backgroundBox.geometry.upload(stage3D.context3D);
         backgroundBox.y = 500
         
         //actor
         hit = new Sprite3D(200, 200, null)
         scene.addChild(hit)
         
         //library load
         var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLibraryLoaded);
            loader.loadBytes(new lib1());
      
         //listeners
         stage.addEventListener(MouseEvent.MOUSE_DOWN, startAnim);
         
         //enterframe-ul
         addEventListener(Event.ENTER_FRAME, eful);
      }
      
        protected function handleLibraryLoaded(event:Event):void
      {
            var loaderInfo:LoaderInfo = event.currentTarget as LoaderInfo;         
         for (var m:Number = 1; m <= 30; m++) {
            var frame1:Class = loaderInfo.applicationDomain.getDefinition("g"+m) as Class;
            var a1:BitmapTextureResource  = new BitmapTextureResource(new frame1() as BitmapData); 
            a1.upload(stage3D.context3D); 
            var t1:TextureMaterial = new TextureMaterial(a1);
            t1.alphaThreshold = 0.8;
            t1.transparentPass = true;
            textHit1.push(t1);            
         }
        }

      private function startAnim(event:MouseEvent):void
      {                  
         hj = 1
         tx = 0         
      }    

      private function eful(e:Event):void
      {
         //explode
         if (hj==1) {                  
            hit.material = textHit1[tx]
            tx = tx+1
            if (tx == textHit1.length) {
               hj = 0
            }
         }
         
         //backbround effects
         backgroundBox.rotationZ += 0.01
         
         //rendering
         camera.render(stage3D);
      }
   }
}



Multumesc inca o data
Mi-au fost de un teribil ajutor. Toate exemplele.
ciorty
 
Mesaje: 166
Membru din: Dum Aug 24, 2008 2:29 pm

Re: Folosire swf embeduit ca library

Mesajde Barna Biro » Dum Aug 05, 2012 1:24 pm

You're welcome ;) Referitor la atasamente: mda, exista o limita, dar daca e proiectul mare, il poti uploada pe un host free si sa lasi link-ul aici.
Cum crezi tu ca e mai bine... dar definitely come back and link us to the working app once your domain is up and running!
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland


Înapoi la ActionScript 3.0

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator

cron