PDA

Volledige versie bekijken : hoe button in (subclass mc) of (class)


ocdaan
%Europe/Berlin %392 %2005, 10:24
Hoi hoi,

Ik heb een eigen class gemaakt die een eigen movieclip extents (in de lib). De mc heeft een 3-tal onderdelen, een text vlakje, een lege clip om externe images in te laden en een invisible button.

Ik heb een class voor deze clip gemaakt waarin een aantal variabelen worden opgeslagen, het text veldje word ingevult en een plaatje word geladen. Dit heb ik werkend.

Het is de bedoeling dat als op die mc word geklikt dat er dan een functie op de root word aangeroepen. Nu heb ik in de root voor iedere instance een regel om de onRelease te definieren. Dit werkt wel maar ik wil dit natuurlijk vanuit de classs aansturen maar dit wil niet lukken.

Ik verwachtte dat ik in de class zoiets als dit kon doen: (er is een invisible -invi- button aanwezig in de mc namelijk)
this.invi.onRelease = function(){}

Dit mag blijkbaar niet, weet iemand hoe ik binnen de class wel een button kan difinieren, het hoeft opzich geen button te zijn, zolang er maar een event komt van de mc. Eerst had ik onMouseDown, dit werkte wel, maar voor alle instances tegelijk, dit is niet de bedoeling natuurlijk.

Alvast dank, want die classes zijn best pittig moet ik zeggen.....

ocdaan
%Europe/Berlin %464 %2005, 12:09
Ik heb gister maar het boek "Essential AS2" gekocht en ben al een stuk wijzer geworden. In het boek staat een voorbeeld van hoe je een mouselistener kan toevoegen aan een object via een class. Dit heb ik uitgewerkt maar toch lijkt het een global event te zijn ipv een event van de specifieke instance... ik snap niet waarom dit nu fout gaat, in het boek staat duidelijk dat je vanuit de class een listener kan maken als: Mouse.removeListener(this); en dat'ie dan het huidige object referenced - en niet alle instances van de class... schiet mij maar lek

Dit is de class die ik gebruik om te testen.


class ImageLoader {
private var id:Number

function ImageLoader(image:String, target_mc:MovieClip, init:Object, NewID:Number) {
id = NewID;
var listenerObject:Object = new Object();
listenerObject.onLoadInit = function(target) {
for (var i in init) {
target[i] = init[i];
}
};

var loader:MovieClipLoader = new MovieClipLoader();
loader.addListener(listenerObject);
loader.loadClip(image, target_mc);
}

function onMouseUp():Void{
trace("clicked on "+id);
}

function enableMouseEvents():Void{
Mouse.addListener(this);
}

function disableMouseEvents():Void{
Mouse.removeListener(this);
}

}


Zo maak ik 2 instances aan in de root:

var image_mc1:MovieClip = this.createEmptyMovieClip("image_mc1", this.getNextHighestDepth());
var img_loader1:ImageLoader = new ImageLoader("http://www.fan.tv/filecontent/images/video159.jpg", image_mc1, {_x:400, _y:90}, 1);
img_loader1.enableMouseEvents()

var image_mc2:MovieClip = this.createEmptyMovieClip("image_mc2", this.getNextHighestDepth());
var img_loader2:ImageLoader = new ImageLoader("http://www.fan.tv/filecontent/images/video159.jpg", image_mc2, {_x:200, _y:90}, 2);
img_loader2.enableMouseEvents()



Als ik op een van beide plaatjes klik worden beide mouse events afgevuurd:

<output>
clicked on 1
clicked on 2

Iemand enig idee wat hier fout gaat?

//edit, in m'n eerste post had ik het nog over een extended mc - in dit voorbeeld heb ik dat maar even achterwegen gelaten om het wat makkelijker te testen....

Dauntless
%Europe/Berlin %757 %2005, 19:10
Dat hij 2 traces geeft is 100% logisch: Die listener hangt idd wel vast aan je instance (je krijgt namelijk verschillende traces) maar mouse down is mouse down! Maakt niet uit waar je klikt. Je moet dus eerder een onRelease handler zetten op je img, of anders een hitTest van muis & image (point based hitTest).

Ik heb eigenlijk wel bitterweinig ervaring met de MC class extenden, maar ben je zeker dat je niet gewoon een onRelease op een button kan zetten? Gaf hij een fout of werd hij gewoon niet uitgevoerd? 't Kon anders ook een scoping probleem geweest zijn.

ocdaan
%Europe/Berlin %766 %2005, 19:23
Hey,

Pfff, ja tuurlijk, mousedown = mousedown.. hahaha dom natuurlijk.

Ja, ik heb ook voor iedere instance een regel om een onRelaese te definieren. Lekker dynamisch ;-) niet echt dus, vandaar m'n vraag.

Maar om de vraag even om te draaien, regel jij dynamisch mouse-events vanuit een class of houd jij dit buiten de classes?

Dauntless
%Europe/Berlin %777 %2005, 19:39
class ImageLoader {
private var id:Number
private var imgHolder:MovieClip;

function ImageLoader(image:String, target_mc:MovieClip, init:Object, NewID:Number) {
id = NewID;
imgHolder = target_mc;
var listenerObject:Object = new Object();
listenerObject.onLoadInit = function(target) {
for (var i in init) {
target[i] = init[i];
}
};
listenerObject.lScope = this;
listenerObject.onLoadComplete = function(target) {
this.lScope.imgHolder.onRelease = this.lScope.onReleaseHandler;
}

var loader:MovieClipLoader = new MovieClipLoader();
loader.addListener(listenerObject);
loader.loadClip(image, imgHolder);
}

public function onReleaseHandler()
{
trace("klik!");
}

}
Probeer zo eens iets achtigs :).

ocdaan
%Europe/Berlin %814 %2005, 20:33
Dit ga ik ff iets beter bestuderen... het is nogal een leuke constructie ;-) toppie, thanx!!!

Dauntless
%Europe/Berlin %817 %2005, 20:36
Graag gedaan :).

Waar was die derde vraag nu? :)

ocdaan
%Europe/Berlin %819 %2005, 20:39
Die ene waren er stiekem 2 ;-) hahah, een her-vraag eingelijk, half puntje dan? hehe;)

Dauntless
%Europe/Berlin %820 %2005, 20:41
Die ene waren er stiekem 2 ;-) hahah, een her-vraag eingelijk, half puntje dan? hehe;)
Hehe, ok dan :). Nu al je drie vragen opgelost zijn blijf je toch terug komen met je classe vragen hé? Dat zijn namelijk de leukste ;) :p (en die komen veel te weinig voor hier op flashfocus :()

ocdaan
%Europe/Berlin %824 %2005, 20:47
Ik merk het ja, nou ik ben met nogal een groot projectje bezig - alles werkt nu al. Maar er zijn inmiddels tientallen functies en over de 500 regels code dus word het een beetje een puinhoopje. Das vandaar dat ik m'n toevlucht zoek in de classes.

Dauntless
%Europe/Berlin %826 %2005, 20:50
500 regels valt relatief gezien héél goed mee hoor :p. Maar classes zijn idd zowieso 'the way to go' als je mooiere, duidelijkere, herbruikbaardere, gestructureerdere code wilt schrijven :).

ocdaan
%Europe/Berlin %829 %2005, 20:54
Opzich wel ja maar mijn code begint nu toch een beetje spagettie te worden... ;) hahaha