Autor Beitrag
95CAHEK95
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 02.11.12 15:25 
Hi,

ich wollte mich mal an Tetris wagen und nun kommt ein Problem bei der Kollisionsabfrage.

Ich habe als Spielfeld ein 2D Array Of Integer, was mit 0 und 1 befüllt wird (0 = frei und 1 = belegt).
Jeder Block hat auch sein eigenes 2D Array, wo raus es dann kopiert wird und auf das Spiel-Array draufgepackt.

Nun habe ich aber ein Problem bei den Kollisionen, denn bei jedem Block ist die anders.

Könnte mir einer erklären oder ein Tipp geben, wie ich diese Abfrage am besten machen.

Zb. wäre ein T-Block so bei mir.

000
121
010

Wobei 2 dann der Hauptblock ist, denn nur den bewege ich und von dem aus werden die restlichen Blöcke gezeichnet.

Würde mich über Tipps freuen, wie ich mein Problem lösen kann.


Lg Alex


Moderiert von user profile iconNarses: Topic aus Open Source Projekte verschoben am Fr 02.11.2012 um 14:47
Moderiert von user profile iconNarses: Typo im Titel korrigiert.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Fr 02.11.12 15:50 
Eine Idee:
Du "multiplizierst" Deinen Block mit dem Spielfeld (Position beachten), also jeden Punkt des Blocks mit dem darunterliegenden Spielfeldpunkt malnehmen, Ergebnis aufsummieren. Wenn etwas größer Null rauskommt fand irgendwo eine Kollision statt.
Beispiel ("T" trifft auf liegendes "L"):

000 000 000
121 * 001 = 001
010 111 010

Summe = 2 -> Kollision findet statt

Für diesen Beitrag haben gedankt: 95CAHEK95
95CAHEK95 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 02.11.12 23:09 
Hi mandras,

erstmal Danke für deine Idee.

Ich habe die gerade ausprobiert und musste leider feststellen, dass sie nicht funktioniert. :(

Denn wenn ich den TBlock bewegen will, wird eine Kollision festgestellt.
Denn wenn ich die YKoord. des Hauptblockes verschiebe, prüft er sich selber.

000 => 000
121 => 000
010 => 121
------=> 010

Nun würde sich die 1 aus dem ersten TBlock, mit der 2 in dem 2 TBlock prüfen und sagen das kein Platz ist.

Dann habe ich probiert vor der Summenüberprüfung den Block zu löschen, dann zu prüfen und dann wieder zu malen,
doch wenn ich das mache bewegt er sich einfach durch.

Ich glaube ich mache was falsch.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 02.11.12 23:27 
Hallo 95CAHEK95,
user profile icon95CAHEK95 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe die gerade ausprobiert und musste leider feststellen, dass sie nicht funktioniert. :(
... Denn wenn ich die YKoord. des Hauptblockes verschiebe, prüft er sich selber.

Für eine bessere Hilfe wäre es von Vorteil, wenn Du Deinen Quelltext veröffentlichen würdest. Dann könnte man auch sehen, ob Du ein oder zwei Felder(?), oder etwas ganz anderes, für die Speicherung des Spielfeldes verwendest.

Ich empfehle die Verwendung zweier Felder. Das eine enthält alle leeren Felder und die schon "festliegenden" Steine, das zweite die Lage des Steins, der sich noch bewegt. Dann kannst Du wie oben beschrieben problemlos überprüfen, ob eine Kollision auftritt.
Liegt Dein Stein fest, wird er in das andere Feld kopiert. Die einzige Schwierigkeit ist dann nur noch beide Felder gleichzeitig darzustellen. Das dürfte aber kein Problem sein.
Wie gesagt, ohne genauere Kenntnisse Deines Quelltextes kann man eigentlich nur raten.
Übrigens findest Du bei einer "Tetris"-Suche in der EE viele Beispiele mit Quelltext.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: 95CAHEK95
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 03.11.12 01:14 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Eine Idee:
Du "multiplizierst" Deinen Block mit dem Spielfeld (Position beachten), also jeden Punkt des Blocks mit dem darunterliegenden Spielfeldpunkt malnehmen, Ergebnis aufsummieren. Wenn etwas größer Null rauskommt fand irgendwo eine Kollision statt.
Beispiel ("T" trifft auf liegendes "L"):

000 000 000
121 * 001 = 001
010 111 010

Summe = 2 -> Kollision findet statt

Effizienter wäre es, direkt auszusteigen, sobald an einer Position eine 1 herauskommen würde. Was man also eigentlich nur tun braucht, ist über das Pattern wie folgt zu iterieren.

Pseudocode:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
for x = 0 to pattern.width do
    for y = 0 to pattern.height do // am besten wäre es, von "unten" nach "oben" zu iterieren
        if (pattern[x][y].isSet() && playfield[x + pattern.position.x][y + pattern.position.y].isSet())
        begin
          return true; // Hier kann abgebrochen werden, da eine Kollision stattfindet.
        end;        
return false;

Wobei "pattern" eine solche Struktur ist:
ausblenden Quelltext
1:
2:
3:
000
121
010

und isSet() nur prüft, ob dort keine Null steht. Das Spielfeld ist dann einfach aus Nullen und Einsen aufgebaut.

Für diesen Beitrag haben gedankt: 95CAHEK95
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 03.11.12 11:12 
Zitat:
Denn wenn ich den TBlock bewegen will, wird eine Kollision festgestellt.
Denn wenn ich die YKoord. des Hauptblockes verschiebe, prüft er sich selber.


Kannst du die Reihenfolge der Aktionen einfach umdrehen? Also erst Kollisionsprüfung und dann die Bewegung des Blockes? Bei der Kollisionsprüfung muss der Block dann aber annehmen er wäre schon ein Stück weiter unten.

Für diesen Beitrag haben gedankt: 95CAHEK95
95CAHEK95 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 03.11.12 20:21 
Danke für die vielen Antworten.

Habe mich heute hingesetz und alle ausprobiert und es funktioniert wunderbar.

Die Kollisionsüberprüfung funkt jetzt. Habe das mit 2 2D-Array gemacht.

Danke noch mal an alle.


Lg Alex