[AS3] Manipuleren externe SWF MovieClips

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
Introductie
Al enige tijd loop ik met het idee voor een flash-based MMO - niks serieus, maar een leuk hobby project. Essentieel onderdeel daarvan is dat er objecten extern ingeladen moeten worden: andere spelers, gebouwen, you name it. Met AS3 is dat in principe vrij simpel geworden (een Loader gebruiken, eventlistener aan hangen et voila) echter loop ik daarna tegen problemen aan bij het manipuleren van de ingeladen MovieClips. Aangezien mijn Flash kennis gelimiteerd is tot wat ik kan vinden in de manual hoop ik dat hier meer ervargen mensen rondlopen die dit wel weten :)

Default instance naam aanpasbaar?
Wanneer een swf file ingeladen is kan ik middels even.target.content de bovenste MovieClip bereiken - so far so good. Echter, als ik deze aan de hoofd MovieClip (of wherever) wil hangen middels een .addChild heeft deze altijd een default naam - 'instance2' etc. Dit is vervelend aangezien ik later weer hetzelfde object wil kunnen aanspreken en de ideale methode daarvoor voor zover ik kan zien getChildByName is. Als tussenoplossing heb ik nu een extra property toegevoegd die overeenkomt met het ID wat de server heeft, maar dit is verre van ideaal aangezien ik nu over alle children moet loopen. De naam direct wijzigen lijkt niet te gaan: zodra de Loader complete eventHandler aangeroepen wordt krijg ik al een error wanneer ik object.name wil veranderen:
code:
1
Error: Error #2078: The name property of a Timeline-placed object cannot be modified.

Ter volledigheid: dit is dus al voordat ik hem middels addChild ergens aanhang. Iemand enig idee hoe ik toch deze naam kan aanpassen?

MovieClips clonen?
Aangezien er veel dezelfde objecten ingeladen zullen worden wil ik deze natuurlijk het liefst cachen. Echter, dat vereist weer dat ik een kopie van het MovieClip object kan maken, en voor zover ik kan vinden is daar geen methode voor in AS3? :? Ik heb wel enkele functies gevonden die zichzelf recursief aanroepen op een object om een deep copy te maken, maar aangezien ik dat nogal ranzig vind en mogelijk foutgevoelig vroeg ik me af of Flash daar niet zelf ook een manier voor heeft? Ter verduidelijking, deze objecten moeten wel apart manipuleerbaar zijn dus simpelweg meerdere keren .addChild gebruiken is geen optie.

Alvast zeer bedankt!

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat ik eens zou proberen is:
code:
1
2
3
var mc:MovieClip = even.target.content as MovieClip;
mc.name = "";
iets.addChild(mc);


En om ze te klonen zou ik iets in deze aard proberen:
code:
1
2
3
4
5
6
for(var i:int=0; i<...; i++)
{
  var mc:MovieClip = even.target.content as MovieClip;
  mc.name = ""+i;
  iets.addChild(mc);
}


Ik ben niet zeker of het werkt, maar het is denk ik wel het proberen waard... :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
Bedankt voor je reactie - ik was al bang dat niemand hier iets over te zeggen had. Helaas blijf ik dezelfde error houden - mc.name = "" is niet toegestaan.

Ik vermoed dat in het exerne SWF file de content ook nog aan een timeline hangt, wat de enige reden is die ik kan bedenken waarom die error tevoorschijn komt. Als het object dan te kopieeren is zou de kopie ook gelijk een nieuwe naam moeten kunnen krijgen, maar zoals het er nu naar uitziet gaat dat niet lukken met standaard AS3 methodes :/

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
Update
Na veel zoeken uiteindelijk een oplossing gevonden. Om een lang verhaal kort te maken: wanneer een object een class-naam meekrijgt voordat het geexporteerd wordt als .swf is het mogelijk die class te importeren (in plaats van het MovieClip object waar het aan refereert). Vervolgens is er met new [class naam] een nieuwe instance van die class en daarmee het object te maken.

Van die nieuwe instances is vervolgens wel weer de naam te wijzigen, waarmee ik twee problemen in een keer oplos :Y)

Langer verhaal: hier. :)

[ Voor 10% gewijzigd door FragFrog op 22-06-2009 20:13 ]

[ Site ] [ twitch ] [ jijbuis ]