[AS3] SWF 1x inladen en in 2 MovieClips plaatsen

Pagina: 1
Acties:

Onderwerpen


  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
Via AS3 haal ik een (extern) SWF bestand op. Dit werkt allemaal en als ik deze mbv addChild in een (nieuwe) MovieClip plaats, dan wordt deze ook getoond. Maar het gaat mis als ik dezelfde SWF bestand in twee verschillende MovieClips wil plaatsen. Hij pakt dan alleen de laatste. Ik heb in mijn stage 2 instances (logo en logo_big) staan. Via AS3 maak ik een MovieClip aan waarin de externe SWF bestand wordt geplaatst.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var logoLoader = new Loader();
var logoWrapperSmall:MovieClip = new MovieClip();
var logoWrapperBig:MovieClip = new MovieClip();

function loadLogo(url) { // url is een dynamische var
    logoLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,logoLoaderSuccess);
    logoLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,logoLoaderErrorMethod);
    logoLoader.load(new URLRequest(url));
}

function logoLoaderSuccess(evt:Event):void {
    var image = logoLoader.content;
    logoWrapperSmall.addChild(image);
    logoWrapperBig.addChild(image);
    
    setSmallLogo(evt);
    setBigLogo(evt);
}

function setSmallLogo(evt:Event):void {
    logoWrapperSmall = scaleToFit(logoWrapperSmall, 180, 100, true);
    logo.addChild(logoWrapperSmall);
}

function setBigLogo(evt:Event):void {
    logoWrapperBig = scaleToFit(logoWrapperBig, 300, 250, true);
    logo_big.addChild(logoWrapperBig);
}

function scaleToFit(mc:MovieClip, maxW:int, maxH:int, constrain:Boolean):MovieClip{
    maxH = maxH == 0 ? maxW : maxH;
    mc.width = maxW;
    mc.height = maxH;
    if (constrain) {
        mc.scaleX < mc.scaleY ? mc.scaleY = mc.scaleX : mc.scaleX = mc.scaleY;
    }
    return mc;
}

You cannot not communicate


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nu ben ik geen AS expert, maar volgens mij missen we nog wat, kan dat? Ik zie nergens loadLogo aangeroepen worden?

Ik vermoed dat, omdat logoLoader een 'global'(?) is dat je met een tweede request de eerste 'overschrijft'. Je zult aparte instances moeten maken (denk ik).

[ Voor 9% gewijzigd door RobIII op 19-08-2010 13:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
Er mist nog aardig van code ja. De loadLogo functie wordt een keer aangeroepen (als reactie op het inladen en parsen van XML code), dus er is maar een request.

Het lijkt me dat (nadat de (global) var logoLoader eenmalig wordt geset) je de waarde zo vaak je wilt kunt gebruiken toch? Ik heb het al werkend gehad met twee 'load' commando's waardoor hij 2x de SWF op ging halen, maar dit moet toch met 1 kunnen?

You cannot not communicate


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
Een via Loader ingeladen DisplayObject wordt als child van de Loader er in gezet. Als je een 'addChild' doet op de content property doe je eigenlijk aan 're-parenting', d.w.z. dat je de ene instantie verplaatst en niet dat je nieuwe instanties bij maakt.

Simpel gezegd komt het op het volgende neer: één Loader, één movie clip instance.
Wil je meerdere instanties hebben, probeer het dan eens via:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function logoLoaderSuccess(evt:Event):void { 
  var logoClass:String = "my.fully.qualified.className";
  var domain:ApplicationDomain = logoLoader.contentLoaderInfo.applicationDomain;

  if (domain.hasDefinition(logoClass)
  {
    var logoClass:Class = domain.getDefinition(lClassName) as Class;
   
    logoWrapperSmall.addChild(new logoClass() as DisplayObject);
    logoWrapperBig.addChild(new logoClass() as DisplayObject);
    
    setSmallLogo(evt);
    setBigLogo(evt);
  }
}


Je haalt hiermee expliciet een class uit de externe SWF op. Dat kan een DisplayObject afgeleidde zijn welke direct in code opgezet is, maar kan ook makkelijk een linkage class zijn voor een movie clip die een designer in Flash Professional in elkaar gezet heeft.

Vervolgens wordt de class definition gebruikt om twee maal een instantie aan te maken.

Acties:
  • 0 Henk 'm!

  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
Held! _/-\o_

Je moet dus maar net even weten dat een instantie wordt verplaatst. Maar dat is me nu duidelijk. Verder moest ik even in de Flash Class duiken aangezien dit (Flash & ActionScript) nieuw terrein voor me is. Maar het begint te dagen en leuk te worden :)

Na wat typo's in je code te hebben veranderd functioneerde het naar behoren. Hier dus nog even de correcte code voor eventuele toekomstige hits:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function logoLoaderSuccess(evt:Event):void { 
  var logoClass:String = "my.fully.qualified.className";
  var domain:ApplicationDomain = logoLoader.contentLoaderInfo.applicationDomain;

  if (domain.hasDefinition(logoClass))
  {
    var logoClassDuplicate:Class = domain.getDefinition(logoClass) as Class;
   
    logoWrapperSmall.addChild(new logoClassDuplicate() as DisplayObject);
    logoWrapperBig.addChild(new logoClassDuplicate() as DisplayObject);
    
    setSmallLogo(evt);
    setBigLogo(evt);
  }
}


Nogmaals dank, ik kan weer verder... 8)

You cannot not communicate


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
X-trace schreef op vrijdag 20 augustus 2010 @ 09:50:

Na wat typo's in je code te hebben veranderd functioneerde het naar behoren.

[...]

Nogmaals dank, ik kan weer verder... 8)
Fijn dat het voor je werkte. Sorry nog voor de typo's. Toen ik dit vanochtend tikte stond de koffie nog door te lopen, als je begrijpt wat ik bedoel. ;)
Pagina: 1