HMI Tetris

Kai.R

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute, ich versuche mit einem HMI und einer S7-1200 ein Tetris mit TIA V17 zu programmieren.

Mein Problem ist das nicht weiss wie ich eine Physik einbaue. Das heisst ich weiss nicht wie ich es mache, dass die Blöcke nicht durcheinander fliegen, sondern anhalten. Ich steuere meine Blöcke mit Int werten einmal die X und die Y Koordinate, das funktioniert auch so weit. Aber wenn ich einen neuen Block hinzufüge und in ablegen will, überlappt er einfach mit meinen anderen Blöcken. Dies macht natürlich auch Sinn. Hab ihr irgendwelche Ideen, wie ich eine Kollision erkennen kann.
(Ich bin Lehrling und ziemlicher SPS Anfänger)

Freundliche Grüsse
Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst dich dafür an anderen Programmiersprachen orientieren bzw. an anderen Anwendungen, da Tetris da mittlerweile schon 1-2 mal programmiert wurde.

z.B.: der erste Eintrag in Google: https://code.tutsplus.com/de/implementierung-von-tetris-kollisionserkennung--gamedev-852t

Dementsprechend siehst du, dass hier Arrays für das Spielfeld deklariert werden, dort kannst du dann prüfen welche Plätze belegt sind und nicht, dementsprechend musst du für die Anzeige das ganze dann noch mit deinem Abmessungen kombinieren.
 
Ich hab mit einer S7-1500 und einem Comfort Panel vor etwa 10 Jahren in meiner Ausbildung auch schonmal "4 Gewinnt" programmieren dürfen.

Der Clou am Ende ist, das ganze Spielfeld als ein 2-dimensionales Array zu betrachten und jedem Element dann entsprechend der Belegung eine Variable zuzuweisen.
Bei "4 Gewinnt" war es aber mit der Kollisionserkennung einfacher, da ja nur ein Spielstein bewegt wird, und der in seiner Spalte bis zum Ende fällt. Bei Tetris geht ein Baustein aber über mehrere Array-Elemente, das könnte interessant werden, zumal ja auch noch gedreht werden muss.
 
Ich hab mal ein Tetris in Delphi und später Lazarus programmiert.
Also mal rein von der Spielmechanik lief das bei mir über ein 2-dimensionales Feld-Array

Feld: Array [0..11, 0..20] of ShortInt;

und für jede Bausteinart jeweils 4 mal 2-dimensionale Array

Dim1: Array [1..4, 1..4] of ShortInt;
Dim2: Array [1..4, 1..4] of ShortInt;
Dim3: Array [1..4, 1..4] of ShortInt;
Dim4: Array [1..4, 1..4] of ShortInt;

Dabei waren Dim1 bis Dim4 jeweils die Drehungen der Spielbausteine.
Das hätte man auch mit einem Dim und einer rechnerischen Drehung machen können, aber das wurde mir zu kompliziert (virtuell). ;-)

Bei Start wurde das Feld-Array geleert und ein Baustein wurde per Zufallsgenerator "erzeugt".
Dann wurde per Zeittakt geschaut, ob der Baustein in die nächste Zeile paßt. Das geht rel. einfach, indem man die Koordinate des Bauteins testweise eins nach unten setzt und dann ja nach Drehung Dim1, 2, 3 oder 4 nutzt und vergleicht, ob im Feld-Array an dieser Stelle schon ein "Teilbaustein" liegt. Wenn der ganze Baustein hineinpaßt, dann darf er nach unten, wenn nicht, dann wird er dort als "liegend" in das Array eingetragen. Ähnlich geht man vor, wenn man links drehen/schieben oder rechts drehen/schieben will, das macht man dann, wenn die jeweilig Taste gedrückt wird.
Außerdem wird immer nachdem ein Baustein abgelegt wurde gecheckt, ob eine Zeile im Array voll ist. Wenn ja wird diese Zeile gelöscht, alle Zeilen darüber werden eins nach unten verschoben, dann erneuter Check, ob eine Zeile voll ist, usw.
Das ist erst einmal nur die Spielmechanik.

Das Array und den aktiven Spielbaustein hatte ich mal 2-dimensional visualisiert, das sieht schon mal interessant aus und wäre auf dem HMI erst einmal Step1.

Viel anspruchsvoller war dann die richtige grafische Umsetzung mit den Tetrisbausteinen, wie man sie aus dem Spiel kennt. Das habe ich mit Grafiklisten und tatsächlicher Manipulation auf dem Canvas der Anwendung am PC gemacht, also habe ich über das Feld-Array sozusagen noch einen Grafiklayer gelegt, auf dem ich dann die Grafik "gemalt" und Teile auch wieder "gelöscht" habe. Wie genau man das auf dem HMI machen will, muß man sich erst einmal überlegen, denn das löschen einer Zeile "zerstört" die ursprünglichen Tetris-Bausteine ja teilweise. Das wird auf dem HMI so gar nicht funktionieren.
 
Zuletzt bearbeitet:
Zurück
Oben