Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Azasel

unregistriert

1

22.08.2017, 19:00

Timer in Javascript

Ich versuche gerade einen Timer für ein Spiel bauen, aber es funktioniert nicht.
render() wird nur einmal aufgerufen, die Eigenschaften des Timerobjektes bleiben weiterhin undefined, auch nach abruf der Methode this.start().

Javascript-Quelltext

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
console.clear();
function Timer()
{
  this.FPS = undefined;
  this.active = undefined;
  this.render = undefined;
  this.self = this;
  
  this.start = function(render, fps)
  {
    console.log("Timer has been activated.");
    this.FPS = 1/fps;
    this.active = true;
    this.render = render;
    this.run();
  }
  this.run = function()
  {
    if(this.active)
    {
      console.log("self fps: " + self.FPS); //undefined
      console.log("run:"+ self.run); //undefined
      setTimeout(self.run, self.FPS);
      this.render();
    }
  }
  this.stop = function()
  {
    this.active = false;
  }
}

function render()
{
  console.log("Timer is running.");
}

var timer = new Timer();
timer.start(render, 2);
Live testen: Timer Link
Irgendwelche Vorschläge, wie ich das ganze besser machen könnte?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

22.08.2017, 19:17

Beim Aufruf des Callbacks wird this nicht übernommen. Standardmäßig war this glaube ich window und dort gibt es natürlich deine in Timer definierten Werte nicht. Du kannst bind verwenden um this an den callback zu binden oder wenn du ES2015 verwendest den fat arrow (=>) für die Funktion.

Mir ist ansonsten nicht klar was du mit den FPS vorhast, aber wenn es um Animationen geht solltest du statt setTimeout lieber requestAnimationFrame verwenden, das wurde genau dafür entwickelt.

3

22.08.2017, 19:23

Ich kann zwar kein JavaScript, aber woher kommt die Variable fps in der Rechnung this.FPS = 1/fps? Wenn die null ist, dann kann das ganze nicht funktionieren (Division durch 0)
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

22.08.2017, 20:13

Ich kann zwar kein JavaScript, aber woher kommt die Variable fps in der Rechnung this.FPS = 1/fps?
Die ist ein Parameter der Funktion. Das ist auch in anderen Sprachen nicht anders ;) Konkret hat sie den Wert '2'.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

23.08.2017, 15:20

Ich kann zwar kein JavaScript, aber woher kommt die Variable fps in der Rechnung this.FPS = 1/fps?
Die ist ein Parameter der Funktion. Das ist auch in anderen Sprachen nicht anders ;) Konkret hat sie den Wert '2'.

Ich hab die letzte Zeile übersehen, von mir aus kann man alle Antworten die mit meinem unnützen Kommentar zu tun haben löschen.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Azasel

unregistriert

6

23.08.2017, 20:48

[Lösung] Ich lass es jetzt einfach mit der ganzen Verschachtelung gut sein.

Mir ist ansonsten nicht klar was du mit den FPS vorhast, aber wenn es um Animationen geht solltest du statt setTimeout lieber requestAnimationFrame verwenden, das wurde genau dafür entwickelt.
Mit requestAnimationFrame hatte ich noch nicht viel zu tun gehabt und es wurde auch nicht gesagt, dass man eine bestimmte FPS Rate einstellen kann, wie soll ich den durch requestAnimationFrame wissen, wie schnell der Bildschirm gerendert wird?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

23.08.2017, 21:13

Mir ist ansonsten nicht klar was du mit den FPS vorhast, aber wenn es um Animationen geht solltest du statt setTimeout lieber requestAnimationFrame verwenden, das wurde genau dafür entwickelt.
Mit requestAnimationFrame hatte ich noch nicht viel zu tun gehabt und es wurde auch nicht gesagt, dass man eine bestimmte FPS Rate einstellen kann, wie soll ich den durch requestAnimationFrame wissen, wie schnell der Bildschirm gerendert wird?

Du kannst die FPS mit requestAnimationFrame nicht einstellen. Du kannst aber natürlich wie bei einem normalen Gameloop die vergangene Zeit ermitteln und damit dafür sorgen, dass deine Spiel- und Animationslogik zeitbasierend aktualisiert wird. Anders herum hast du das Problem, dass du zwar FPS einstellen kannst, aber ja gar nicht weißt ob der Browser so schnell neu zeichnet.

Azasel

unregistriert

8

23.08.2017, 21:21

@Tobiking
Jetzt macht es für mich viel mehr Sinn, danke

Werbeanzeige