setTimeout virker ikke

Tags:    javascript

<< < 12 > >>
Er der nogen der kan hitte ud hvorfor at setTimeout ikke virker i følgende kode?
Fold kodeboks ind/udKode 


Jeg har allerede brugt lindende type funktion hvor der virkede glimrende, den så sådan her ud:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 31.05.2009 20:42 af Bruger #10113
14 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
OK
Den implementation gør at spillet vil køre hurtigt på en hurtig computer og langsommere på en langsom.
Det du burde gøre i stedet er at regne på det med fysikkens regler, lav en setTimeout med et fast interval, og gem et tidsstempel hver gang din falde funktion kaldes. Så kigger du på tiden der er gået siden sidste kald og regner ud hvor figuren skal være udfra dens hastighed.
Så vil spillet køre lige hurtigt uafhængigt af hvor hurtigt computeren kører.

Jeg har faktisk prøvet at have et gammelt dos spil der var uspilleligt fordi computerne var blevet hurtigere, det var PRobots, et spil hvor du skulle programmere din egen robot der så kæmpede mod en ande robot en anden havde programmeret. Men man kunne ikke se hvad der foregik, kampen sluttede på et sekund. Det var først da jeg fik fat i en gammel 8086'er med grøn 12" skærm at vi kunne spille spillet.
Det skulle jo nødigt ske for dit spil når folk spiller det om 10 år :-)



OK
Den implementation gør at spillet vil køre hurtigt på en hurtig computer og langsommere på en langsom.
Det du burde gøre i stedet er at regne på det med fysikkens regler, lav en setTimeout med et fast interval, og gem et tidsstempel hver gang din falde funktion kaldes. Så kigger du på tiden der er gået siden sidste kald og regner ud hvor figuren skal være udfra dens hastighed.
Så vil spillet køre lige hurtigt uafhængigt af hvor hurtigt computeren kører.

Men når jeg bruger setTimeout, så definere jeg jo den tid der skal gå inden at funktionen kalder igen i milisekunder, så det burde vel være samme hastighed på alle computere. Og hvordan ville du gøre dette i praktisk? Hvordan skulle jeg kunne se hvor lang tid der er gået siden sidste kald? Desuden så er pointen ved at der ikke er et fast tidsinterval, at funktionen bliver kaldt oftere og oftere, hvordan skulle jeg gøre det hvis jeg kalder funktionen med et fast tidsinterval?

Og ved du forøvrigt hvad det er der gør at min nuværende kode ikke virker?

Jeg har faktisk prøvet at have et gammelt dos spil der var uspilleligt fordi computerne var blevet hurtigere, det var PRobots, et spil hvor du skulle programmere din egen robot der så kæmpede mod en ande robot en anden havde programmeret. Men man kunne ikke se hvad der foregik, kampen sluttede på et sekund. Det var først da jeg fik fat i en gammel 8086'er med grøn 12" skærm at vi kunne spille spillet.
Det skulle jo nødigt ske for dit spil når folk spiller det om 10 år :-)
Har du prøvet DOSbox? Med det program kan man spille gamle dosspil, selvom at man har en ny computer ;)




Men når jeg bruger setTimeout, så definere jeg jo den tid der skal gå inden at funktionen kalder igen i milisekunder, så det burde vel være samme hastighed på alle computere. Og hvordan ville du gøre dette i praktisk? Hvordan skulle jeg kunne se hvor lang tid der er gået siden sidste kald? Desuden så er pointen ved at der ikke er et fast tidsinterval, at funktionen bliver kaldt oftere og oftere, hvordan skulle jeg gøre det hvis jeg kalder funktionen med et fast tidsinterval?

Ja men når du kommer ned på små tidsintervaller går der længere tid end du har specificert. Hvis du fx specificerer 1ms kan der nemt gå længere, specielt hvis computeren er ved at encode en video samtidigt eller lign.

Du kan få tiden i millisekunder siden 1. Januar 1970 med funktionen getTime().

Du gemmer tiden i fx en global variable
Når så du kalder din falde-funktion igen kalder du getTime() igen og trækker værdien i den globale variabel fra, så har du antal millisekunder siden sidst.

Antallet a pixels du skal flytte er så
V*T
Hvor V er hastigheden på din mand og T er tiden.
Hvis du skal gøre det helt rigtigt skal du beskrive din acceleration som en funktion du integrere til din hastighed som du integrer til din distance.
se fx
http://www.ugrad.math.ubc.ca/coursedoc/math101/notes/applications/velocity.html

Tis sidst sætter du den globale varibel til den tid du hev ud i starten.


Og ved du forøvrigt hvad det er der gør at min nuværende kode ikke virker?

Har du prøvet at indsætte den kode jeg skrev?

Har du prøvet DOSbox? Med det program kan man spille gamle dosspil, selvom at man har en ny computer ;)


Nej jeg er gået væk fra dos, men tak for tippet :-)



Indlæg senest redigeret d. 05.06.2009 17:17 af Bruger #15044
Ok jeg har fiflet lidt
Jeg har slået marioJump og marioFall sammen til een funktion, et hop med både op og ned hvor mario er tilbage til det samme x som han startede ved når funktionen stopper:
Fold kodeboks ind/udKode 

Så vidt jeg kunne se satte du marioAction = 'stand' når han nåede toppen.

Koden er ikke testet overhovedet men måske kan du få den til at virke?

Du kan skrue på GRAVITY og den initiellle fart for at få hoppet hhv. hurtigere og højere

At slå jump funktionen og fall funktionen sammen vil ikke virke, da fall funktionen også kaldes på andre tidspunkter end efter et hop, og det er heller ikke sikkert at Mario skal lande i samme højde som han startede springet, hvis at han nu f.eks. hoppede op på en platform eller lign.

Jeg har dog fået koden til at virke nu ved at bruge dit forslag med getTime();, det giver desværre nogle andre problemer, men dem kan jeg godt selv finde ud af at fikse.



<< < 12 > >>
t