Toon posts:

[flashMX] dynamisch een MC maken met OOP

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben sinds kort bezig gegaan met OOP in flash. Heb hiervoor het boek an Branden Hall voor gekocht, en ik moet zeggend at het allemaal al aardig helder begint te worden hoe het een en ander nou in elkaar zet.

Nou heb ik een vraag, ik heb een constructor gemaakt (voorwerp), die de methods en properties van een Movieclip inheriten. Van B-Top heb ik nu begrepen dat ik niet meer een object kan aanmaken dmv. test = new Voorwerp (); maar dmv. van attachMovie.

Wat ik nu eigenlijk wil doen is dat er een externe JPG word ingeladen dmv. loadMovie, deze wil ik een lege MC plaatsen. Ik zou dus met de attachMovie manier een lege MC in mijn library moeten zetten en een linkage geven.

Wat ik wil is dmv. createEmptyMovieClip een lege MC aanmaken, die als een object gezien word van die eerder gemaakte constructor. Is dit mogelijk?

PS. ik hoop dat iemand snapt wat ik nou precies bedoel

Verwijderd

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
randomImager = function() {
  //
  // constructor method
  this.LoadRandomImage = function() {
     //
     // code voor random loading ;)
     this.loadMovie( "random1.jpg");
  };

  this.onLoad =function() {
      this._x = 10;
      this._y = 10;
  }
}

// time to inherited this object to the movieclip; mc-object will extended with randomImager().

randomImager.prototype = new MovieClip();
Object.registerClass( "randomimageLinkage", randomImager );

//
// 
var nIndex = 0;
_root.AttachMovie ( "randomimageLinkage", "randomimage1" );


Volgens mij is het zoiets; het leuke is als je dus je object linkt aan een movieclip; kun je dus een beweging cod-en in AS. Vervolgens kunje dan meerdere MC in je Scene gooien en dan houden ze allemaal aan je beweging code. Leuk voor een regen effect ;)

Hopelijk is het zoiets :+

[ Voor 99% gewijzigd door Verwijderd op 08-03-2003 20:04 ]


Verwijderd

Topicstarter
Bedankt, maar dit was niet mijn vraag. Tot dit punt heb ik het ook nog. Maar jij gebruikt ook de attachMovie om een MC uit de library te linken. Wat mijn vraag is, is of je ook CreateEmptyMovieClip kan gebruiken ipv. AttachMovie.

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Weet je zeker dat je niet te moeillijk zit te denken? Dit kan volgens mij namelijk gewoon met 2 regels:

Flash ActionScript:
1
2
_root.createEmptyMovieClip("testMC",1);
_root.testMC.loadMovie("http://url.naar.een/image.jpg");

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
(En ja Owen, je mag klagen over m'n _root gebruik :P)

Verwijderd

Topicstarter
Maar in OOP moet je aangeven dat een MC uit de library gelinkt moet worden aan een object dmv :

Object.registerClass("link", myObject);

Omdat je met createEmptyMovieClip nog geen linkage hebt, lijkt dit mij onmogelijk. Maar misschien dat iemand het wel is gelukt (owen, ralph?)

Verder heb ik dus eerst met de attachMovie methode een interface gemaakt. Wanneer je op de cursor toetsen drukt worden deze afgevangen door een listener in het object. Alles gaat goed, wanneer ik nu een JPG inlaad dmv. loadMovie bewegen de MC's ineens niet meer. Ik heb in de loadMovie functie in de constructor gezet (this.loadMovie ("test")), deze laad dynamisch dus plaatjes in.

Verder heb ik nog een vraagje. Ik heb een constructor aangemaakt die de methods en properties van het MovieClip object overerft, vervolgens heb ik deze gekoppeld aan een MC uit de library. Tot nu toe niks aan de hand.
De constructor maakt als het ware de basis voor verschillende andere objecten. Wat ik dus wil doen is dat andere constructor functies deze basis gaan uitbreiden. Mijn eerste idee is dat ik dan de link van de MC naar het basis object moet verwijderen, en eentje moet maken van de uitbreiding naar MC.

Wat je dan krijgt is ...
de uitbreinding constructor word aangeroepen, deze erft de methods van de basis van het object, en deze erft de methods van het MovieClip object.

Leek mij logisch, maar helaas werkte dit niet.
Volgens mij is het bovenstaande een verhaal waar niemand iets van snapt,
FLA : http://www2.hku.nl/~patrick/prototypeOOP.testC.fla
SWF: http://www2.hku.nl/~patrick/prototypeOOP.testC.swf

[ Voor 6% gewijzigd door Verwijderd op 09-03-2003 13:31 ]


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
createRegisteredEmptyMovieClip = function(base, name, depth, class, args){
    var MC_prototype = MovieClip.prototype;
    MovieClip.prototype = class.prototype;
    base.createEmptyMovieClip(name, depth);
    class.apply(base[name], args);
    MovieClip.prototype = MC_prototype;
}

loadImage = function(url) {
    this.loadMovie( url );
}
loadImage.prototype = new MovieClip();

createRegisteredEmptyMovieClip( this, "mc1", 0, loadImage, ["http://mcviruss.nl/fotos/geinigemacro.jpg"] );


Ik heb zelf ook zitten kloten, volgens mij zijn er wel makkelijkere methodes maar dit is er iig 1 van. (Gejat van Flashcoders Mailinglist)

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Een andere methode die ik zelf heb uitgevogelt en waar je wellicht in jouw verband meer aan hebt is:

Java:
1
2
3
4
5
6
7
8
9
loadImage = function(){};
loadImage.prototype = new MovieClip();
loadImage.prototype.laad = function(url) {
    this.loadMovie( url );
}

_root.CreateEmptyMovieClip( "mc", 1 );
_root.mc.__proto__ = loadImage.prototype;
_root.mc.laad( "http://mcviruss.nl/fotos/bacardi.jpg" );

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Nog een methode:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
loadImage = function( base, name, depth ) {
    this.prototype = new MovieClip();
    this.prototype.customLoad = function( url ) {
        this.loadMovie( url );
    }

    base.createEmptyMovieClip( name, depth );
    base[name].__proto__ = this.prototype;
}

new loadImage( this, "mc", 1 );
mc.customLoad( "http://mcviruss.nl/fotos/bacardi.jpg" );


Of in 1 statement:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
loadImage = function( base, name, depth, url ) {
    this.prototype = new MovieClip();
    this.prototype.customLoad = function( url ) {
        this.loadMovie( url );
    }

    base.createEmptyMovieClip( name, depth );
    base[name].__proto__ = this.prototype;

    base[name].customLoad( url );
}

new loadImage( this, "mc", 1, "http://mcviruss.nl/fotos/bacardi.jpg" );

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Weet eigenlijk niet of het wel zo netjes is om op deze manier (via prototyping) eigenschappen over te erven, misschien is het toch netter om het via een lege MC in library te doen. Als je dat echt niet wilt zijn bovenstaande oplossingen wellicht de enige mogelijkheid.

Maar goed, ik weet eigenlijk nog niet zo heel veel van Actionscript af en weet zeker dat Owen en/of B-Top hier nuttigere dingen over kunnen zeggen ;).

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

* oh,when? is net wakker, heeft een kater van hier tot tokio, moet geen wodka on the roxx meer dringen ( iig niet meer die ene ) en er komt echt geen zinnig woord uit nu..

maar kwilde wel ff zeggen dat _root vies is McVirusS >:) :P

en owja aan Patrick, als ik het goed heb wil jij een class binden aan een Movieclip, daarom verwijs ik u door naar meneer Yang, uitvinder van inheritance in Flash, en dan met name MovieClip Inheritance waar op een Java achtige structuur het Movieclip object word geextend met de class.

* oh,when? is off...roes uitslapen :z :z :z

/edit nog ff wat quoten:
In Flash MX, Object.registerClass() is used to associate a symbol in the library to a class. This new method affects all instances of the associated symbol; unlike VMC, which affects per movieclip instance.
Afbeeldingslocatie: http://www.quantumwave.com/images/vmc.gif

[ Voor 23% gewijzigd door oh,when? op 09-03-2003 16:09 ]

"You're only as good, as what you did last week."


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Is het nou gelukt Patrick?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
[ot]
Beetjeuh offtopic, maar ik zie dat jullie hard bezig zijn met action script en PartickPietens ook druk bezig is met het leren van de taal. Ik ben er sinds vandaag mee begonnen. Heeft iemand misschien nog links of bookmarks met goede tutorials e.d. ? Want wat ik vind via google enzo is allemaal beetje basic.. animatietjes maken met flash zelf etc.

Verwijderd

Patrick, ik wil je wel ff helpen, ga nu weg van werk, hoop vanaaf ff mooie post te maken, zit weer te stressen aan projectje :)

Verwijderd

Topicstarter
rObert, actionscript ken ik wel, ik ben nu vooral bezig met Object Oriented Programming en componenten binnen actionscript. Ik heb hiervoor het boek OOP with AS gekocht van Branden Hall. Word alles erg duidelijk uitgelegd. De link die Owen hierboven heeft neergezet vond ik ook erg nuttig : http://www.quantumwave.com/flash/

Ralph, ik zet vanavond wel even online wat ik nu heb. Heb al behoorlijk wat, en werkt al lekker nu. Ik zou alleen willen vragen of jij eens kan kijken of dit een goede manier is van OOP.

McVirusS, het is me nog niet helemaal gelukt. Maar heb behoorlijk wat gehad aan jullie voorbeelden, het een en ander is me nu stukken duidelijker! Dank daarvoor!

Verwijderd

r0bert schreef op 10 maart 2003 @ 15:43:
[ot]
Beetjeuh offtopic, maar ik zie dat jullie hard bezig zijn met action script en PartickPietens ook druk bezig is met het leren van de taal. Ik ben er sinds vandaag mee begonnen. Heeft iemand misschien nog links of bookmarks met goede tutorials e.d. ? Want wat ik vind via google enzo is allemaal beetje basic.. animatietjes maken met flash zelf etc.
http://www.actionscripts.org/ is een handige denk ik... maar een beetje gericht googlen ( "actionscript tutorial" ) levert echt heel veel bruibare resultaten op!

Verwijderd

