Wenn man mit dem Programmieren anfängt ist erstmal alles, was mit Algorithmen und Lösungen finden angeht schwer.
Vielleicht hilft es dir, wenn du dir das Spielfeld als Raster vorstellst. Ich habe die genauen Maße nicht mehr im Kopf, war es 8 Blöcke breit und 20 hoch? Dementsprechend kannst du das Spielfeld als Array vorstellen (Array engl. für 'Feld', suggeriert es ja schon)
Ein Objekt, sprich eine Form, ob diese komische Ecke oder einer Geraden, muss zwangsläufig immer in der Mitte anfangen und immer oben. Das bedeutet erstmal, dass deine Objekte alle eine Position besitzen müssen, die du animieren möchtest. Die Position entspricht dann eben der Position im Feld, welches du zuvor angelegt hast.
Dann folgt ein Kollisionsmodell, welches recht einfach gehalten ist, da es sich hier ja nur um das 2D-Feld geht mit festen Breiten und Kanten. Du musst hier nun überprüfen, ob das unterste Feld / die untersten Felder deines Objektes ein Feld im nächsten Takt (Erklärung folgt gleich) überlappen. Trifft dies zu, befüllst du dein Spielfeld-Array an den entsprechenden Positionen deines Objektes und erzeugst ein neues, zufälliges Objekt, bei dem der ganze Fluss erneut durchläuft. Das Kollisionsmodell muss dann auch hier angewandt werden, ob die oberste Reihe getroffen wird, ansonsten bricht das Spiel ja mit einem Game Over ab.
Der Takt bestimmt im wesentlichen die Spielgeschwindigkeit, da mit ihm die Dynamik ins Spiel gebracht wird, als auch die Schwierigkeit. In JavaFX kannst du das mit der
Timeline und einem unendlichen
KeyFrame realisieren, welches alle Sekunde im einfachsten oder eben Bruchteile für verschiedene Schwierigkeitsgrade einen Takt auslöst bzw. eine Neuberechnung des Spielfeldes.
Das war nun die Logik-Seite, die du für das Spiel auf jeden Fall benötigen wirst. Herunterprogrammieren kann man das recht zügig, auch als Anfänger, wobei das Kollisionsmodell eben etwas tricky werden kann.
Wie bekommst du das nun auf die grafische Oberfläche?
Hier fange ich von vorne an, da ich nicht weiß, wie weit du hier drin bist.
JavaFX arbeitet mit einer
Stage, was, wenn ich es ausdrücken sollte, die Basis für ein Fenster ist. In diese Basis hinein legst du eine
Scene. Ich denke Scene als Szene braucht man nicht näher erläutern, hier passiert eben etwas, wie in einem Film auch
Eine Scene benötigt ein Wurzel-Element, was, meine ich, auf ein AnchorPane beschränkt ist. Ein AnchorPane ist ein Container, der bestimmte Ankerpunkte besitzt und auch automatisch den Content streckt bzw. stauchen kann, je nachdem, wie man das Fenster vergrößert/verkleinert, ein responsives Layout sozusagen also.
Alle Container in JavaFX haben eine getChilden-Methode, die dir eine Liste aller Subelemente, die in diesem Container liegen, zurückliefert. Fügst du hier ein Element an, wird beim nächsten Rendering-Durchlauf dieses neue Element mit angezeigt.
Wie du das Tetris nun umsetzt, liegt in deiner Art und Weise zu programmieren. Es ist möglich, in dieses AnchorPane ein Gridpane zu legen, also einer Art Raster, welches die Maße deines Spielfeldarrays abbildet. Du kannst aber auch hingehen und die einzelnen Blöcke, aus denen die Objekte in Tetris bestehen, einfach auf Pixel umrechnen und so einen Maßstab zu erhalten, der direkt auf einen Block umgerechnet werden kann.
Um auf deine Frage zu kommen, wie sich dein Objekt hier darstellen lässt:
In JavaFX hast du die Möglichkeit auch geometrische Formen in deinen Containern abzulegen. Das macht es relativ leicht, wenn du weißt, dass dein Objekt aus festen Blöcken besteht.
Ich rede nicht umsonst von "Blöcken", da es hiermit wesentlich einfacher ist, eine durchgängige "Rasterstruktur" bezubehalten.
Ein Quadrat stellst du z.B. aus vier Rechtecken mit gleicher Seite da. Eine Gerade ebenfalls mit vier Rechtecken, jedoch anders angeordnet. Wie diese Rechtecke dargestellt werden, ergibt sich schlussendlich aus der Drehachse (Hinweis: drittes Feld: Art des Objektes [Quadrat, Stange, Dreieck usw.], viertes Feld deines Objekts: Drehwinkel)
In deinem Spielfeld musst du nun an entsprechenden Positionen immer mehrere Rechtecke ablegen, die dein Objekt repräsentieren.
Ein Rechteck generierst du mit der Klasse
Rectangle von JavaFX.
Ich hoffe, ich konnte dir hier einen kleinen Einblick geben, wie du dieses Thema am besten angehst, bzw. was diese JavaFX-Welt übe