Volledige versie bekijken : OnRollOver werkt niet zoals ik het wil.
Lambiek
%Europe/Berlin %018 %2005, 01:26
Hallo,
Even kort schetsen:
Ik heb een mc mcHolder met daarin verschillende mc's mcTumb1, mcTumb2, ...
Dus die mcHolder bevat een heleboel tumbnails van mijn foto's.
Die mcHolder scrolt in een venster, zodat ik maar steeds 4 tumbnails te zien krijg.
Totdaar alles goed.
Nu wil ik dat als ik over een tumb ga met mijn muis, deze een alpha krijgt van 100.
Standaard staat die op 70. Ook wil ik, als je op een tumb klikt, het bijbehorende textveld en foto geöpend wordt.
Dit is een stuk van mijn code:
mcHolder.onEnterFrame = function(){
//Er wordt gekeken of er over een tumbnail gegaan wordt, of er op geklikt wodt met de muis.
//Indien er een rollOver plaatsvindt, moet alpha op 100 gezet worden, bij de rollOut moet dat terug
//gezet worden op Tn.alpha.
//Indien er op geklikt wordt, moet de juiste foto en tekstbestand geladen worden.
//mcHolder.mcTumb1.onRollOver = function(){mcHolder.mcTumb1._alpha = 100};
//mcHolder.mcTumb1.onRollOut = function(){mcHolder.mcTumb1._alpha = Tn.alpha};
for(var i=1; i<=Tn.aantal; i++){
mcHolder["mcTumb"+i].onRollOver = function(){
mcHolder["mcTumb"+i]._alpha = 100;
trace("RollOver " + i );
}
mcHolder["mcTumb"+i].onRollOut = function(){
mcHolder["mcTumb"+i]._alpha = Tn.alpha;
}
}
Het probleem is, als ik over een tumb ga dat ik als output krijg "RollOver 20"
ER zijn in mijn geval nu 19 tumbs. Dus i wordt verhoogt tot 20 en wordt dan niet meer toegelaten in mijn for lus.
Volgens mijn redenering dacht ik dat ieder mcTumb zijn functie zou toegewezen krijgen, en die ook zou onthouden. Maar dat werkt blijkbaar niet.
Het stuk code daar juist boven, wat ik in commentaar gezet heb, werkt dan weer wel.
Normaal zou mijn code in mijn for lus toch krak hetzelfde moeten geven?
Het probleem is, ik kan dit wel hard programmeren zoals mijn eerste stuk code die nu in commentaar staat. Maar dan ben ik beperkt in het aantal tumbs volgens het aantal welke ik hi!er nu ingeef. Ik had dit liever wat dynamiser gehouden.
Weet iemand hiervoor een oplossing?
Bij mijn vorige versie ben ik er niet uitgekomen.
Ik dacht, nu zal het me wel lukken, maar weer lukt dat niet.
Bedankt voor de moeite in ieder geval.
Dauntless
%Europe/Berlin %024 %2005, 01:35
Waarom zet je die code in een onEnterFrame ? Je moet toch niet elke frame opnieuw een rollOver en rollOut toekennen?
En je probleem is simpel op te lossen hoor :)
for(var i=1; i<=Tn.aantal; i++){
mcHolder["mcTumb"+i].id = i;
mcHolder["mcTumb"+i].onRollOver = function(){
this._alpha = 100;
trace("RollOver " + this.id );
}
mcHolder["mcTumb"+i].onRollOut = function(){
this._alpha = Tn.alpha;
}
}
Eigenlijk is die 'id' zelfs niet nodig, maar die is er voor als je later nog de i nodig hebt in de movieclip. Anders mag je die regel gewoon verwijderen :).
Is dit wat je bedoelt? Die code moet dus niet in een onEnterFrame omdat je maar 1x een rollOver en rollOut moet toewijzen.
Lambiek
%Europe/Berlin %037 %2005, 01:53
Oke,
Bedankt nog voor die snelle replay op dit late uur.
Maar ik heb je code eens overgenomen, maar mijn tumb doet niets.
Ook krijg ik die trace niet.
Dit is de reden waarom ik die code in mijn onenterframe geplaatst heb.
Want als ik die code (die bij mij in commentaar staat) buiten die onenterframe plaats, werkt ze ook niet meer.
Wat ik inderdaad nogal raar vind.
nog een suggestie misschien?
bedankt
Dauntless
%Europe/Berlin %038 %2005, 01:55
Staat dat script je root ?
Kan je misschien even snel je .fla online zetten ? Want dit is dan een scoping probleem en dan moet de structuur van je fla gekend zijn...
Lambiek
%Europe/Berlin %041 %2005, 01:59
ja die staat op de root,
maar om even snel online te zetten??
Ik ben hier aan zee met een gewone modem aan het surfen.
Mijn fla is 560kb. Ik weet niet of dat haalbaar is.
Dauntless
%Europe/Berlin %042 %2005, 02:00
Het volgende wat ik dan kan bedenken is dat je die for loop uitvoerd voor je buttons op je stage staan... Werkt het als je bv die for loop op de 2de frame zet?
Lambiek
%Europe/Berlin %050 %2005, 02:12
Ik heb hem online
http://users.telenet.be/hein-vera/flash/
Daar vind je ook de nodige foto's en textbestand om het te kunnen draaien.
Er zijn nu maar 2 foto's om het niet te zwaar te maken.
Het probleem bevindt zich in het derde frame.
Ik zou je heel dankbaar zijn.
mvg
Lambiek
%Europe/Berlin %057 %2005, 02:22
Hallo Dauntless,
Ik kruip nu even onder de wol. (daarvoor zal het wel wat te warm zijn)
Moest je problemen hebben met mijn fla, laat me iets weten.
Dan stuur ik een door met meer foto's.
Naar mijn code van mijn masker moet je maar niet kijken. Die moet ik nog onder handen nemen. Dit is nog een overblijfsel van mijn eerste site. Die onenterframes moeten daar ook nog weg.
In ieder geval waardeer ik het erg dat je er eens wil naar kijken.
slaapwel. (laat er uw slaap niet voor hé, anders voel ik me schuldig)
Lambiek
%Europe/Berlin %059 %2005, 02:24
Heb er zojuist die functie plaatsmasker nog uitgehaald.
Had die niet meer nodig.
Dauntless
%Europe/Berlin %064 %2005, 02:32
Ik denk dat het aan de volgende dingen ligt:
-Je gebruikt maar 1 movieclip loader. Ik denk at het beter is als je voor elke Mc een movieclip loader maakt
-Je wil een onrollover toepassen op een movieclip die eigenlijk leeg is, misschien geeft dat problemen. Je zou dus die onRollover events in de onLoadComplete method moeten krijgen. Maar dat gaat dan natuurlijk weer pas als je voor elke mc een aparte movieClipLoader aanmaakt.
(Ps: Ik heb wel nog nooit met de movieClipLoader gewerkt, dus als het een algemeen gebruik is om 1 movieClipLoader instance te gebruiken, sorry :) ).
//Edit: jup, ik had gelijk :).
Het is nu wel mogelijk om 1 instance te gebruiken, maar eigenlijk is dit niet zogoed, omdat misschien 1 foto wat langer (ook al is het maar een paar miliseconden) moet laden dan de rest, en dan worden de onRollOver commands weer toegepast voor elke foto is ingeladen. Dus hier is je fla :).
Hehe, nu voel ik me weer goed voor ik ga slapen :D
Lambiek
%Europe/Berlin %448 %2005, 11:45
Wel hartelijk bedankt man.
Goed geslapen?
Dit werkt wel goed. Maar als ik het goed begrijp kan dit wel fouten opleveren?
Ik ga dat nog eens rustig bestuderen.
Ik heb nog geprobeerd die rollover bij het aanmaken van mijn tumbs te stoppen, wat me ool logisch leek, maar dat werkt ook niet.
for(var i=1; i<=Tn.aantal; i++){
mcHolder.createEmptyMovieClip("mcTumb"+i, 150+i);
mcHolder["mcTumb"+i]._x = 0;
mcHolder["mcTumb"+i]._y = (Tn.h + Tn.space) * (i-1);
mcHolder["mcTumb"+i]._alpha = Tn.alpha;
vierkant(mcHolder["mcTumb"+i],0, 0, Tn.b, Tn.h,1, 100);
mcHolder["mcTumb"+i].id = i;
mcHolder["mcTumb"+i].onRollOver = function(){
this._alpha = 100;
trace("RollOver " + this.id );
}
mcHolder["mcTumb"+i].onRollOut = function(){
this._alpha = Tn.alpha;
}
//my_mcl.loadClip(Tf["Url"+s]+"fotok"+i+".jpg", _root.bord.col["container"+s]+["mcTumb"+i]);
}
Normaal zou dat toch ook moeten werken??
Heb jij daar enig commentaar op?
En nog eens bedankt he man :) :)
Lambiek
%Europe/Berlin %493 %2005, 12:51
Hallo Dauntless,
nog een klein vraagje.
Wat doet deze code juist?
var root:MovieClip = this;
Ik heb nog nooit gebruik gemaakt van ":"
Heeft dat iets met classes te maken in Flash?
Ik heb hier nog niet met classes gewerkt.
Zal voor mijn volgende versie zijn geloof ik. :D
Of wil dat gewoon zeggen dat root een movieClip is en dat die gelijkgesteld wodt aan this?
Waarom kan je dan niet gewoon this gebruiken?
Kan je dat je wat verduidelijken??
Ik weet graag wat ik doe ;)
Bedankt voor je hulp. :)
Dauntless
%Europe/Berlin %718 %2005, 18:14
Graag gedaan :).
Wat doet deze code juist?
var root:MovieClip = this;
Deze code gebruik ik zowat in eendert welke .fla die ik maak. Ipv _root te gebruiken maak ik m'n eigen root var: root . Door er achter te zetten dat hij van het type MovieClip is krijg ik ook alle code hints ( root. geetft een lijstje van mogelijke methodes). Dan verwijst hij naar this, the hoofdtijdlijn. Dit zorgt ervoor dat je handig met 'root' kan werken, en toch relatieve paden kan houden (handig als je die swf ergens gaat inladen).
Of wil dat gewoon zeggen dat root een movieClip is en dat die gelijkgesteld wodt aan this?Ongeveer, root is een referentie naar de hoofdtijdlijn en is niet echt een nieuwe movieclip (beetje overlappend, i know :p).[/quote]
Waarom kan je dan niet gewoon this gebruiken?
Ik gebruik die root binnen de onLoadComplete event van de MovieClipLoader class. Omdat het soms nogal vaag kan zijn (vooral in classes) over relatieve paden ivm objecten (loadVars, xml, etc), dat als je this._parent traces, je undefined krijgt. Daarom kan ik daar dus geen this. gebruiken. Als ik echter de root var gebruik (die beschikbaar is in het object), kan ik er altijd zeker van dat ik op de juiste tijdlijn aan het werken ben :).
Dit is best een lange en misschien verwarrende uitleg voor 1 simpel regeltje, maar als je iets niet begrijpt zeg je het maar :).
Ohja, dat je bij het aanmaken van de thumbs een rollOver toewijst... Dat zou eigenlijk moeten werken. Ik dacht eerst dat het misschien niet zou werken om dat je een rollOver toekent aan een lege MC, maar blijkbaar gaat dat wel (dus dat je er later pas content in zet). Bekijk dit voorbeeld:
this.createEmptyMovieClip("mc", 1);
mc.onRollOver = function(){
trace("rollOver");
}
mc.lineStyle(1, 0x000000);
mc.beginFill(0xFF0000, 100);
mc.lineTo(10,10);
mc.lineTo(0, 10);
mc.lineTo(0, 0);
mc.endFill();
Lambiek
%Europe/Berlin %728 %2005, 18:29
Bedankt voor de uitleg, het wordt al wat duidelijker.
Maar waarom zou mij code die gepost is om 11u45 dan niet werken.
Dat lijkt me toch juist hetzelfde?
Of zie ik nog wat over het hoofd.
Ik moet wel toegeven, dat flash niet een van de gemakkelijkste talen is.
VB.Net lijkt me toch eenvoudiger.
Lambiek
%Europe/Berlin %733 %2005, 18:35
oh ja,
Ik heb je code eens getest met tussen de tumbs een tumb die veel groter is dan de rest.
Zodat deze later ingeladen is dan de rest om eens te zien of alles nog juist loopt.
Ik heb twee maal ctrl enter gedrukt zodat ik real life kan volgen, en alles loopt perfect. ;)
Maar toch vraag ik me nog af, waarom mijn code om 11u45 niet wil werken? :confused:
In ieder geval veel dank voor de geboden hulp.
Dit is niet de eerste keer dat jij me uit nood helpt. :)
Dauntless
%Europe/Berlin %739 %2005, 18:44
Waarschijnlijk kan ik je vraag niet beantwoorden door m'n gebrek aan kennis over movies inladen . Blijkbaar worden de rollOver / rollOut / ... events gereset wanneer je een movie inlaadt ... Tamelijk vreemd eigenlijk :). Het kan ook zijn dat de MovieClipLoader class hier voor zorgt en dat het gewoon zou werken als je loadMovie() gebruikt...
Dit is niet de eerste keer dat jij me uit nood helpt.
1. Wat valt er nog te doen om half drie snachts ?
2. Ik ben verslaafd aan het forum :D
3. Ik ben dus ook verslaafd aan flash
4. Als ik niet graag mensen help zou ik hier ook niet zijn :p
Maar graag gedaan :). Ik hou van uitdagingen :D
Lambiek
%Europe/Berlin %748 %2005, 18:57
Tamelijk vreemd eigenlijk
Zo zijn er wel meer vreemde dingen in Flash. Soms al gedacht dat ik er grijs ging van worden.
1. Wat valt er nog te doen om half drie snachts ?
Aan je leeftijd te zien, zal je wel geen last hebben van een vrouwtje die je in bed wil. :D :D
Je moeder misschien?? :rolleyes:
In ieder geval, het is beter dat je aan Flash en het forum verslaafd bent dan aan drugs en andere troep. Ik zou dat ook liever zien voor mijn kinderen.
Wie weet kan je er later nog je broodwinning van maken.
Ik zal je nog wel eens ontmoeten hier.
Het resultaat laat ik je nog wel eens zien.
Met vriendelijke groeten. :)
Lambiek
%Europe/Berlin %785 %2005, 19:50
Ik dacht dat mijn problemen van de baan waren, maar er is er nog eentje.
var root:MovieClip = this;
myMcl.onLoadComplete = function(targetMc) {
for (var i = 1; i<=root.Tn.aantal; i++) {
root.mcHolder["mcTumb"+i].onRollOver = function() {
this._alpha = 100;
trace("RollOver "+this);
};
root.mcHolder["mcTumb"+i].onRollOut = function() {
this._alpha = Tn.alpha;
};
root.mcHolder["mcTumb"+i].onPress = function(){
trace("onPress " +this);
trace("onPress i = " + i);
//mcFoto.loadMovie(Tf["Url"+s]+"foto"+i+".jpg");
};
}
var loadProgress = myMcl.getProgress(targetMc);
trace("laden is gedaan");
};
Ik dacht ik ga in 1 moeite door met een onPress.
Als ik een trace doe, dan krijg ik wat ik moet krijgen.
Doe ik een trace van mijn i dan krijg ik 20 (Dus het aantal mcTumbs +1)
Maar ik moet de i krijgen van het betreffende mc. Want deze heb ik nodig om mijn foto in te laden.
Ik heb dan nog bij het aanmaken van mijn mcTumbs een .id gedefinieerd, maar als ik dit wil oproepen hier, krijg ik dan een undefined.
Heb jij soms een idee hoe ik de juiste i terug te pakken kan krijgen?
Bedankt
Hein
Laiverd
%Europe/Berlin %865 %2005, 21:46
Begin in je for loop eens vanaf 0 te tellen i.p.v. 1. Dus:
var i = 0John
Lambiek
%Europe/Berlin %911 %2005, 22:52
@Laiverd
Daar zit zeker het probleem niet.
Het is het feit dat ik de oorpronkelijke i's kwijt ben.
Ik krijg wel de juiste tumbs terug, maar niet mijn i's.
Flasher
%Europe/Berlin %911 %2005, 22:52
Waarschijnlijk kan ik je vraag niet beantwoorden door m'n gebrek aan kennis over movies inladen . Blijkbaar worden de rollOver / rollOut / ... events gereset wanneer je een movie inlaadt ... Tamelijk vreemd eigenlijk :). Het kan ook zijn dat de MovieClipLoader class hier voor zorgt en dat het gewoon zou werken als je loadMovie() gebruikt...
onRollOver/onRollOut en andere events geven problemem bij een loadMovie()
al eerder problemen mee gehad :)
Laiverd
%Europe/Berlin %925 %2005, 23:13
Even uit het hoofd dan; had het probleem ook niet helemaal goed gelezen. Probleem is dat als je in een for loop acties wilt toekennen aan dynamische mc's, dat je er dan even voor moet zorgen dat iedere mc een unieke identifier krijgt, anders krijgt ieder mc de acties van de laatste ;) En dat wil je dus niet. Heb er ook tijden mee lopen vechten, en zoiets als dit is de oplossing. Het voorbeeld is gebaseerd op jouw code maar je moet 'm er even zelf invogelen. Ik had geen zin om iets uitgebreids met een loadMovie te doen ;)
for (var i = 1; i <= 10; i++) {
var p = this.attachMovie("square_mc", "btn" + i, i);
p._x = i * 25;
p._y = 50;
p._alpha = 50;
// hier maak je de unieke referentie
p["btn" + i] = p;
trace(p["btn" + i]);
// en die gebruik je in je actie toekenning
p["btn" + i].onRollOver = function() {
this._alpha = 100;
trace("RollOver " + this);
};
p["btn" + i].onRollOut = function() {
this._alpha = 50;
};
p["btn" + i].onPress = function() {
trace("onPress " + this);
trace("onPress i = " + i);
//mcFoto.loadMovie(Tf["Url"+s]+"foto"+i+".jpg");
};
}John
Dauntless
%Europe/Berlin %945 %2005, 23:41
for (var i = 1; i <= 10; i++) {
var p = this.attachMovie("square_mc", "btn" + i, i);
p._x = i * 25;
p._y = 50;
p._alpha = 50;
// hier maak je de unieke referentie
p["btn" + i] = p;
trace(p["btn" + i]);
// en die gebruik je in je actie toekenning
p["btn" + i].onRollOver = function() {
this._alpha = 100;
trace("RollOver " + this);
};
p["btn" + i].onRollOut = function() {
this._alpha = 50;
};
p["btn" + i].onPress = function() {
trace("onPress " + this);
trace("onPress i = " + i);
//mcFoto.loadMovie(Tf["Url"+s]+"foto"+i+".jpg");
};
}
Nu ben je ff vaag bezig :s (of het ligt natuurlijk aan mij :D.
Eerst een mc attachen en die toekennen aan de variabele p. Dan stel je een x en y en alpha in (ok tot daar), maar waarom doe je dan p["btn"+i] = p ? Dat snap ik echt niet? :s (Kan je het even uitleggen ?). p IS toch this["btn"+i] en er bestaat toch geen this["btn"+i]["btn"+i] ? Of zie ik het verkeerd? Het is zowieso nogal raar eigenlijk :s
En je krijgt '20' door iets dat ik gisteren gezegd heb:
igenlijk is die 'id' zelfs niet nodig, maar die is er voor als je later nog de i nodig hebt in de movieclip. Anders mag je die regel gewoon verwijderen
Nu heb je hem dus nodig :) :
var root:MovieClip = this;
myMcl.onLoadComplete = function(targetMc) {
for (var i = 1; i<=root.Tn.aantal; i++) {
var mc:MovieClip = root.mcHolder["mcTumb"+i];
mc.id = i;
mc.onRollOver = function() {
this._alpha = 100;
trace("RollOver "+this);
};
mc.onRollOut = function() {
this._alpha = Tn.alpha;
};
mc.onPress = function(){
trace("onPress " +this);
trace("onPress i = " + this.id);// HIER
//mcFoto.loadMovie(Tf["Url"+s]+"foto"+this.id+".jpg"); // EN HIER
};
}
var loadProgress = myMcl.getProgress(targetMc);
trace("laden is gedaan");
};
Lukt het zo? :)
Lambiek
%Europe/Berlin %955 %2005, 23:55
Bedankt man.
Je bent een genie.
Je mag inderdaad zeggen dat je verslaaft bent aan flash.
Ik had die id aangemaakt bij de creatie van die Tumbs, maar blijkbaar kent hij die id's niet meer waneer ik ze dan nodig heb.
Nogmaals bedankt.
En dat voor je leeftijd, hoedje af. :) :)
Laiverd
%Europe/Berlin %962 %2005, 00:05
@dauntless : da's inderdaad wat minder vaag ;) Ik heb dit script ooit eens zo gebruikt en het werkte. Dus verder nooit meer daar omgekeken. Maar wat jij doet met var mc:MovieClip = root.mcHolder["mcTumb"+i]; is in feite niet zoveel anders dan wat ik doe met var p = this.attachMovie("square_mc", "btn" + i, i); En dat gedoe met _x _y en _alpha was gewoon omdat ik even met een voorbeeldje bezig was en de buttons even een plekje wilde geven en ze iets wilde geven om wat te doen te hebben (alpha wijziging onRollOver).
Ik geloof dat
// hier maak je de unieke referentie
p["btn" + i] = p;
bij mij het overbodige stukje is.
John
Dauntless
%Europe/Berlin %965 %2005, 00:10
Ik had die id aangemaakt bij de creatie van die Tumbs, maar blijkbaar kent hij die id's niet meer waneer ik ze dan nodig heb.
Lijkt me straf aangezien je op regel 4 van dat scriptje pas een mc attached... Waar heb je die id dan op gezet? :D
En op de rest van je post: Bedankt! :I:I:I
Dauntless
%Europe/Berlin %967 %2005, 00:13
Maar wat jij doet met var mc:MovieClip = root.mcHolder["mcTumb"+i]; is in feite niet zoveel anders dan wat ik doe met var p = this.attachMovie("square_mc", "btn" + i, i);
Da's inderdaad hetzelfde, en daar had ik het dan ook niet op :). Het was idd die
// hier maak je de unieke referentie
p["btn" + i] = p;
die zo raar overkomt...
Voor de rest was het natuurlijk helemaal juist :) (Buiten dan dus dat de onRelease en zo korter kan (p.onRelease ipv p["btn"+i]). En dat vind ik dus juist het rare :D zovel p als p["btn"+i] werkt (volgens jou)... Dat kan toch eigenlijk niet? :s
Laiverd
%Europe/Berlin %971 %2005, 00:18
Het werkt wel, maar zoals ik al zei, is het niet zoveel anders, maar bevat het zeker overbodige code. Wat ik eigenlijk heb gedaan is iets idioots als:
p = mc
q = p
q.onRelease = function() ...........
Tsja. Redelijk debiel ja ;)
John
Dauntless
%Europe/Berlin %975 %2005, 00:24
Als ik die structuur even ontleed:
Eigenlijk maak je dus IN elke nieuw aangemaakte mc een nieuwe var aan met dezelfde instance naam als de mc zelf. Die var verwijst dan naar zichzelf (de mc waar hij inzit) en op die manier verwijst p["btn"+i] tóch naar de gewone p ...
Eigenlijk best wel grappig script :D
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.