PDA

Volledige versie bekijken : ActionScript 2.0 probleem


MoneyQQQ
%Europe/Berlin %797 %2005, 20:08
Hallo,

Ik ben pas begonnen met het leren van ActionScript 2.0 in Flash 8 Professional. Sommige dingen zijn wat moeilijk te begrijpen en lijken ook niet echt tot me door te dringen. Graag zou ik wat hulp krijgen bij het volgende probleem. Dit gaat over een class die lege clip creeert voor een .jpg bestand die via een method aangeleverd wordt aan de class:


class ImageViewer {
private var container_mc:MovieClip;

public function ImageViewer (target:MovieClip, depth:Number) {
container_mc = target.createEmptyMovieClip("container_mc" + depth, depth);
}

public function loadImage (sURL:String):Void {
container_mc.loadMovie(sURL);
}

}
// gebruik in .fla document
var viewer:ImageViewer = new ImageViewer(this, 1);
viewer.loadImage("picture.jpg");


Wat ik niet begrijp is dat de class een container_mc clip creeert met daarin een lege movieclip genaamd container_mc1 of 2 (welke depth je invoert). Vervolgens wordt de .jpg in de container_mc geladen, waarom niet in de container_mc1? Wat is het nut van de container_mc1? Zou iemand mij wat duidelijkheid kunnen verschaffen in dit probleem? Alvast bedankt

Dauntless
%Europe/Berlin %808 %2005, 20:23
Leuk dat je met AS 2.0 Classes begint! Die zijn heel aangenaam om mee te werken :).

Voor ik het vergeet: Kan je even [AS.] [/AS.] (zonder 'pun') rond je code willen zetten? Op die manier is het beter leesbaar en heb je geen irritante emoticons :).

Je vraag is niet echt AS 2.0 specifiek, maar dat maakt niet uit :).

die container_mc is een verwijzing naar een movieclip. Het is geen naam van een movieclip, enkel en verwijzing er naar.

Als je nu zou nemen
container_mc = target.createEmptyMovieClip("LalalaLand" + depth, depth);

Dan zou container_mc verwijzen naar een movieclip met de naam: LalalaLand1 / 2 / 3 etc.

Is er nog iets dat je niet begrijpt? :)

(Ps: Heb je toevallig EAS 2.0 gekocht? :D)

MoneyQQQ
%Europe/Berlin %812 %2005, 20:29
He bedankt voor je uitleg, nu ik dit begrijp heb ik inderdaad nog een vraag. Waar dient de depth dan voor? Ik weet wel wat depth inhoud, is het misschien de depth voor de hoofd-timeline, de _root?

Dauntless
%Europe/Berlin %814 %2005, 20:32
Die depth zegt idd op welke diepte een movieclip moet komen.
De movieclip met de hoogste depth staat het meest naar voren.
De movieclip met de laagste depth staat het meest naar achter.

Ook: Er kunnen geen 2 movieclips op dezelfde depth staan. Als er al iets op een depth staat, en je zet er iets nieuws op, dan overschrijft dat object het vorige object.

Elke movieclip heeft ook z'n eigen depths. Een movieclip staat dus bv op depth 5, en in deze movieclip heb je dan ook weer depths van 0 -> ... (er is een begrenst getal hoor, maar 'k weet hem niet meer... Ik dacht 300 000 of zo...)

In dit geval geeft 'depth' de diepte van de nieuw aangemaakte movieclip in 'target' weer.

MoneyQQQ
%Europe/Berlin %814 %2005, 20:32
Nog iets, waar verwijst this naar? Naar de object instantie die je creeert?

MoneyQQQ
%Europe/Berlin %815 %2005, 20:34
Ik weet wel dat this kan verwijzen naar een movieclip als de code binnen de movieclip staat en naar een object als de code naar een method of property verwijst vanuit bijvoorbeeld een geneste functie. Maar in dit geval ben ik toch wel een beetje in de war

Dauntless
%Europe/Berlin %816 %2005, 20:35
(Kijk ook even naar m'n wijziging boven je post).

this -> target
depth -> diepte van de nieuwe movieclip in je target

En als je code op je hoofdtijdlijn (de root) staat, dan verwijst 'this' naar je root. Als die code in een movieclip zou staan zou 'this' verwijzen naar de movieclip waar je code in staat.

Dauntless
%Europe/Berlin %817 %2005, 20:36
Wel, dit werkt eigenlijk hetzelfde als gewone functies

function speelAf(target:MovieClip)
{
target.play();
}

Dan kan je dus speelAf(this) nemen, en dan speelt de huidige tijdlijn verder af. Of je kan speelAf(mijnMovieClip) doen, en dan zal een movieclip met de naam 'mijnMovieClip' verder afspelen.

MoneyQQQ
%Europe/Berlin %819 %2005, 20:40
Sorry hoor, mijn allerlaatste vraag van vanavond.

this (target) wordt als argument doorgegeven aan de constructor dus het wordt eigenlijk

this.createEmptyMovieClip( blabla

Wat is this dan, waar verwijst het naar?

Jordy
%Europe/Berlin %822 %2005, 20:44
Die bepaalt de plaats van je lege MC. Dus als jij in de root zit, dan plaatst hij die MC in de root.
Als je nou in foo1.foo2.mc3 zit dan plaatst hij die dus in foo1.foo2.mc3

of zit ik er naast :$

Dauntless
%Europe/Berlin %823 %2005, 20:45
This verwijst altijd naar het object waar hij instaat. In je classe verwijst 'this' dus simpel weg naar je classe zelf :). (En je classe zelf heeft geen tijdlijn. Kan je een beetje vergelijken met een object dus (alle classes zijn dan ook objects)).

TheDutch
%Europe/Berlin %837 %2005, 21:06
Een kleine toevoeging:

Sommige mensen die denken dat "this" binnen een functie naar de functie verwijst, dit is niet het geval. Het verwijst naar het object waar de functie zich in bevindt :).

