Table of Contents

Tetris

Code zum Starten

Was schon läuft:

Vorgehen

setTimeout im Kontext einer Instanz (Objekt)

Soll im setTimeout eine Methode einer Instanz (Objekt) aufgerufen werden, muss eine Wrapper-Funktion (z.B. mit ()=>this.bla() oder so) programmiert werden. Würde einfach nur this.bla als aufzurufenden Funktion übergeben werden, ginge das this, also die Referenz auf die aktuelle Instanz Instanz verloren, weil der Timeout später in einem anderen Kontext aufgerufen wird.

  // Methode der aktuellen Instanz in 1000ms aufrufen
  // Derweil den Timeout-Handler speichern, damit er annuliert werden kann.
  this.timeoutHandler = setTimeout( ()=>this.translate(0,1), 1000);  

In der translate-Methode kann der Timeout dann gecancelt werden:

   clearTimeout(this.timeoutHandler);
   // Sonstiges Zeugs
   // Falls nötig, neuen timeout setzen.

Callback für Game-Handling

Ziel: Code in ui.js soll aufgerufen werden, wenn etwas Spezielles im Tetris-Objekt passiert, z.B.

Vorgehen: Beim Anlegen eines Tetris-Objekts wird ein Object mit Callbacks übergeben.

function unterschieben(tetrisInstanz, anzahlLinien) {
   // Tu was mit der Tetris-Instanz
}
function machMalFertig() {
   // Tu wat
}
 
tetris = new Tetris(raster, {"multipleLinesCallback":unterschieben, "gameOver":machMalFertig});

In der Tetris-Klasse sieht die Sache dann wie folgt aus:

   // im Constructor die callbacks speichern:
   this.callbacks = ...;
 
   // in der Funktion, die Linien abbaut, den Callback aufrufen
   this.callbacks["multipleLinesCallback"](this, anzahlZeilen);