[Ralph's Little-Big OOP Post Start]

Zoo....

Nou, threadje nog eens gelezen, en nu gaan we eens goed replyen.

Er zijn in dit topic een heleboel dingen voorbij gekomen, die ik graag zou willen voorzien van commentaar ( in de positieve vorm ).

Punt 1
Ten eerste zou ik even een misverstandje de wereld uithelpen; in patrick's eerste post zegt hij :
Van B-Top heb ik nu begrepen dat ik niet meer een object kan aanmaken dmv. test = new Voorwerp (); maar dmv. van attachMovie.
Ik denk dat ik niet helemaal duidelijk heb gemaakt waar dit over gaat;
a = new b();
Blijft natuurlijk ook in MX nog van groot belang, sterker nog, het is nog veel belangrijker.

De nuance ligt hem in het feit dat als je met registerClass() een class aan een movieclip 'bind', dat bij initialisatie van de movieclip de 'gebinde' constructor uitvoert. Natuurlijk zijn er ook classes die geen relatie hebben tot movieClip, voorbeeldje : DataSources....arrays....whatever, en zo nog veel meer.

Maar zelfs als je een class hebt 'gebind' aan een movieclip, dan nog kan je deze instantieren met new, met dat verschil, dat er dan geen movieclip bijkomt/aanhangt. Het belang van het gebruik van attachMovie is dan ook dat als je dit gebruikt ism registerclass, deze dus eigenlijk een movieclip van die 'subclass' instantiert. Als je met 'new ..(); instantiert, instantier je een subclass van movieclip, zonder de movieclip. :)

Conclusie: attachMovieClip hoeft alleen gebruikt te worden als je een een subClass van MovieClip gaat instantieren.
Overigens hoef je hier geen attachMovieClip voor te gebruiken. Ook movieclips die je in de flash ide op de stage hebt gesleept, worden geinstantiert met de constructor van de desbetreffende class.

Punt 2
Ok, eigenlijk gaat het hier om de kern van je vraag.

Wat ik ervan begrijp, is dat je een class wil bouwen die randomjpg's inlaad. Hiervoor zijn in OOP verschillende methodes, op basis van welk perspectief jij erop hebt. Wat je in het oog moet houden is dat OOP een meer abstracte/conceptuele manier van programmeren is.
Het gaat dus niet zozeer om wat je typed, maar in welke structuur je je applicatie gaat opzetten.

Ik denk dat het probleem hier meer in de bedachte structuur ligt, dan in de code nl:

Wat je nu voorstelt is dat je lege movieclip's wil binden aan een class...op zich leuk idee, wat owen ook laat zien zijn post, met de info van VMC's van dave yang. Op zich is het ook helemaal geen gek idee.
Je moet je je alleen gaan bedenken waarom je dit zou willen. Als je een enkele (wel of niet lege) mc in je library hebt, wat is daar op tegen? De code om VMC's te kunnen gebruiken is groter in bytes, dan die ene lege mc....die mc zou overigens niet leeg moeten zijn.

Dit omdat je in flashmx dankzij de toegevoegde tools als registerclass ook lekker makkelijk kan organiseren. Je zet nl je constructor en methods in het eerste frame van de betreffende movieclip tussen de initclip en endinitclip cmd's.
Nu heb je een mc die echt een class representeert, zowel voor het gevoel, als in de 'echte' wereld.

In de toepassing die jij nu kiest zou ik dan ook voor de door flashmx aangeboden methode kiezen. Dus gewoon de class defineeren op het eerste frame van de movieclip met initclip.

Waar je ook voor kan kiezen, en wat meer benadert waar jij het over hebt is een class bouwen die inderdaad lege mc's aanmaakt en deze vult met een jpg.
Maar dan hoef je ook geen classes meer te binden aan mc's; je krijgt dan een soort randomImageMCManager, die al deze mc's managed. Of dat goed in het globale concept OOP past, vraag ik me wel af.

Zoals je dus kan zien aan deze twee oplossingen is het hier belangrijker hoe je omgaat met de relaties tussen de objecten.

Ik hoop dat dit nog een beetje te behappen was.

Punt 3
Reyer liet een stukje code zien, waar hij in de constructor methods aan de mc 'binde', dmv this.methodname.

Hoewel het logisch lijkt, is het slimmer om in flash uit te gaan van prototyping.
Dit omdat in de code van reyer in elke instantie van de betreffende class alle methods worden gezet.Dit lijkt onschuldig, maar in de grotere applicaties ga je toch geheugen problemen krijgen. Daarnaast kan je zien dat dit ook een stuk lastiger debuggen is; methods komen alleen naar boven in instanties van een class, en niet in de class zelf. In een nogal lomp uitgelegd principe moet je alleen dat wat individueel is voor de instances in 'this.' zetten. En alles wat dat niet is in het prototype. Let wel, dit was een lompe omschrijving, niet helemaal kloppend.
Als je de methods echter in het prototype van de class zet, 'kijken' alle mc's naar het prototype van 'hun' class; ze gaan allemaal naar 1 centraal punt, en als gevolg daarvan word het geheugen dus efficienter gebruikt. Dan kan je nog steeds per instantie over die prototypes worden heen geschreven, waardoor dat 'individuele' element blijft. Dit brengt een groot aantal voordelen.

Voorbeeldje: zo moet het niet (reyer, no offence).
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
foutClass = function(naam){
                this.naam = naam;
    this.methodnaam = function(){
        trace('test');
    }
    this.showVariable = function(){
        trace(this.naam+' zijn variable is :'+this.variable);
    }
    this.variable = 10;
}


Zo zou het wel moeten:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
goedClass = function(naam){
    this.naam = naam;
}

var p = goedClass.prototype;

p.methodnaam = function(){
    trace('test');
}

p.showVariable = function(){
    trace(this.naam+' zijn variable is :'+this.variable);
}

p.variable = 10;
delete p;


Hieronder zal ik laten zien hoe dat prototyping nou precies dan in de praktijk in zijn werk gaat, dmv bovenstaande class:
Flash ActionScript:
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
39
40
41
42
43
//We maken 2 instanties van de class
myGoedClass_1 = new goedClass('myGoedClass_1');
myGoedClass_2 = new goedClass('myGoedClass_2');

//Van beiden zien we roepen we nu de method showVariable aan:
myGoedClass_1.showVariable();
myGoedClass_2.showVariable();

/*
 output die word gegeven is dan:
    myGoedClass_1 zijn variable is :10
    myGoedClass_2 zijn variable is :10
*/

//Nu 'overrulen' we de prototype voor myGoedClass_1(
//voetnoot; variabelen hoor je nooit direct te accessen, dit doen we nu even zo voor het voorbeeld).
myGoedClass_2.variable = 3;

//Van beiden zien we roepen we nu de method showVariable aan:
myGoedClass_1.showVariable();
myGoedClass_2.showVariable();

/*
 output die word gegeven is dan:
    myGoedClass_1 zijn variable is :10
    myGoedClass_2 zijn variable is :3
*/

//Nu gaan we iets grappigs doen. we gaan het prototype van de class overschrijven:
goedClass.prototype.variable = 'hahaha';

//Van beiden zien we roepen we nu de method showVariable aan:
myGoedClass_1.showVariable();
myGoedClass_2.showVariable();

/*
 output die word gegeven is dan:
    myGoedClass_1 zijn variable is :hahaha
    myGoedClass_2 zijn variable is :3
    
    Aan deze output kunnen we dus zien dat myGoedClass_1 nogsteeds het prototype van de class gebruikt, terwijl
    myGoedClass_2 nu een 'individueel' variable heeft.
*/


Hier zie je dus al heel duidelijk de kracht van prototyping, combineer dit met een flinke dosis inheritance, super(), en de kracht van constructors (die ook weer hun eigen vars kunen bijhouden, zoals bv. het aantal instances dat er zijn), het var keyword om zgn privates aan te maken, en je hebt een heel krachte tool.

Ik hoop dat dit voor jullie allemaal wat meer heeft duidelijk gemaakt.
Opnieuw, sorry voor het gewijsneus, hoop dat jullie er wat aan hebben.

[Ralph's Little-Big OOP Post End]

[ Voor 4% gewijzigd door Verwijderd op 10-03-2003 21:09 . Reden: kleine toevoeging. ]


Verwijderd

Topicstarter
Op het moment van schrijven zweefde het hele OOP gebeuren nog een beetje bij me. Op dit moment, mede dankzij de topics hier, en door nog een keer de eerste hoofdstukken van Branden Hall te lezen, is het me duidelijk hoe het nou in elkaar zit.

Tot nu toe heb ik wat er op : http://www2.hku.nl/~patrick/prototype staat. Misschien is het handig als je deze bekijkt en eens commentaar wilt geven op wat ik heb (en dat zal wel een waslijst worden ;) )

PS. r0bert, zie ook [rml][ flash 5/mx] W&G Actionscript dag?[/rml] voor misschien een interessante dag voor jou, en voor de rest die geinteresseerd in dit onderwerp is.

[ Voor 32% gewijzigd door Verwijderd op 10-03-2003 22:14 ]

Pagina: 1