Avatar billede Slettet bruger
28. januar 2007 - 17:13 Der er 3 kommentarer og
1 løsning

OOP problem med attachMovie

Hej eksperter.

Jeg er i gang med at omprogrammere et projekt til OOP, da jeg efterhånden har mistet overblikket. Jeg er ingen ørn til OOP, men noget undrer mig.

Jeg har følgende kode, placeret i frame 1:

var cdi = this.attachMovie("cdi", "cdi"+i, i, {_x:(i*spacing-1)+(scenebredde/2), _y:150});
this["mc"+i] = this.cdi.createEmptyMovieClip('test', 1);
this["d"+i] = new DistordImage(this["mc"+i], "cdnr"+i, 2, 2);

Det fungerer FINT.
Nu er strukturen imidlertid ændret.
Nu indeholder fla-filen, kun library-elementer og følgende kode:

var scene = new Scene();
scene.opretScene();

Klassen "Scene", metode "opretscene" rummer bl.a. følgende:

this["cdcover"+covernr] = new Cover();
this["cdcover"+covernr].opretCover(covernr, spacing, scenebredde, coverypos);

og slutteligt, klassen "Cover". Her har jeg kopieret den øverste kodeblok - var cdi = this.attachMovie...etc... ind.

Nu gives compiler-fejlen "**Error** C:\Temp\flash\Cover.as: Line 18: There is no method with the name 'attachMovie'."

Hvorfor kan attachMovie ikke nås, når den bliver indsat i en metode?

Og et supplerende spørgsmål: Jeg kan ikke fatte, hvad "extends" bruges til - og hvornår den bør bruges. Kan I forklare det på alm. dansk ;-)
Avatar billede mat Nybegynder
28. januar 2007 - 17:25 #1
Det er ordet "this", der giver dig problemet, this er objektet selv, og dermed ikke længere den tidslinie det stod på før (metoden attachMovie vil dog findes hvis din klasse arver fra MovieClip).

Derfor hvis du vil bruge attachMovie skal du enten arve fra MovieClip eller du skal sende en reference til et movieclip til din funktion.

"extends" betyder netop arv, dvs at din klasse ER ET MovieClip, med noget udbygget funktionalitet (MovieClip er superklassen, og din klasse er en subklasse af MovieClip). Hvis din klasse ikke er et MovieClip, men blot skal bruge et, så arver man ikke, så indeholder man blot et movieclip (det hedder en aggregering eller komposition).

Jeg mener det er sjældent at en klasse har brug for al den funktionalitet som MovieClip giver.

Håber det mindede om almindelig dansk, ellers må du spørge.

mvh mat
Avatar billede Slettet bruger
28. januar 2007 - 17:57 #2
Hej Mat - the man!

Nu spiller det.

OK, dvs. det er ingen "synd" at gøre brug af _root, når man OOP'er? for hvis man anvender "this" og "_parent", skal den vel tage udgangspunkt i et sted?

Nå, men jeg har re-kodet den problematiske del til følgende:

function opretCover(i, spacing, scenebredde, coverypos) {
    _root.attachMovie("cdi", "cdi"+i, i, {_x:(i*spacing-1)+(scenebredde/2), _y:150});
    _root["d"+i] = new DistordImage(_root["cdi"+i].createEmptyMovieClip('test', 1), "cdnr"+i, 2, 2);
}

Hvad angår extend - OK, hvis jeg har forstået det korrekt: Et MC har indbyggede standardfunktionaliteter som f.eks. _x, _xscale, hitTest osv., right?
og med extend kan man så fremstille egne klasser, der gør noget helt specifikt med det pågældende movieclip?

Skal lige høre; hvordan har du lært OOP? Og kan du evt. anbefale noget materiale?

Du kan bare besvare med et "Svar"...

Med venlig hilsen og tak for hjælpen; Anders
Avatar billede mat Nybegynder
28. januar 2007 - 18:17 #3
Jeg giver aldrig en reference til _root til et objekt eller klasse, jeg giver this, som tilfældigvis kan være _root.

Med extends udbygger du en eksisterende klasse, du specialiserer den. superklassen er en generalisering og subklassen en specialisering, så ja du tilføjer funktionalitet (eller overskriver gældende).

Jeg har lært det gennem min uddannelse (både generel OO analyse og design, og programmeringsfag med OO sprog). Jeg ved ikke rigtigt hvilken litteratur jeg ville anbefale, hvis det skal eksemplificeres i ActionScript, jeg har kun læst Moocks essential AS 2. Men det meste litteratur om OO er vel ok?

mvh mat
Avatar billede mat Nybegynder
28. januar 2007 - 19:27 #4
Når jeg skriver "reference" så mener jeg følgende;

Forestil dig at du i din fla skriver således i _root;

var some_object:SomeClass = new SomeClass(this);

Så er this en reference til _root, din klasse vil så holde på denne reference med;

class SomeClass {

private var _timeline:MovieClip;

public function SomeClass ( timeline:MovieClip ) {
_timeline = timeline;
}

}

Så kan du i din klasse bruge _timeline som det movieclip du attacher til, og så har du ikke nogen decideret _root reference i din klasse (den kan jo snildt ændres hvis du er bange for konflikter).

mvh mat
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester