[Flash] stand alone reusable component maken

Pagina: 1
Acties:

Onderwerpen


  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Stel je hebt een mooie Flash app. Beetje communicatie met een server, foto output, heel leuk.
En vervolgens wil je het zelfde toepassen op een ander Flashdocument. Ander uiterlijk, andere server, de zelfde functionaliteit.

Bestaat er een manier om de functionaliteit als een precompiled 'component' te exporteren die door meerdere Flashdocumenten te gebruiken is? Waarbij in dit geval het document een url aan de component geeft, en vervolgens plaatjes in zijn (een) movieclip gepusht krijgt?

Googlen naar flash create separate component doet niet wat ik bedoel. Als iemand in andere woorden weet waar ik aan denk, google suggesties zijn welkom!

Oplossingen opzich ook, maar ik weet dat Tweakers niet zo weg zijn van globale vragen zonder plan-van-aanpak, dus wil ik even onderstrepen dat ik een beginnetje zoek waarmee ik zelf verder kan komen.

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 20:56
Sando schreef op donderdag 10 februari 2011 @ 16:36:

Bestaat er een manier om de functionaliteit als een precompiled 'component' te exporteren die door meerdere Flashdocumenten te gebruiken is? Waarbij in dit geval het document een url aan de component geeft, en vervolgens plaatjes in zijn (een) movieclip gepusht krijgt?
Je kunt in ActionScript gewoon classes in library code schrijven en de gecompileerde libraries (.swc) in je project includen. Je kunt zelfs classes uit library code dynamisch inladen, net zoals bijv. .NET dat kan.

De flash.display.Loader class uit de ActionScript 3 standard library doet trouwens al zo ongeveer wat je hier beschrijft...

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Bedankt! Ben zelf nog een beetje oldskool AS2'erig, en ik heb de library verkeerd ingeschat. Ik gebruikte hem gewoon om graphics in op te slaan.

Info appreciated! :)

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 20:56
Sando schreef op zaterdag 12 februari 2011 @ 01:22:
Bedankt! Ben zelf nog een beetje oldskool AS2'erig, en ik heb de library verkeerd ingeschat. Ik gebruikte hem gewoon om graphics in op te slaan.

Info appreciated! :)
De term 'library' in de Flash Professional IDE is een heel ander soort library; inderdaad om resources zoals graphics te beheren. In de 'library' (resource manager) kun je geen code opnemen. Je kunt hoogstens externe code koppelen aan 'symbols' (resources) door middel van iets dat 'linkage' genoemd wordt.(Het is echt niet handig dat Adobe anno 2011 nog steeds terminologie een betekenis geeft die haaks op vak jargon staat.)

De 'library' (resource manager) zit gekoppeld aan het Flash Professional project waar je op dat moment aan werkt en als de file 'gepublished' (gecompileerd) wordt naar een SWC 'component' (library) wil dat ook geenszins zeggen dat de volledige inhoud v.d. 'library' in de gecompileerde file zit, tenzij je jezelf door wat bochten wringt: alles moet op de één of andere manier een referentie hebben op de 'stage', anders wordt het niet mee 'gepublished'.

Wil je met herbruikbare libraries werken, gebruik dan Flash Builder. Gebruik trouwens sowieso Flash Builder. Flash Professional is "a professional mess", die je IMHO zoveel mogelijk zou moeten vermijden.

Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Sando schreef op zaterdag 12 februari 2011 @ 01:22:
Bedankt! Ben zelf nog een beetje oldskool AS2'erig, en ik heb de library verkeerd ingeschat. Ik gebruikte hem gewoon om graphics in op te slaan.

Info appreciated! :)
Dat is de asset library, code library vind je onder Publish Settings -> Script [Actionscript 3] Settings

Daar kun je hele folders als external library aangeven...

Ow, en ditch zo snel mogelijk AS2 en ga met AS3 aan de slag.

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Bedankt voor de info. Dat AS3 is inderdaad veel uitgebreider!
Ik gebruik nu Flash Builder, hoewel dat volgens mij toch echt met Flash Professional Mess meekwam (@R4gnax)?

Maar inmiddels heb ik mezelf een beetje in de knoop gespeeld.

Is er een AS3 manier om de uit AS2 bekende _root te gebruiken om een functie aan te roepen?
(Dit is nog ontopic. :))
Uitleg:

Ik heb verschillende projecten, dus verschillende DocumentClass'es.
Deze hebben allemaal een gelijknamige functie functie() met iets andere werking.
Ze instantiëren allemaal mijn LibraryClass, die uiteindelijk onafhankelijk van de DocumentClass moet kunnen worden ingezet, provided that DocumentClass over functie functie() beschikt.

Met google in de hand heb ik wel begrepen dat je dynamische variabelen kan roepen met this.parent.var, maar this.parent.functie() mag niet, want dan krijg ik klachten over een mogelijk niet bestaande functie in een statische context.

Daarna zocht ik naar Singleton achtige mogelijkheden voor ActionScript, en op deze manier krijg ik opzich voor elkaar wat ik wil:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class DocumentClass {

    // Singleton
    private static var _instance:DocumentClass;
    public static function getInstance():DocumentClass { 
        return _instance; 
    }
    
    // Constructor
    public function DocumentClass() {
        // Singleton
        _instance = this;
        
        // My objects
        var foo = new LibraryClass();
    }
    
    // I need this
    public function functie() {
        // ...
    }
}


Nu kan ik vanuit foo:LibraryClass zeggen:

code:
1
var bar = DocumentClass.getInstance().functie()


Maar zo is DocumentClass.functie() alleen te benaderen als de naam DocumentClass bekend is in LibraryClass, en dat is een onacceptabele afhankelijkheid!

Ik zoek zoiets als _root.functie() of this.parent.functie() maar die werken uiteraard niet.

Op google zag ik ook nog wel eens mensen Main(Main).functie() doen, maar bij mijn gebeurt er niet veel meer dan wanneer ik Grapje(Grapje).functie() doe.

[ Voor 4% gewijzigd door Sando op 20-02-2011 07:00 ]

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Kun je je library class niet een event laten dispatchen waarnaar je documentclass luistert? dat is imho een veel nettere oplossing.

Dan hoef je niet met singletons of .parent te werken.

En nee, er is geen (simpele) _root equivalent in as3.

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 20:56
Sando schreef op zondag 20 februari 2011 @ 06:53:
Bedankt voor de info. Dat AS3 is inderdaad veel uitgebreider!
Ik gebruik nu Flash Builder, hoewel dat volgens mij toch echt met Flash Professional Mess meekwam
Nee. Hoewel beiden wel met elkaar samen kunnen werken (wel wat gekunsteld en gebrekkig, trouwens), komt Builder niet met Flash Pro mee. Het is echt een los programma. Je hebt daarentegen wel license bundles zoals het CS5 Web Premium pakket waar allebei de applicaties in zitten.
Sando schreef op zondag 20 februari 2011 @ 06:53:
Ik heb verschillende projecten, dus verschillende DocumentClass'es.
Deze hebben allemaal een gelijknamige functie functie() met iets andere werking.
Ze instantiëren allemaal mijn LibraryClass, die uiteindelijk onafhankelijk van de DocumentClass moet kunnen worden ingezet, provided that DocumentClass over functie functie() beschikt.
Als het echt zo is dat je een library class maakt die zo sterk gekoppeld zit aan je document class, dat deze een method er op aan moet roepen, dan doe je mijns inziens echt iets verkeerd. Kun je wat meer details geven? Misschien dat we dan wel een werkbaar alternatief kunnen verzinnen.

Met Tsjilp's suggestie om event-based te werken kom je natuurlijk een heel eind, maar het zou zonde zijn als je door een fundamentele ontwerpfout ergens een eind verderop alsnog jezelf een hoekje ingeprogrammeerd blijkt te hebben.

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Tsjilp schreef op maandag 21 februari 2011 @ 11:16:
Kun je je library class niet een event laten dispatchen waarnaar je documentclass luistert? dat is imho een veel nettere oplossing.
Dat is misschien een goed idee. De DocumentClass weet immers altijd de naam van de LibraryClass. :)
R4gnax schreef op dinsdag 22 februari 2011 @ 22:40:
[...]

Nee. Hoewel beiden wel met elkaar samen kunnen werken (wel wat gekunsteld en gebrekkig, trouwens), komt Builder niet met Flash Pro mee. Het is echt een los programma. Je hebt daarentegen wel license bundles zoals het CS5 Web Premium pakket waar allebei de applicaties in zitten.
Ooh vandaar! Het kwam gewoon met de bundel mee, icoontje in de stijl van de suite enzo.
Als het echt zo is dat je een library class maakt die zo sterk gekoppeld zit aan je document class, dat deze een method er op aan moet roepen, dan doe je mijns inziens echt iets verkeerd. Kun je wat meer details geven? Misschien dat we dan wel een werkbaar alternatief kunnen verzinnen.
Ik maak een Flash project voor iemand. Deze wil zo min mogelijk code zien, en meerdere soortgelijke projecten op kunnen zetten. De code die hetzeflde is wil ik daarom zoveel mogelijk in classes wegstoppen. Deze classes doen verschillende keren een verzoek om data. In de verschillende projecten is de data anders, en daarom heb ik één functie in de Document Class die de data omzet zodat het uiteindelijk hetzelfde is voor de classes om mee te werken. Deze omzet-functie is voor elk project anders, en kan daarom niet weggestopt worden in de Library Class.

[FlashDoc] -> [DocumentClass met getData functie] -> [Globale LibraryClasses die steeds getData doen]

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 20:56
Sando schreef op woensdag 23 februari 2011 @ 01:42:
In de verschillende projecten is de data anders, en daarom heb ik één functie in de Document Class die de data omzet zodat het uiteindelijk hetzelfde is voor de classes om mee te werken. Deze omzet-functie is voor elk project anders, en kan daarom niet weggestopt worden in de Library Class.
Ik dacht al dat het zo iets zou zijn. Kijk in dat geval eens naar het implementeren van het Strategy pattern.

Je zou de data retrieval dan onderbrengen in project-specifieke classes die allemaal een interface IDataRetrievalStrategy o.i.d. uit je class library implementeren. Die interface zou dan een getData() method signature bevatten, waarmee je de data op implementatie afhankelijke wijze kunt ophalen.

[ Voor 10% gewijzigd door R4gnax op 23-02-2011 09:04 ]


  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Tot nu toe was het (AS3 OO) vrij makkelijk omdat ik classes en extenden vanuit php en java ken, maar het implementeren van interfaces is iets wat ik nooit heb hoeven doen, waarvan ik niet weet wat het is, en een globale eerste google-ronde het een stuk ingewikkelder doet overkomen dan bijvoorbeeld het extenden van een class. En als dat appels met peren vergelijken is dan heb ik het niet eens door. ;)

Ik stel je advies op prijs, maar hoewel zowel interessant als waarschijnlijk de beste oplossing kan ik niet inschatten hoe lang het duurt voordat ik het begrijp, waardoor het extenden van EventDispatcher om in de DocumentClass te Listenen naar requests nu voor mij denk ik de beste oplossing is.

🇪🇺 Buy from EU (GoT)

Pagina: 1