![]() |
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:
habe und den
TBlock = record x,y: integer
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:
jedes Feld bestitzt eine Farbe, oder keine ( weiß) und ist somit leer.
TSpielfeld= array[0..9,0..19] of TColor;
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. |
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 |
Re: Rotationsalgorithmus für Tetrisspielsteine
Das freut mich für dich , bringt mich aber leider nicht weiter :-D
|
Re: Rotationsalgorithmus für Tetrisspielsteine
Erster Einfall:
Delphi-Quellcode:
Ist nur was mir gerade dazu eingefallen ist, ich hab's nicht überprüft, probier einfach mal ob's funktioniert.
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; |
Re: Rotationsalgorithmus für Tetrisspielsteine
Hi Oxmyx,
danke für deinen spontanen Einfall, habe die Funktion an mein Programm angeglichen und berichtigt (
Code:
) 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.
Stein[i].x - Stein[0].x := Stein[i].y - Stein[0].y;
HIer meine angeglichene Version:
Code:
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.
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; 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. |
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; ![]() |
Re: Rotationsalgorithmus für Tetrisspielsteine
Hat der TetrisClone LAN-Support?
|
Re: Rotationsalgorithmus für Tetrisspielsteine
Hi Oxmyx,
RESPECT :thumb: danke für die Zeichnung. Zitat:
|
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; |
Re: Rotationsalgorithmus für Tetrisspielsteine
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz