Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rotationsalgorithmus für Tetrisspielsteine (https://www.delphipraxis.net/37510-rotationsalgorithmus-fuer-tetrisspielsteine.html)

Wuaegner 6. Jan 2005 17:29


Rotationsalgorithmus für Tetrisspielsteine
 
Hallo,
Ich programmiere gerade ein sehr einfach gehaltenen Tetrisklon. Ein Spielstein besteht aus vier Blöcken, weshalb ich einen Typ:
Code:
TBlock = record x,y: integer
habe und den
TSpielstein= array[0..5] of TBlock wobei [5].x die Farbe des Steins speichert und in [0].x und [0].y die Koordinaten des Drehpunkts gespeichert sind.
Mein Spielfeld:
Code:
TSpielfeld= array[0..9,0..19] of TColor;
jedes Feld bestitzt eine Farbe, oder keine ( weiß) und ist somit leer.
Jetz suche ich nach einer geschickten Lösung wie ich die 7 vers. Spielsteine die es gibt drehen lassen kann, ohne jeden Drehzustand jedes Steins gespeichert haben zu müssen und ihn dann abrufe.
Möchte dass irgendwie relativ zum Drehpunkt machen.
Weiß aber noch leider keine Lösung.
Hoffe ihr wisst was.

Tubos 6. Jan 2005 17:35

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Wer sagt's dennn...
Ich habe demnächst (wenn ich die Zeit finde meinen Tetris-Clone weiterzuprogrammieren) das selbe Problem :D

Wuaegner 6. Jan 2005 17:46

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Das freut mich für dich , bringt mich aber leider nicht weiter :-D

Oxmyx 6. Jan 2005 18:12

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Erster Einfall:

Delphi-Quellcode:
procedure Rotate90(var Stein: TSpielstein);
var
  i, temp: Integer;
begin
  for i := 1 to 4 do begin
    temp := -Stein[i].x - Stein[0].x
    Stein[i].x - Stein[0].x := Stein[i].y - Stein[0].y;
    Stein[i].y - Stein[0].y := temp;
  end;
end;
Ist nur was mir gerade dazu eingefallen ist, ich hab's nicht überprüft, probier einfach mal ob's funktioniert.

Wuaegner 7. Jan 2005 19:48

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Hi Oxmyx,
danke für deinen spontanen Einfall, habe die Funktion an mein Programm angeglichen und berichtigt (
Code:
Stein[i].x - Stein[0].x := Stein[i].y - Stein[0].y;
) das gab ne fehlermeldung also hab ich mathematisch korrekt einfach auf beiden seiten |+Stein[0].x gemacht, also vom Sinn her eigentlich nichts geändert.
HIer meine angeglichene Version:
Code:
function TEngine.Rotate90(SpSt: TSpielStein): boolean;
var
  temp,i: Integer;
  AltSpF: TSpielfeld;
begin
 result:= false;
 AltSpF:= FSpielfeld;
 for i:= 1 to 4 do       // alten SpSt löschen da er bei erfolgr. Drehung nicht da wäre
  FSpielfeld[FSpielStein[i].x,FSpielStein[i].y]:= FFreeColor;

  for i := 1 to 4 do                 // Koord. werden verschoben
  begin
    temp := -SpSt[i].x - SpSt[0].x ;
    SpSt[i].x := SpSt[i].y - SpSt[0].y+ SpSt[0].x;
    SpSt[i].y := temp+ SpSt[0].y;
  end;

 if SpielSteinPasst(SpSt) then
   begin
   FSpielStein:= SpSt;
   MacheSpStZuEchtem(SpSt);
   result:= true;
   FStatus.DrehungWarMoeglich:= true; // Status wird akt.
   end
  else
   begin
   FSpielfeld:= AltSpF;   // Spielfeld zurücksetzen
   FStatus.DrehungWarMoeglich:= false; // Status wird akt.
   end;
end;
Jetzt funktioniert es nur nich ganz, manchmal dreht es die Steine richtig aber manchmal kommen auch negative X-Werte für die Steine raus, obwohl ein Stein in der Mitte des Spielfeldes gedreht wird.
Drum is meine Frage ob du mal sagn kannst wie du zu deinen Gleichungn obn kommst und was für einen Drehpunkt sie benötigt, hab das noch nicht ganz durchschaut.

Oxmyx 9. Jan 2005 14:48

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Ich hab mal eine Zeichnung angefertigt. Der graue Spielstein soll um 90° im Uhrzeigersinn in die gelbe Stellung gedreht werden. Dabei gilt dann:
x = y;
y = -x;

http://home.arcor.de/oxmyx/tetris.jpg

Der_Ventilator 9. Jan 2005 15:02

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Hat der TetrisClone LAN-Support?

Wuaegner 9. Jan 2005 18:59

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Hi Oxmyx,
RESPECT :thumb: danke für die Zeichnung.
Zitat:

Hat der TetrisClone LAN-Support?
Nein hat er bis jetzt noch nich und ich denke auch nich dass er das noch bekommen wird, weil's eh nich über LAN gespielt wird.

Wuaegner 10. Jan 2005 13:30

Re: Rotationsalgorithmus für Tetrisspielsteine
 
So für alle die es interessiert ist hier der Source wie sich bei mir die Steine ohne Fehler drehen:
Code:
begin
 result:= false;
 AltSpF:= FSpielfeld;

 for i:= 1 to 4 do       // alten SpSt löschen da er bei erfolgr. Drehung nicht da wäre
  FSpielfeld[FSpielStein[i].x,FSpielStein[i].y]:= FFreeColor;

// Zuordnen

  for i:= 1 to 4 do     // Drehpunkt: (0|0); Stein darüber : (0|1) usw.
   begin
     SpSt[i].x := SpSt[i].x - SpSt[0].x;
     SpSt[i].y := -SpSt[i].y + SpSt[0].y;
   end;
  SpStAlt := SpSt;

// Drehen

  for i:= 1 to 4 do
   begin
     SpSt[i].x:= SpStAlt[i].y;    // x := y;
     SpSt[i].y:= - SpStAlt[i].x;  // y := -x;
   end;

// Zurück zuordnen

  for i:= 1 to 4 do       // Speilstein erhält wieder seine
   begin                  // Koord. relativ zum Spielfeld, nicht mehr zum Drehpunkt
     SpSt[i].x := SpSt[0].x + SpSt[i].x;
     SpSt[i].y := SpSt[0].y - SpSt[i].y;
   end;

Der_Ventilator 12. Jan 2005 17:54

Re: Rotationsalgorithmus für Tetrisspielsteine
 
Zitat:

Zitat von Wuaegner
Hi Oxmyx,
RESPECT :thumb: danke für die Zeichnung.
Zitat:

Hat der TetrisClone LAN-Support?
Nein hat er bis jetzt noch nich und ich denke auch nich dass er das noch bekommen wird, weil's eh nich über LAN gespielt wird.

Meine Kumpels und ich zocken oft Tetris im LAN, aber nur das alte TetriNet1, das nur eine Auflösung von 640x480 unterstützt. Deswegen such ich eine neuere Tetris-Lan Version.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz