lehrkraefte:blc:informatik:ffprg2-2024:tetris

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg2-2024:tetris [2025/01/06 11:17] – [setTimeout im Kontext eines Instanz (Objekt)] Ivo Blöchligerlehrkraefte:blc:informatik:ffprg2-2024:tetris [2025/01/20 12:36] (current) – [Code zum Starten] Ivo Blöchliger
Line 2: Line 2:
  
 ===== Code zum Starten ===== ===== Code zum Starten =====
-  * {{lehrkraefte:blc:informatik:ffprg2-2024:tetris.zip}} (Version vom 16Dezember)+  * {{lehrkraefte:blc:informatik:ffprg2-2024:tetris.zip}} (spielbare 2-Spieler Version vom 20Januar)
  
 Was schon läuft: Was schon läuft:
   * Darstellung im Raster   * Darstellung im Raster
   * Abfrage Tastatur   * Abfrage Tastatur
-  * Abfrage Touch +  * Abfrage Touch (nur 1 Player) 
-  * Einige Methoden der Klasse Tetris+  * Tetris, alles bis auf Linien abbauen.
-    * translate, okrotate+
 ===== Vorgehen ===== ===== Vorgehen =====
   * Code in ''ui.js'' und ''tetris.js'' studieren, kommentieren, Fragen stellen.   * Code in ''ui.js'' und ''tetris.js'' studieren, kommentieren, Fragen stellen.
Line 18: Line 17:
   * Gameplay mit ''setTimeout'' realisieren. Dabei unbedingt den Handler speichern, damit dieser auch annuliert werden kann, wenn z.B. der Benutzer den Stein selbst nach unten bewegt. Siehe https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout   * Gameplay mit ''setTimeout'' realisieren. Dabei unbedingt den Handler speichern, damit dieser auch annuliert werden kann, wenn z.B. der Benutzer den Stein selbst nach unten bewegt. Siehe https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout
  
-==== setTimeout im Kontext eines Instanz (Objekt) ====+==== setTimeout im Kontext einer Instanz (Objekt) ====
 Soll im setTimeout eine Methode einer Instanz (Objekt) aufgerufen werden, muss eine Wrapper-Funktion (z.B. mit ''<nowiki>()=>this.bla()</nowiki>'' 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. Soll im setTimeout eine Methode einer Instanz (Objekt) aufgerufen werden, muss eine Wrapper-Funktion (z.B. mit ''<nowiki>()=>this.bla()</nowiki>'' 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.
 <code javascript> <code javascript>
Line 32: Line 31:
 </code> </code>
  
 +==== Callback für Game-Handling ====
 +Ziel: Code in ui.js soll aufgerufen werden, wenn etwas Spezielles im Tetris-Objekt passiert, z.B.
 +  * Game over
 +  * mehr als eine Zeile auf einmal abgebaut wurde (damit dem Gegner welche «untergeschoben» werden können).
 +
 +Vorgehen: Beim Anlegen eines Tetris-Objekts wird ein Object mit Callbacks übergeben.
 +<code javascript>
 +function unterschieben(tetrisInstanz, anzahlLinien) {
 +   // Tu was mit der Tetris-Instanz
 +}
 +function machMalFertig() {
 +   // Tu wat
 +}
 +
 +tetris = new Tetris(raster, {"multipleLinesCallback":unterschieben, "gameOver":machMalFertig});
 +</code>
 +
 +In der Tetris-Klasse sieht die Sache dann wie folgt aus:
 +<code javascript>
 +   // im Constructor die callbacks speichern:
 +   this.callbacks = ...;
 +   
 +   // in der Funktion, die Linien abbaut, den Callback aufrufen
 +   this.callbacks["multipleLinesCallback"](this, anzahlZeilen);
 +</code>
  
  • lehrkraefte/blc/informatik/ffprg2-2024/tetris.1736162243.txt.gz
  • Last modified: 2025/01/06 11:17
  • by Ivo Blöchliger