Toon posts:

[Flash AS] for loop

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voordat ik deze vraag stelde heb ik eerst Gegoogled om uberhoupt de code werkend te krijgen, nu dat eenmaal zo is zit ik met het volgende probleem waarvan ik niet snap dat het zich voordoet, ik heb alleen de noodzakelijke code gepost:

Ik heb een aantal knoppen (k) waar een event aangehangen moet worden, bijvoorbeeld zoals hieronder een JS Alert.

Door deze code worden er 600 events aangemaakt voor 600 knoppen.

for (i=0; i<600; i++) {
_root["k"+i].onPress = function() {
getURL("JavaScript:alert('Alertnummer=("+i+")')");
};
}

Het stukje getURL, daar zit het probleem.
Alle events reageren hetzelfde namelijk met "Alertnummer=600"
Dus als ik op "k30" klik dan krijg ik Alertnummer=600.
Blijkbaar wordt de onPress code wel goed uitgevoerd, want de knoppen reageren.

Het lijkt mij een goede loop, maar blijkbaar gaat er iets fout, iemand een idee?

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Misschien werkt dit beter...

code:
1
2
3
4
5
_root[x].someIndex = x;
_root[x].onPress = function()
{
    getURL("Boo+this.someIndex);
}


maar dan kun je VEEL beter:

code:
1
2
3
4
5
6
7
8
MovieClip.prototype.onMyPress = function()
{
    getURL("Booh"+this.someIndex);
} 
...

_root[x].someIndex = x;
_root[x].onPress = _root[x].onMyPress;

[ Voor 4% gewijzigd door hobbit_be op 01-07-2003 16:22 ]


Verwijderd

Topicstarter
Bedankt voor je reactie,
Ik heb eerst de tweede suggestie geprobeerd maar dat resulteerde in niks. Daarna heb ik de eeste suggestie geprobeerd en aangepast aan mijn code (zoals ook gepost), daarmee kreeg ik wel de getURL functie werkend maar ik kreeg geen waarde doorgestuurd... (someIndex?)

Zou je misschien een oplossing toegesplitst op mijn code kunnen geven?

Verwijderd

volgens mij blijft in de functie die je nu aan je knoppen hangt de variabele i staan, en verwijst deze naar de variabele i op de tijdlijn waar je je for-lus hebt staan. aan het eind van de loop staat i op 600, dus verwijzen alle knoppen naar het getal 600. (je zou dit kunnen checken door na de loop de waarde i op 700 te zetten, en kijken of je overal de waade 700 krijgt) daarom maakt hobbit_be voor elke mc een variabele someIndex aan waarin de op dat moment geldende waarde van i wordt vastgelegd.

[ Voor 14% gewijzigd door Verwijderd op 01-07-2003 16:54 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Verwijderd schreef op 01 July 2003 @ 16:38:
Zou je misschien een oplossing toegesplitst op mijn code kunnen geven?
Nee (wel kunnen niet willen). geen code requests op GoT weet je wel - tgaat erom dat je het probleem begrijpt. zoals Juaron al zei blijft die i behouden en je MOET dus per MC een variable introduceren.

Het zou kunnen dat je:

root[x].someVariable = ""+x;

moet doen ipv gewoon x want het zou kunnen dat ie dan de reference pakt. Ik hoop ten stelligste dat je:

var i = 0; eerst ergens hebt gezet. want zonder die var is die "i" voor AS iets heel anders.

je zou eventueel een substr kunnen doen voor jouw oplossing. kijken naar string functies en natuurlijk eerste casten.

[ Voor 11% gewijzigd door hobbit_be op 01-07-2003 17:06 ]


Verwijderd

Topicstarter
Ok, bedankt voor de uitleg, maar het werkte niet echt.
Op dit moment heb ik dit als getUrl:

getURL("JavaScript:alert('"+this+"')");

hier krijg ik dan bijvoorbeeld een Alertbox uit met '_level0.k131' bij knop 131

Dit is op zich wel ok, alleen zou het het mooiste zijn wanneer er geen '_level0.k' staat. Dus alleen het getal :P

Is er een manier om dit te filteren? Door bijvoorbeeld iets voor 'this' te zetten?

Een oplossing is wel gevonden, maar wanneer er betere zijn hoor ik dit graag of verbeteringen aan deze oplossing.

edit:
we posten tegelijk, bedankt voor de uitleg, maar ook deze oplossing werkt niet goed, ik krijg geen variabele door en de var was gezet ja :-)

edit:
ik ga eerst nu wel weer zoeken naar string functies e.d. en zal me ook verder verdiepen in jullie oplossingen bedankt

[ Voor 33% gewijzigd door Verwijderd op 01-07-2003 17:09 ]


Verwijderd

een instance heeft een naam (this._name) en er bestaat een functie substring.

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

hobbit_be post toch echt het goede voorbeeld dus ik zou zeggen herlees het nog eens en dan proberen en dan nog eens goed lezen. juaron legt het ook nog eens duidelijk uit:

Die variable i moet je local scopen naar je Movieclip, en vanuit de onPress moet je dan verwijzen naar de local variable mbv van het keyword this.

"You're only as good, as what you did last week."


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

nog ff ter aanvulling

Flash ActionScript:
1
2
3
4
5
6
7
8
for ( var i = 0; i < 50; i++ ) {
_root["k" + i ].i = i;

[..]

_root.["k" + i].onPress = function() {
   trace( this.i );
}


is all u need....

"You're only as good, as what you did last week."


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

juaron:
een instance heeft een naam (this._name) en er bestaat een functie substring.
Da's een beetje een vreemde workaround, lijkt me :)

Het heeft iets weg van hetzelfde probleem wat ik laatst had met JavaScript, en aangezien het allebei op ECMA gebaseerd is, heeft AS vast hetzelfde probleem als JavaScript.

Oplossingkjes:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
for ( var i = 0; i < 600; i ++ ) {
   _root [ "k"+i ].onPress 
      = new Function ( 
          "getURL( \"JavaScript: alert( 'Alertnummer=" + i + "');"\");"
      ); 
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// of
myOnPress = function () {
   getURL("javascript:alert('alertnummer'" + this.i + ")" );
}

for ( var i = 0; i < 600; i++ ) {
   root [ "k" + i ].i = i;
   root [ "k" + i ].onPress = myOnPress;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// of
function alerter ( i ) {
   getURL("javascript:alert('alertnummer'" + i + ")" );
}

for ( var i = 0; i < 600; i ++ ) {
   var ptr = _root [ 'k' + i ];
   ptr.i = i;
   ptr.onPress = function () { alerter ( ptr.i ); }
}


Dezelfde oplossingen zijn al min of meer genoemd, maar 't is misschien interessant om dit topic er even op na te slaan :)

[ Voor 17% gewijzigd door drm op 01-07-2003 18:02 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

drm schreef op 01 July 2003 @ 17:59:
[...]
Da's een beetje een vreemde workaround, lijkt me :)
dat is inderdaad een vreemde workaround, maar dit is ook alleen bedoeld om op verzoek van TS iets van een tekstje af te halen.
Verwijderd schreef op 01 juli 2003 @ 17:03:
hier krijg ik dan bijvoorbeeld een Alertbox uit met '_level0.k131' bij knop 131

Dit is op zich wel ok, alleen zou het het mooiste zijn wanneer er geen '_level0.k' staat. Dus alleen het getal :P

Is er een manier om dit te filteren? Door bijvoorbeeld iets voor 'this' te zetten?

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

Het ligt misschien aan mij, maar zijn er nog mensen die het aanmaken van 600 functie-objecten ranzig vinden? Ik bedoel: ik zie het Owen en drm doen ... toch 2 mensen van wie ik weinig ranzige dingen verwacht ;) dus het kan volledig aan mij liggen hoor :)

drm en hobbit_be geven ook 2 alternatieven, waarbij je ook weer zou kunnen discussiëren over de schoonheid: prototype of niet.

Programmeertechnisch vind ik het niet-prototype alternatief de beste oplossing, maar als ik aan footprint denk, zou ik voor het prototype kiezen. Wat jullie guys? B)

Wij onderbreken deze thread voor reclame:
http://kalders.be


Verwijderd

errug ranzig allemaal :D
ik zie _root en ik _level allebei woordjes uit het Flash 4 tijdperk :s
Zowiezo waaaarom wil je 600 knoppen die iets alerten?

prototypes maak je om dingen simpeler te doen, maar dan moet je geen regels stellen, zoals "hobbit_be" doet met de variable "someIndex". (2de post in deze topic)

Nu mis ik nog iets essentieels. Een object waarmee jullie die actie willen uitvoeren.

Nu neem ik aan dat we die hebben ;)
in mijn geval is "basis" een knopje die we met de IDE er neer gezet hebben

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
maakAlertsOpButtons = function () {
    var i,btn
    for (i =0;i<600;i++) {
        btn = "b" add i
        this.basis.duplicateMovieClip(btn,i+1); // liever attachMovie
        this[btn].id = i;
        this[btn].onPress = function () {
            this.getURL("javascript:alert('alertnummer'" + this.id + ")" );
        }
    }
}

[ Voor 39% gewijzigd door Verwijderd op 03-07-2003 08:34 ]


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

GrimaceODespair schreef op 03 July 2003 @ 04:00:
toch 2 mensen van wie ik weinig ranzige dingen verwacht ;) dus het kan volledig aan mij liggen hoor :)

[..]

Wat jullie guys? B)
ok ok...dan nu een wat mooiere oplossing:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// adopted from Yang
MovieClip.prototype.mcExtends = function(superClass) {
   if (typeof superClass == "function") {
      this.__proto__ = superClass.prototype;

      if (typeof this.attachMovie == "undefined") {
         // If not a movieclip, reconstruct the link from the class to
         // MovieClip.prototype starting from the immediate inherited class
         var o = this.__proto__;

         // Check for multi-level inheritance
         var p = o.__proto__.__proto__;
         while (p != null) {
            p = p.__proto__;
            o = o.__proto__;
         }

         // Complete the prototype chain by linking back to MovieClip.prototype
         o.__proto__ = MovieClip.prototype;
      }
      // remove the superclass from arguments and pass only the parameters
      arguments.splice(0,1);
      superClass.apply(this, arguments);
   } else {
      trace("mcExtends: Incorrect superClass type or path - "+ typeof superClass);
   }
};

// prevent from being shown in for..in loops
ASSetPropFlags(MovieClip.prototype, ["mcExtends"], 1);

// Ball class
Ball = function( x, y, name ) {
    this.init( x, y, name );
}

var p = Ball.prototype = new Object();

p.init = function( x, y, name ) {
    this._x = x;
    this._y = y;
    this.name = name;
}

