-
Notifications
You must be signed in to change notification settings - Fork 1
Session 04 (10.11.23)
In der vierten Session fügen wir den Rahmen um das Spielfeld hinzu. Außerdem definieren wir eine Funktion, die uns anzeigt, ob ein Tetromino an einer Stelle eine Kollision erzeugt.
- Globale Konfiguration
- Rahmen in Spielfeld einfügen
- Funktion um Kollision zu erkennen
Um die Spielfeldgröße global einstellen zu können haben wir eine Variable playfield_size
eingeführt.
var playfield_size = {"x": 10, "y": 20};
Um den Rahmen um das Spielfeld zu zeichnen, fügen wir in das Spielfeldarray Blöcke mit dem Code "f" (für "frame") ein. Diese Methode hat vor allem den Vorteil, dass wir keine weiteren Funktionen schreiben müssen, die ein Out-of-Bounds der Tetrominos checken müssen. Da der Rahmen Teil des Spielfelds ist, können wir einfach über die Kollisionsdetektion ein Out-of-Bounds verhindern.
Bei der Berechnung der Blockgröße muss der Rahmen dann natürlich berücksichtigt werden, deshalb passen wir die Berechnung an.
var block_size = math.floor(math.min(
canvas.height()/(playfield_size["y"]+2),
canvas.width()/(playfield_size["x"]+2)
));
Bei der Initialisierung des Spielfelds müssen wir die Rahmenblöcke dann einfügen. Zunächst fügen wir die obere Reihe mit Frameblocks hinzu, Spielfeldbreite plus zwei extra Blocks für den Rand.
Danach fügen wir vorne und hinten ein "f"
ein um für jede Reihe die Randsteine festzulegen.
Zum Schluss wird wie am Anfang eine Reihe mit Frameblocks eingefügt.
var playfield = [];
playfield.push(Array(playfield_size["x"] + 2, "f"));
for 0:playfield_size["y"] do {
var row = ["f"];
for 0:playfield_size["x"] do row.push(0);
row.push("f");
playfield.push(row);
};
playfield.push(Array(playfield_size["x"] + 2, "f"));
Bei Tetris können keine Blöcke übereinanderliegen. Eine weitere zentrale Funktion ist daher Kollisionen im Spielfeld zu erkennen. Die folgende Funktion erfüllt diese Aufgabe. Als Parameter wird ein Spielstand und ein Tetromino übergeben, und sollte eine Kollision vorliegen gibt die Funktion true zurück, ansonsten false.
function check_collision(playfield, column, row, rotation, type){
var tetromino = tetrominos[type][rotation];
for var i in 0:tetromino.size() do
for var j in 0:tetromino[i].size() do {
if tetromino[i][j] != 0 then
if playfield[column + i][row + j] != 0 then
return true;
}
return false;
}