Fatty Owl
%Europe/Berlin %852 %2005, 21:28
ff oftopic vraagje. waarom geeft die code deze error? **Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 1: Classes may only be defined in external ActionScript 2.0 class scripts.
class ImageViewer {

Total ActionScript Errors: 1 Reported Errors: 1

Dauntless
%Europe/Berlin %857 %2005, 21:34
Een class file moet je opslaan in een .as bestand welke dezelfde naam heeft als de naam van je class.

Jordy
%Europe/Berlin %864 %2005, 21:45
en hij moet in de zelfde map als je fla :D (iets waar ik een hele tijd mee zat te klooie :# )

MoneyQQQ
%Europe/Berlin %865 %2005, 21:46
Ik snap wel dat this naar het object verwijst, maar in dit geval is 'this', 'target', en target is een movieclip

container_mc = target.createEmptyMovieClip(bla bla

Daar val ik dus over. Het schijnt de meest simpele class code te zijn die je maar kunt maken, maar ik vind/vond het verwarrend.

dus je geeft:

var eenObject:ImageViewer = new ImageViewer(this, 1);

door, maar this is van het MovieClip datatype.

public function ImageViewer( parameters..., target:MovieClip)

Dus verwijst het nou naar een movieclip, zo ja welke? Misschien zijn er meer mensen die dit verwarrend vinden.

Dauntless
%Europe/Berlin %874 %2005, 21:59
Tjah, hoe kan ik het nog uitleggen?

In AS 1.0:

function traceMij(eenVar)
{
trace(eenVar);
}
traceMij("bal");
Binnen die traceMij functie bestaat er een variabele genaamt 'eenVar' . Wanneer je die functie oproept geef je een waarde aan 'eenVar' doordat je een string meegeeft als parameter. Binnenin de functie is eenVar dus gelijk aan "bal".

Vergelijking met jouw class:
class ImageViewer {
private var container_mc:MovieClip;

public function ImageViewer (target:MovieClip, depth:Number) {
container_mc = target.createEmptyMovieClip("container_mc" + depth, depth);
}
}
var viewer:ImageViewer = new ImageViewer(this, 1);
viewer.loadImage("picture.jpg");

Dus, je roept eigenlijk gewoon terug een functie op, namelijk 'ImageViewer'. Aan die functie geef je een parameter mee (this). This is in het voorbeeldje gelijk aan "bal". Alleen is het hier een ander soort variabele, namelijk een MovieClip ipv een String. 'this' verwijst (omdat je script op de hoofdtijdlijn staat) naar _level0 (je root). Eigenlijk wordt dus als parameter _level0 meegegeven. Dan wordt jouw _level0 ontvangen in je functie adhv een variabele genaamd 'target'. In je functie ImageViewer is target dus gelijk aan _level0. (In het voorbeeld: In de functie traceMij is 'eenVar' gelijk aan 'bal').
Binnen de ImageViewer functie kan je dus gebruik maken van 'target' om te verwijzen naar _level0.

Als je het nu niet snapt moet iemand anders eens proberen :p.

MoneyQQQ
%Europe/Berlin %892 %2005, 22:25
Mijn hersenen hebben lang gekraakt door dit probleem maar nu snap ik het. Ik wil je heel erg bedanken dat je de moeite genomen hebt om mij dit uit te leggen. Nu kan ik verder. Ik was hier zelf niet uitgekomen.

Dus duizendmaal dank

TheDutch
%Europe/Berlin %896 %2005, 22:31
en hij moet in de zelfde map als je fla :D (iets waar ik een hele tijd mee zat te klooie :# )
Dat is niet helemaal waar. Je kunt ook een class path aangeven waar hij moet beginnen met zoeken naar de classes. Je importeerd dan de classes dmv. "import path.to.class.className". Dat is sowieso de meeste nette en professionele manier.

Dauntless
%Europe/Berlin %902 %2005, 22:38
Bij mij: Mijn Documenten -> Flash -> classes. Daar staat dan een package be.dauntless. In flash kan je dan aangeven dat hij moet zoeken in mijn documenten / flash / classes en je kan zelfs aangeven dat die dir bv voorang krijgt op classes in dezelfde folder als je .fla.

Maar goed dat het opgelost is :).