p.onRelease = function() {
    trace( this.name );
}

// attach a ball from lib
for ( var i = 0; i < 600; i++ ) {
    myBallMC = attachMovie( "Ball", "myBall", _global.depth++ );
    myBallMC.mcExtends( Ball, random(Stage.width), random(Stage.height), String.fromCharCode(random(256)) );
}


:)

"You're only as good, as what you did last week."


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Verwijderd schreef op 03 July 2003 @ 08:29:
Zowiezo waaaarom wil je 600 knoppen die iets alerten?
Tja dat is ook een gripe hoor - maar ik denk dat al die oplossingen gewoon de oplossing voor dat probleem waren. Als ze allemaal leuk in een grid leggen tja
dan doe je gewoon 1 MC :) en al je MC (want dit kan ik wel voorstellen) met een manager classe (zodus geen 600 functietjes/vars in je MemSpace).

Owen:
Jikes - ASSetPropFlags? :) Lekker compatible word je code wel niet (laat staan leesbaar ;) ... (tenzij je al weet dat het gaat werken in latere versies).

En nu weten we nog steeds niet wat Dillie nu doet :)

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

offtopic:
Laat hem nou... Owen wou gewoon ff patsen :P :X

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
offtopic:
oh, when: _/-\o_

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 17-06 09:56

XangadiX

trepanatie is zóó kinderachtig

pfff... owen patser :P

Stoer; Marduq


Verwijderd

Topicstarter
hobbit_be schreef op 03 July 2003 @ 12:19:
En nu weten we nog steeds niet wat Dillie nu doet :)
Goed Dillie was een tijdje weg geweest na de post van this._name, omdat dit juist werkte.

Nu ben ik terug, omdat ik een nieuw probleem heb. Tot mijn verbazing zie ik dat er nu nog mooiere oplossingen aangedragen zijn voor mijn probleem, allen dank.

De 600 alertboxjes waren als voorbeeld voor het aanroepen van een functie. De functie die aangeroepen werd was een functie die de tekst van een layer invulde, maar dat doet er niet toe omdat ik nu een layer in flash creeer die gevuld wordt door variabelen die dmv FlashVars naar Flash worden gestuurd.

Het probleem waar ik nu mee zit is dat er 600 onPress functies aangemaakt worden voor 600 MC's en deze 600 onPress functies hebben ook weer 600 eigen functies. Ik merk dat mijn flashbestand erg traag is, ws daardoor.

Nu ben ik bezig om 1 functie te maken en deze te laten aanroepen door de onPress functie, dit nog zonder resultaat.

Ik weet ook niet of, wanneer dit lukt, het probleem van de performance opgelost is. De code die ik had, en die 600 verschillende functies maakt:

for (var i = 0; i<671; i++) {
_root[i].onPress = function() {
inhoud = this._name;
};
}

inhoud is een dynamisch tekstvlak
de nieuwe code waarmee ik bezig ben en uitgaat van 1 functie:

function functieinhoud(i) {
inhoud = i;
};
for (var i = 0; i<600; i++) {
_root[i].onPress = _root.functieinhoud(this._name);
}

Ik had dus gekozen voor this._name, maar zie nu dat op die post alweer veel reacties zijn gekomen, ik ga nu de andere reacties lezen, maar nu weten jullie waarvoor ik gekozen heb en waarmee ik nu zit...

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

Tip 1: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif
edit:
Sorry, beetje aan het slapen


Tip 2: [code]

Tip 3:
code:
1
2
3
function functieinhoud() {
  // Doe iets met this.inhoud
};


Tip 4:
code:
1
2
root[i].inhoud = whatever; // ?
root[i].onPress = _root.functieinhoud;

[ Voor 8% gewijzigd door GrimaceODespair op 09-07-2003 17:18 ]

Wij onderbreken deze thread voor reclame:
http://kalders.be

Pagina: 1