PDA

Volledige versie bekijken : For-loop vraag


dakans
%Europe/Berlin %468 %2005, 12:14
Situatie:

37 buttons zie d.m.v. een onRelease externe SWF'jes loaden.
Inctancename van buttons: f1_btn, f2_btn, f3_btn enz.
Namen van swf'jes: 1-foto.swf, 2-foto.swf, 3-foto.swf enz.

Omdat ik niet 37 keer appart een swf wil aanroepen werd mij een 'for-loop' geadviseerd (zie: http://www.flashfocus.nl/forum/showthread.php?t=4711). Hier ben ik dus (voor het eerst) een beetje mee aan prutsen, maar kom er niet uit.

for(i=1,i<37,i++){
this["("f")i+_btn"].onRelease = function() {
loadMovieNum("i+-foto.swf", 1);
}
}
Dit script werkt dus niet! Ik kan zelf geen andere opties meer verzinnen, daar ben ik toch wat teveel AS-nOOb voor. Dus wie-o-wie helpt mij op weg...

B.V.D. David.

FlashElements
%Europe/Berlin %475 %2005, 12:24
Situatie:

37 buttons zie d.m.v. een onRelease externe SWF'jes loaden.
Inctancename van buttons: f1_btn, f2_btn, f3_btn enz.
Namen van swf'jes: 1-foto.swf, 2-foto.swf, 3-foto.swf enz.

Omdat ik niet 37 keer appart een swf wil aanroepen werd mij een 'for-loop' geadviseerd (zie: http://www.flashfocus.nl/forum/showthread.php?t=4711). Hier ben ik dus (voor het eerst) een beetje mee aan prutsen, maar kom er niet uit.

for(i=1,i<37,i++){
this["("f")i+_btn"].onRelease = function() {
loadMovieNum("i+-foto.swf", 1);
}
}
Dit script werkt dus niet! Ik kan zelf geen andere opties meer verzinnen, daar ben ik toch wat teveel AS-nOOb voor. Dus wie-o-wie helpt mij op weg...

B.V.D. David.


Probeer dit eens:


var myPhoto:String;

for (var i=1; i <= 37; i++) {
eval("f" + i + "_btn").onRelease = function () {
myPhoto = i + "-foto.swf";
loadMovie(myPhoto,1);
}
}



Ik heb het niet getest, maar zo zou het moeten werken!

succes....

FlashElements

Laiverd
%Europe/Berlin %482 %2005, 12:34
Je laadt iedere keer op level 1, waarbij iedere volgende swf de vorige zal overschrijven; dat schiet dus niet op ;) Je zult dus ook je level nummer moeten verhogen, of moeten gaan laden in 37 verschillende movieclips.

Daarnaast start je op deze manier 37 streams en da's volgens mij een beetje veel van het goede en vragen om moeilijkheden. Ik denk persoonlijk dat je beter een onEnterFrame of setInterval loop kunt gebruiken waarbij je een volgende stream pas start wanneer de vorige klaar is. In zo'n loop moet je dus een check (preloade-code) inbouwen om te controleren of een movie al geladen is.

John

dakans
%Europe/Berlin %516 %2005, 13:23
Bedankt Laiverd, maar ben hier al een tijdje mee bezig en heb er ook al meerdere topics aan gewijdt. Ik weet dat ik steeds op hetzelde level laad en dat is ook de bedoeling, de andere swf hoeft niet 'over' de vorige. In een vorig topic had ik al gevraagd of dit in de cache bleef staan. Volgens mateo) was dit niet zo (zie: http://www.flashfocus.nl/forum/showthread.php?t=4339).

In principe is het gewoon een fotoboek. Door een op een knop te drukken, laadt ie een swf (hier zit een motion tween in tussen 2 foto's, dus vandaar swf), door willekeurig op 1 van de andere knoppen te drukken verschijnt de bijbehorende swf. Omdat je nooit weet welke swf als laatste is blijven staan kan je deze ook niet unloaden, dus heb ik er maar voor gekozen om ze te verdringen op level 1 en dat werkt op zich prima...

De situatie is nu dat ik de buttons op het laatse frame van mijn presentatie heb staan (een onEnterFrame wordt em dus niet), vanaf dat punt worden de externe swf'jes geladen. Ik ben wel van plan om het loaden en de buttons in een apparte MC te zetten zodat ik het deze MC via een home-button kan unloaden voordat ik weer terug ga naar frame 1 van de presentatie (daar had ik dus ook al problemen mee, zie: http://www.flashfocus.nl/forum/showthread.php?t=4711).

Ben dus een beginneling in AS en sta dus open voor alle opmerkingen. Ze zeggen weleens dat geduld een schone zaak, maar die wordt op sommige momenten ook flink op de proef gesteld... Is echt ff "learning the hard way"!

dakans
%Europe/Berlin %520 %2005, 13:28
var myPhoto:String;

for (var i=1; i <= 37; i++) {
eval("f" + i + "_btn").onRelease = function () {
myPhoto = i + "-foto.swf";
loadMovie(myPhoto,1);
}
}
Dit ziet er al veel beter uit dan dat van mij FlashElements, maar hij werkt nog niet. Weet namelijk niet waar ik die variabele 'myPhoto' in moet voeren...

FlashElements
%Europe/Berlin %526 %2005, 13:38
myPhoto hoef je nergens in te voeren, het is immers gewoon de naam van je bestand.
Maar waarschijnlijk wil je de foto's in een movieClip laden.

Dus maak een lege movieClip;

en dan gebruik je deze code
myBtn_btn.onRelease = function(){
loadMovie("image1.jpg", logo_mc);
};

dus die 1 die er nu staat wordt de naam van de movieclip


FlashElements

Flasher
%Europe/Berlin %529 %2005, 13:42
var container:MovieClip = this.createEmptyMovieClip("container_mc",1);
for(var i=1; i<=37;i++) {
this["f"+i+"_btn"].photoName = i+"-foto.swf";
this["f"+i+"_btn"].onRelease = function() {
container.loadMovie(this.photoName);
}
}

je moet de naam van de foto opslaan in de button zelf. Anders is i op het moment van klikken altijd 37 oid.
Verder is het beter om de foto te laden in een mc, die kan je makkelijker verplaatsen, verwijderen, enz
Daarnaast start je op deze manier 37 streams en da's volgens mij een beetje veel van het goede en vragen om moeilijkheden. Ik denk persoonlijk dat je beter een onEnterFrame of setInterval loop kunt gebruiken waarbij je een volgende stream pas start wanneer de vorige klaar is. In zo'n loop moet je dus een check (preloade-code) inbouwen om te controleren of een movie al geladen is.
Natuurlijk niet, de streams worden pas gestart bij de onRelease

FlashElements
%Europe/Berlin %541 %2005, 13:59
var container:MovieClip = this.createEmptyMovieClip("container_mc",1);
for(var i=1; i<=37;i++) {
this["f"+i+"_btn"].photoName = i+"-foto.swf";
this["f"+i+"_btn"].onRelease = function() {
container.loadMovie(this.photoName);
}
}



Dat is 'm inderdaad, had even weinig tijd om e.e.a te testen....... :D

dakans
%Europe/Berlin %576 %2005, 14:50
Alvast erg bedankt mensen...
We zijn nu inderdaad dicht bij de oplossing, maar dit snap ik ff niet:
Oorspronkelijk gepost door Flasher
je moet de naam van de foto opslaan in de button zelf.
Bedoel je dat ik de instancename van de button hetzelfde moet noemen als de naam van de desbetreffende foto-swf???

Als dit script goed loopt kan ik via onderstaand scriptje de container_mc unloaden toch???
home_btn.onRelease = function(){
container_mc.unloadMovie()
gotoAndPlay(1);
Ik wil namelijk via een home-button weer terug kunnen naar het begin van mijn presentatie.

Flasher
%Europe/Berlin %608 %2005, 15:36
je moet de naam van de foto opslaan in de button zelf.
this["f"+i+"_btn"].photoName = i+"-foto.swf";

Dat wordt met deze regel gedaan. Het gaat erom dat de variabele photoName in de button zit en niet op de _root

Dat scriptje om terug te gaan naar het begin is idd goed

dakans
%Europe/Berlin %641 %2005, 16:23
Ok, dat snap ik nu. Maar ik krijg hem niet werkend...

Heb alles nagelopen, er zit geen spatie verkeerd, het script genereert zelf een lege MC, ik zie het niet. Of moet ik die lege MC zelf in een apparte layer creëren, nee toch? Er gebeurt helemaal niks...

Dit heb ik nu allemaal op het (laatste) frame staan:
var container:MovieClip = this.createEmptyMovieClip("container_mc",1);
for(var i=1; i<=37;i++) {
this["f"+i+"_btn"].photoName = i+"-foto.swf";
this["f"+i+"_btn"].onRelease = function() {
container.loadMovie(this.photoName);
}
}

home_btn.onRelease = function(){
container_mc.unloadMovie()
gotoAndPlay(1);
}

stop();

Voor de beeldvorming heb ik er 2 prt.screentjes bij gedaan:
1 (http://members.home.nl/dakans/vb1.jpg) Is zonder geladen swf
2 (http://members.home.nl/dakans/vb2.jpg) Zo moet ie worden met geladen swf (hier had ik het AS nog op de button zelf staan en ook zonder het in een lege MC te plaatsen)

Heb je een idee waar het aan zou kunnen liggen Flasher (of anderen)?

FlashElements
%Europe/Berlin %818 %2005, 20:38
Ok, dat snap ik nu. Maar ik krijg hem niet werkend...

Heb alles nagelopen, er zit geen spatie verkeerd, het script genereert zelf een lege MC, ik zie het niet. Of moet ik die lege MC zelf in een apparte layer creëren, nee toch? Er gebeurt helemaal niks...

Dit heb ik nu allemaal op het (laatste) frame staan:
var container:MovieClip = this.createEmptyMovieClip("container_mc",1);
for(var i=1; i<=37;i++) {
this["f"+i+"_btn"].photoName = i+"-foto.swf";
this["f"+i+"_btn"].onRelease = function() {
container.loadMovie(this.photoName);
}
}

home_btn.onRelease = function(){
container_mc.unloadMovie()
gotoAndPlay(1);
}

stop();

Voor de beeldvorming heb ik er 2 prt.screentjes bij gedaan:
1 (http://members.home.nl/dakans/vb1.jpg) Is zonder geladen swf
2 (http://members.home.nl/dakans/vb2.jpg) Zo moet ie worden met geladen swf (hier had ik het AS nog op de button zelf staan en ook zonder het in een lege MC te plaatsen)

Heb je een idee waar het aan zou kunnen liggen Flasher (of anderen)?


Die container waar Flasher het over had is je muur met foto's, als je die container delete dan is natuurlijk alles weg......

Je kunt ze natuurlijk ook op (_level0) ;) plaatsen. Alleen dat is normaal gesproken niet gebruikelijk.......... :D

edit:// TIP! Misschien wel makkelijk ook voor andere mensen om de SWF of FLA in zipfile even ergens neer te zetten online..... misschien dat iemand het zo kan zien waar het probleem ligt. [^]

theFlashWizard
%Europe/Berlin %820 %2005, 20:40
ga is zelf proberen te debuggen.. :)
met de trace method kan je bijna alles ontdekken.. :)
als je bijv is die container traced in die onRelease en hij geeft een path erheen terug dan weet je dat hij wel bestaat en je hem goed aanspreekt..
this["f"+i+"_btn"].onRelease = function() {
trace(container)
container.loadMovie(this.photoName);
}
dus wat komt eruit?

dakans
%Europe/Berlin %877 %2005, 22:04
Ik heb het getraced en nu komt er 'undefined' in het outputvenster te staan wanneer ik op de buttons druk.

Even voor mezelf samenvattend...
Als ik het dus goed begrijp is er nog geen 'container' gedefniëerd. Dat klopt ook wel, want ik zie ook helemaal geen lege MC. De volgende stap die ik zou ondernemen is het creëren van een lege MC met een instancename container_mc. Maar eigenlijk weet ik in mijn achterhoofd wel dat dit niet klopt en idd na een poging blijkt dit ook niet kloppen. Want er is createEmptyMovieClip in het script opgenomen en die wordt waarschijnlijk aangemaakt op level 1.

Ben er wel achter dat ik de lat ff wat te hoog heb gelegd voor mezelf en ga maar weer terug aan de studie [V] . Enige sturing in de goede richting is altijd fijn.

P.S. Ik kan de fla wel on-line zetten, maar deze is van een aardige omvang + nog een html'tje en 37 foto-swf'je die ook 2mb per stuk zijn. Ik wil het zelf ook graag leren en doe daarom ook de nodige moeite om het probleem te omschrijven incl. printscreens.

[edit]
Die container waar Flasher het over had is je muur met foto's, als je die container delete dan is natuurlijk alles weg......
Nog even een reactie. Ik snap het idee van de container wel, maar ik heb nooit iets gedelete... Denk dat ik door mijn weinige kennis van AS ff niet zie wat ik fout doe, maar de aanhouder wint! :P

theFlashWizard
%Europe/Berlin %925 %2005, 23:12
naja 1 ding is zeker.. zoals je hem daar aanspreekt vind hij hem niet..
mischien kun je container_mc is proberen.. dat is ook eigenlijk de echte instancename..

en nog 1 klein dingetje.. je zal nooit n lege mc zien..

Gerrit55
%Europe/Berlin %926 %2005, 23:14
AS 2.0 werkt NIET in Flash MX.

Heren posters, jullie moeten toch een x gaan opletten welke versie van Flash de vragensteller heeft [V] :@

Flasher
%Europe/Berlin %426 %2005, 11:13
Heren posters, jullie moeten toch een x gaan opletten welke versie van Flash de vragensteller heeft [V] :@
Sorry P)

maak van die 1e regel gewoon dit:

this.createEmptyMovieClip("container_mc",1);

en overal waar alleen container staat zet je container_mc neer