Avatar billede earp Nybegynder
30. december 2001 - 02:21 Der er 20 kommentarer og
1 løsning

Udføre indholdet af en variabel?

Hej

Hvis man har en variabel, fx

event = \"goToAndStop(4)\";

Hvordan kan man så udføre indholdet af variablen event?
I dette tilfælde skulle den så udføre goToAndStop(4)

earp
Avatar billede lingoman Nybegynder
30. december 2001 - 02:25 #1
Det kan man ikke i actionScript.
Avatar billede earp Nybegynder
30. december 2001 - 03:26 #2
OK, tak.

Så må jeg benytte if-sætninger.

earp
Avatar billede nikolajdu Nybegynder
30. december 2001 - 07:41 #3
Lingo - Nu ved jeg vi tidligere har haft problemer med eval() , men i teorien burde det være muligt den vej :))

/Nikolaj

p.s. Jeg har intet testet af - kun tænkt :))
Avatar billede lingoman Nybegynder
30. december 2001 - 08:15 #4
Desværre er der ingen mulighed for at oprette actioner dynamisk ved runtime, men man kan dog ofte bruge funktioner til noget tilsvarende

eksempelvis

function myEvent() {
  goToAndStop(4);
}

herefter kan man kalde sin action via

myEvent();

Avatar billede nikolajdu Nybegynder
30. december 2001 - 08:18 #5
Jeg stoler på dig :)) Har som allerede sagt ikke testet noget som helst af :(

Dog bliver det efterhånden så meget svært for mig at se hvorfor eval syntaksen ovehovedet findes??
Avatar billede lingoman Nybegynder
30. december 2001 - 08:46 #6
I følge Colin Moock, har det været en bevidst beslutning fra Flash engineers\' side for at begrænse Flash playerens størrelse.

page 95 frit oversat
\" actionScript\'s eval(); kun bruges til en lille brøkdel af det javaScript\'s eval() funktion kan klare.
ActionScripts eval() funktion kan i bedste fald kun hente data\'en forbundet med sit \'argument\'.\"

Men bokel\'s eksempel viser dog at man i alle fald kan få en matematisk fortolker med
myMathString = \"5-4^2\";
trace(Math.eval(myMathString)) ;// giver -3

earp>> Hvis det er noget i denne stil du vil have har bokel lavet et script du blot inkluderer for at udvide actionScript\'s muligheder.
Avatar billede nikolajdu Nybegynder
30. december 2001 - 09:00 #7
Lingo - Det er jo super at vide!! I øvrigt er det ligeså rart for andre at vide at eval() kun er en løsning i nødstifælde! Af den gode grund at eval() kommandoen i ALLE scriptsprog (ASP/PHP/JSP/javaScript og sikkert flere) er for tung. Faktisk hellere have 10 linier kode end én eval() - Den tager Simpelthen for lang tid at udføre :))

/Nikolaj
Avatar billede lingoman Nybegynder
30. december 2001 - 10:23 #8
Hvis det bare kunne gøres med ekstra kode, ja enig! Dog er der mange ting som ikke lader sig gøre uden at man har mulighed for at sammensætte kommandoer dynamisk da man umuligt kan tage højde for alle kombinations mulighederne via if sætninger
Avatar billede nikolajdu Nybegynder
30. december 2001 - 10:47 #9
Lingo - Ingen tvivl om at den kan være hamrende nødvendig!

Det jeg mente var bl.a også at mange bruger eval() helt unødvendigt - Altså hvor ting kan omskrives til at køre hurtigere med en linie eller to. Du ved ligeså godt som jeg at ActionScript er semicompiled og derfor allerede tungt nok og derfor skal vi på alle måder undgå´at gøre tingene værre.. Dette er så i øvrigt gældendede i andre ikke \"semicompiled\" sprog. Eval() er en tung handling at udføre. Det bør for næsten alle midler undgåes.

Nej den kan ikke undgåes, men i en hel de tilfælde alligevel jo.

/Nikolaj :))
Avatar billede nikolajdu Nybegynder
30. december 2001 - 10:48 #10
Geo - Jeg ved vi er enige - Tror bare det er et spørgsmål om formulering her :))
Avatar billede lingoman Nybegynder
30. december 2001 - 11:30 #11
Lige en sidste bemærkning omkring eval();

Den er tung i brug,...MEN kan bruges til at optimere actioner så de kører hurtigere!!!

Fks hvis en action ofte bruger lange dot syntaks a la

for (i = 0; i <100; i++) {

_root.actionMC.loadbar[\"progressIndicator\"+i]._xscale = newScale;
}

Denne action kan optimeres via eval();

loaderMC = eval(\"_root.actionMC.loadbar\");
for (i = 0; i <100; i++) {

loaderMC[\"progressIndicator\"+i]._xscale = newScale;
}


Den tunge del udføres således kun een gang udenfor lykken og opretter en meget hurtigere reference til en nested MC, og resulterer i at koden bliver afviklet hurtigere.
mvh geo

Avatar billede barklund Nybegynder
30. december 2001 - 22:12 #12
Det er mere end muligt at kalde funktioner dynamisk!

Tricket er blot, at kommando og argumenter skal kaldes hver for sig... Jeg har ikke prøvet med den indbyggede gotoAndStop, men vil påstå, at det følgende virker:

command = \"gotoAndStop\";
args = 4;
_root[command](args);

eller skal den kaldes i et mc:

_root.mc[command](args);

Det virker 100p

/Barklund
Avatar billede barklund Nybegynder
30. december 2001 - 22:16 #13
...som svar til Kommentar fra lingoman 
30/12 2001 11:30:06:

Hvorfor bruge eval?

Det virker da vel ligesågodt at skrive:

loaderMC = _root.actionMC.loadbar;
for (i = 0; i <100; i++) {
    loaderMC[\"progressIndicator\"+i]._xscale = newScale;
}

Virker det ikke, så ville jeg bruge:

loaderMC = _root.actionMC[\"loadbar\"];
for (i = 0; i <100; i++) {
    loaderMC[\"progressIndicator\"+i]._xscale = newScale;
}

Faktisk er det kanonsmart at have referencer til mc, da disse kan fungerer som variable med pass-by-reference ligesom objekter...

Jeg har lavet funktioner, der returnerede objekter, og kunne derfor i et kortspil skrive noget med:

if ((_root.stak.topKort()).hitTest(dragger)) { blabla...

Og tilsvarende med arrays af mc:

kortstak = new Array();
for (var i = 0; i < 10; i++)
    kortstak[i] = _root[\"stak\" add i];

og kan så senere skrive:

kortstak[5]._x

osv...
Avatar billede lingoman Nybegynder
30. december 2001 - 23:26 #14
  Barklund>> Jeg er enig med dig at man kan opdele en funktion eller kommando på den måde du beskriveri din kommentar fra  30/12 2001 22:12:01 . Faktisk mener jeg at have forslået det samme eksempel til nikolajdu engang. Der er dog slet ikke tale om eksekvering af en dynamisk skreven action, kun opdeling af en predefineret funktion, hvilket man nemmere kan opnå ved at sende et argument på normal vis.

function myEvent(whichFrame) {
gotoAndPlay(whichFrame);
}

mht hvorfor

loaderMC = eval(\"_root.actionMC.loadbar\");

benyttes i stedet for

loaderMC = _root.actionMC.loadbar;

vil du opdage hvis du eksekverer et timed loop på ca 1000.


eval() er simpelt hen ikke blot hurtigere, men det hurtigste som følgende speedtest viser.


eval(\"obj.prop\") = 5;

=======================
obj = {};
//Test1------------------------
t1Start = new Date().getTime()
i = 10000
while(i--){
    obj.prop = 5;
}
t1 = new Date().getTime() - t1Start;
//Test2------------------------
t2Start = new Date().getTime()
i = 10000
while(i--){
    eval(\"obj.prop\") = 5;
}
t2 = new Date().getTime() - t2Start;
//Test3------------------------
t3Start = new Date().getTime()
i = 10000
while(i--){
    this[\"obj\"][\"prop\"] = 5;
}
t3 = new Date().getTime() - t3Start;
=======================
Result:
t1: 486
t2: 385
t3: 544
=======================
Avatar billede barklund Nybegynder
31. december 2001 - 15:04 #15
> Der er dog slet ikke tale om eksekvering af en
> dynamisk skreven action, kun opdeling af en
> predefineret funktion, hvilket man nemmere kan
> opnå ved at sende et argument på normal vis.

Det er da ikke helt tilfældet, da man netop dynamisk kan angive, hvilken funktion, man ønsker at kalde.

For at vende tilbage til det, som blev nævnt helt i starten, så kan man netop have en kø af funktioner, som skal udføres ved:

queue = new Array();
queue.push({fun: \"gotoAndStop\", arg: 4});
queue.push({fun: \"myFun\", arg: _root._x});
queue.push({fun: \"gotoAndPlay\", arg: 24});

og eksekvere ved:

for (var i = 0; i < queue.length; i++)
    this[queue[i].fun](queue[i].arg);

Man kunne også tilføje en target-property, så man kunne fange funktioner på alle niveauer, og skal der bare køres stop(), så sætter man bare arg = null eller lader den være undefined.

Vi kan da godt kalde det for opdeling af en predefineret funktion, men man kan jo sådan set heller ikke kalde udefinerede funktioner - eller hvad?


Mht. eval():

Jeg var ikke klar over (og kan slet ikke forstå), at eval()-versionen kører hurtigere, men må blot acceptere det...

Da jeg kom hjem i går kiggede jeg mine seneste mange projekter igennem og konstaterede, at jeg overhovedet ikke bruger eval() længere. Jeg tror heller ikke, at du kan komme med et eksempel på brug af eval(), som ikke kan laves med de rimeligt smarte []-access-ting...

At det så åbenbart kan være 0,1 sekund hurtigere ved loop på 10000, kan måske gøre, at jeg vil overveje brug af eval() ved meget tunge beregninger...

Men Flash er jo ikke lavet til tunge beregninger og store, grumme algoritmer, så det vil jeg nok gemme til Java eller noget...

Godt nytår
/Barklund
Avatar billede barklund Nybegynder
31. december 2001 - 15:08 #16
Og så kunne man faktisk godt lave en feval()-funktion, der opdelte kaldet i det nødvendigt antal stykker, fandt det rigtige target og kørte den rigtige funktion med det rigtige argument...

Men da er en større opgave, da men kan skrive noget som:

feval(\"_root.mc[this.target].runTimeFun(this.argument1, this.argument2).gotoAndStop(46)\")

hvilket er rimeligt teknisk at få høvlet igennem...

/Barklund
Avatar billede lingoman Nybegynder
31. december 2001 - 15:30 #17
I lingo bruger vi fks \"do\" kommandoen for at eksekvere en tekst streng. For at se forskellen behøver man dog ikke kigge længere end på javaScripts eval() og actionScripts modpart

se evt
[Skift Operator]  http://www.eksperten.dk/spm/103070

[Skift Operator 2... ]  http://www.eksperten.dk/spm/135347

Godt nytår
Avatar billede lingoman Nybegynder
31. december 2001 - 15:48 #18
Result:
                        t1: 486
                        t2: 385
                        t3: 544

Den korrekte måde at tolke disse resultater på

t2 er  100*(486 - 385)/385 % hurtiger end t1 ... ca 26 % hurtigere

tilsvarende er t2 100*(544 - 385)/385 % = 41 % hurtigere end t3.

Denne performance gain er vel værd at tage med i processor intensive operationer :)
Avatar billede barklund Nybegynder
02. januar 2002 - 16:44 #19
> Denne performance gain er vel værd at tage med
> i processor intensive operationer :)

jaja... Men som sagt vil jeg kun sjældent køre en algoritme, der læser værdier 10000 gange i Flash...

Og dog, så har jeg lavet et lille reversi-spil, der ved expert-modstander evaluerer brættet i 4-5 sekuner... Måske kunne jeg vinde noget der?

Jeg takker for lærdommen, selvom den er lidt off-topic...

/Barklund
Avatar billede barklund Nybegynder
15. januar 2002 - 20:34 #20
Har lige fundet følgende om optimering (sindsyg side udover dette :o):

http://flasm.sourceforge.net/#optas

Alt i alt skal man altid bruge Flash4 syntaks, da det altid er hurtigere end Flash5 versionen... Latterligt! Se især indlægget om String, der efter sigende er dræbende langsomt.

/Barklund
Avatar billede barklund Nybegynder
15. januar 2002 - 20:38 #21
Forresten fandt jeg også på denne flasm-side en funktion, der godt nok skal hardcodes via flasm og ikke kan skrives i flash\'s eget ActionScript, som kan tage en funktion og en liste af dens argumenter og derefter kalde funktionen dynamisk... det ville så være:

evaluateFun(\"gotoAndStop\",[\"4\"])
evaluateFun(\"gotoAndStop\",[\"Scene 1\",\"4\"]);

Det er da smart, men kræver, at man er lidt af en nørd...

/barklund
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester