Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Tetris erstellen - wie ? (https://www.delphipraxis.net/164221-tetris-erstellen-wie.html)

Edlmann 3. Nov 2011 11:52

AW: Tetris erstellen - wie ?
 
Zum Einen: Erst Blockaussehen definieren, dann benutzen.
Zum Zweiten: Warum px[0..3] und py[0..3]? Damit gehst du ja nur eine Zeile und eine Spalte durch. Ich würde die Blöcke als

Delphi-Quellcode:
  ObjType: Array[1..7] of Record
    VMatrix: Array[0..3, 0..3] of Boolean;
    cRGB: TcRGB;
  end;
Definieren. Also Eine Matrix von 4x4, die das Aussehen der Blöcke definiert. Auch reichen hier Variablen vom Typ Boolean, da man ja nur 1 und 0 hat (1=> An dieser Stelle der Matrix ist ein Stein, 0 => Kein Stein)

Zum Zweiten: Du gehst im Moment nur jeden Wert durch und setzt ihn auf 1, korrekt wäre:

Delphi-Quellcode:

 // Block-Daten einstellen
 // -- Type 1 -- //
 ObjType[1].cRGB := GetRGB(0, 1, 0); // Farbe
 ObjType[1].VMAtrix[0,0] := 1; // Aussehen
 ObjType[1].VMAtrix[0,1] := 1;
 ObjType[1].VMAtrix[0,2] := 1;
 ObjType[1].VMAtrix[0,3] := 1; // Einfach ein Balken der Länge 4
 // -- Type 2 -- //
 ObjType[2].cRGB := GetRGB(1, 1, 0);
 ObjType[1].VMAtrix[0,0] := 1; // Aussehen
 ObjType[1].VMAtrix[0,1] := 1;
 ObjType[1].VMAtrix[0,2] := 1;
 ObjType[1].VMAtrix[1,2] := 1; // Das typische Tetris L

 For i := 1 to 4 do // Block aussehen angeben
  FormBlocks
  [Round(FallingObject.pX/BlockSizeX)]
  [Round(FallingObject.pY/BlockSizeY)]
  := ObjType[FallingObject.aType].;
Auch könntest du in FallingObject die Koordinaten direkt als Blockanzahl abspeichern, so dass du bei deinen Berechnungen nicht immer
Delphi-Quellcode:
Round(FallingObject.pX/BlockSizeX)
sondern nur noch
Delphi-Quellcode:
[FallingObject.px]
hast.

Mfg

Destroxi 3. Nov 2011 12:03

AW: Tetris erstellen - wie ?
 
Danke aber wie übergebe ich die VMatrix an OpenGL?
Voher habe ich die X/Y-Positionen ja plus gerechnet muss ich hier überall "If" Abfragen machen?
Also wo und wie gebe ich an wie er das Teil zeichnen soll?
Und muss ich nicht
Delphi-Quellcode:
ObjType[1].VMAtrix[0,0] := Bool(1);
machen?
PS: Bin für ne Stunde weg, gucke danach wd hier rein [13:20]

Mfg, Destroxi

Edlmann 3. Nov 2011 12:21

AW: Tetris erstellen - wie ?
 
Du musst VMatrix gar nicht an OpenGL Übergeben ;) VMatrix dient lediglich der Spiellogik, um Festzustellen wie er welchen Typ von Stein zu interpetieren hat. OpenGL muss ja nur dein Spielfeld
Delphi-Quellcode:
FormBlocks: Array[0..Round(SizeX/BlockSizeX)] of Array [0..Round(SizeY/BlockSizeY)] of Integer;
Rendern - sonst macht OpenGL nichts. Der Rest ist wirklich nur durch Standard-Delphi zu implementieren. VMatrix dient wirklich nur, um zu wissen wenn du einen Stein in dein array übeträgst, wie dieser Stein aussehen soll. Die Komplette Spiellogik hat nichts mit OpenGL zu tun und sollte auf jeden Fall davon abgekapselt bleiben!

DeddyH 3. Nov 2011 12:33

AW: Tetris erstellen - wie ?
 
Wie ich schon sagte: erst die Logik, dann erst die Darstellung.

Destroxi 3. Nov 2011 13:14

AW: Tetris erstellen - wie ?
 
Sollen die For-Schleifen dann etwa so aussehen (um das Aussehen direkt zu übergeben):
Delphi-Quellcode:
For i1 := 0 to 3 do                                                      // Block aussehen angeben
  For i2 := 0 to 3 do
   If ObjType[FallingObject.aType].VMatrix[i1][i2] then
    FormBlocks
    [Round(FallingObject.pX+i1)]
    [Round(FallingObject.pY+i2)]
    := 1;
€dit: Ich habs jeze so aber es klappt nur bei der Linie:
Delphi-Quellcode:
// Block-Daten einstellen
 // -- Type 1 -- //
 ObjType[1].cRGB := GetRGB(0, 1, 0); // Farbe
 ObjType[1].ALengthX := 4;
 ObjType[1].VMAtrix[0,0] := Bool(1); // Aussehen
 ObjType[1].VMAtrix[1,0] := Bool(1);
 ObjType[1].VMAtrix[2,0] := Bool(1);
 ObjType[1].VMAtrix[3,0] := Bool(1); // Einfach ein Balken der Länge 4
 // -- Type 2 -- //
 ObjType[2].cRGB := GetRGB(1, 1, 0); // Farbe
 ObjType[2].ALengthX := 3;
 ObjType[2].VMAtrix[0,0] := Bool(1); // Aussehen
 ObjType[2].VMAtrix[1,0] := Bool(1);
 ObjType[2].VMAtrix[2,0] := Bool(1);
 ObjType[2].VMAtrix[2,1] := Bool(1); // Das typische Tetris L

 // Block erstellen
 FallingObject.aType := 2;
 FallingObject.pX := (SizeX/2-BlockSizeX*ObjType[FallingObject.aType].ALengthX/2)/BlockSizeX;
 FallingObject.pY := (SizeY-50)/BlockSizeY;
 For i1 := 0 to 3 do                                                      // Block aussehen angeben
  For i2 := 0 to 3 do
   If ObjType[FallingObject.aType].VMatrix[i1][i2] then
    FormBlocks
    [Round(FallingObject.pX+i1)]
    [Round(FallingObject.pY+i2)]
    := 1;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 // Viewport und Größe der map einstellen
 SetSizeOptions;
end;

end.
Mfg, Destroxi

Edlmann 3. Nov 2011 17:29

AW: Tetris erstellen - wie ?
 
Warum das nicht funktioniert kann ich dir auf Anhieb auch nicht sagen. Aber wofür benutzt du ALengthX noch? Ist doch jetzt (da die Matrix fest ist) überflüssig.

Sir Rufo 3. Nov 2011 19:56

AW: Tetris erstellen - wie ?
 
Auch wenn DeddyH das schon mehrfach hier erwähnt hat (und es anscheinend völlig unbeachtet im Hintergrundrauschen untergeht):

Mach dir zunächst keine Gedanken darüber wie du das zeichnest, sondern darüber was wann wo gezeichnet werden müsste!

Da eine Visualisierung bei der Entwicklung des Codes allerdings hilfreich ist solltest du dir ein ganz einfaches Ausgabe-Modul bauen.
Und da reicht eine Ausgabe als Text vollkommen aus.
Code:
: : : : : : : : : : :
: : : :X:X: : : : : :
: : : :X:X: : : : : :
: : : : : : : : : : :
: : : : : : : : : : :
: : : : : : : : : : :
: : : : : : : : : : :
:X: : : : : : : : : :
:X: : : : : : : : : :
:X:X: : : : : : : : :
:X:X:X:X: : : : : : :
Du solltest dir dabei eine entsprechende Funktion überlegen, der du quasi die Spielfelddaten übergibst und die Funktion daraus das Spielfeld zeichnet.
Nachher kannst du diese Funktion dann mit der OpenGL-Version ersetzen (oder auch immer nach Belieben austauschen)

Destroxi 4. Nov 2011 11:58

AW: Tetris erstellen - wie ?
 
Zitat:

Aber wofür benutzt du ALengthX noch?
Damit ich ohne viele Abfragen die Mitte der X-Achse bestimmen kann.
Zitat:

... sondern darüber was wann wo gezeichnet werden müsste!
... solltest du dir ein ganz einfaches Ausgabe-Modul bauen.
Werd ich machen ;)
:: Hab ich gemacht, rausgekommen sind 2 Fehler:
- FormBlocks Y-Wert muss "BlockY-i2" gerechnet werden
- Fehler im FormBlocks format, da im Textdokument steht
Code:
x
x
xx
aber auf der Form ein Platz zuviel zischen dem untersten Block und dem abzweigendem Block (1 weiter rechts); habe aber noch keine Lösung

Jetziger Code:
Delphi-Quellcode:
For i1 := 0 to 3 do s[i1] := '';
 For i1 := 0 to 3 do                                                      // Block aussehen angeben
  For i2 := 0 to 3 do
   If ObjType[FallingObject.aType].VMatrix[i1][i2] then
   begin
    s[i2] := s[i2] + 'x';
    FormBlocks
    [Round(FallingObject.pX+i1)]
    [Round(FallingObject.pY-i2)]
    := 1;
   end;
 For i1 := 0 to 3 do sl.Add(s[i1]);
 sl.SaveToFile('C:\VMatrix2.txt');
 sl.Free;
:: Fehler liegt in der Größer der Blöcke; bei Größer 30x30 passt alles; Ich gucke mal was da falsch ist...
:: Fehler gefunden: Es muss einzeln gerundet werden, also:
Delphi-Quellcode:
FormBlocks
    [Round(FallingObject.pX)+Round(i1)]
    [Round(FallingObject.pY)-Round(i2)]
    := 1;
Vielen Dank, an alle die mir bis jetzt mit der Vorgehensweise geholfen haben :)
Werde jetzt mich ans bewegen der Objekte machen...
:: So... Jez hab ich kleines bisschen gemacht, funzt auch, nur dass der Block anhält wenn da schon einer is funzt net...
:: Der 1. Code war mist xD ^^ hier ist mein neuer Code (Timer):
Delphi-Quellcode:
// Bewegung
procedure TForm1.tiBewegungTimer(Sender: TObject);
procedure NewBlock;
var
 i1, i2: Integer;
begin
 FallingObject.aType := 2;
 FallingObject.pX := (SizeX/2-BlockSizeX*ObjType[FallingObject.aType].ALengthX/2)/BlockSizeX;
 FallingObject.pY := (SizeY-50)/BlockSizeY;
 For i1 := 0 to 3 do // Block aussehen angeben
  For i2 := 0 to 3 do
   If ObjType[FallingObject.aType].VMatrix[i1][i2] then
    FormBlocks
    [Round(FallingObject.pX)+i1]
    [Round(FallingObject.pY)-i2]
    := 1;
end;
const
 Verkleinerung = 1;
begin
 If FallingObject.pY <= ObjType[FallingObject.aType].ALengthY then
 begin
  FallingObject.pY := ObjType[FallingObject.aType].ALengthY;
  SetFormBlockColors;
  NewBlock;
 end
 {else if FormBlocks[Round(FallingObject.pX)]
                    [Round(FallingObject.pY -Verkleinerung)]
                    <> 0 then
       begin
        SetFormBlockColors;
        NewBlock;
       end} // FUNZT NIT!!!
 else
 begin
  FallingObject.pY := FallingObject.pY - Verkleinerung;
  SetFormBlockColors;
 end;
end;
Bloß wie kriege ich's hin, dass das funzt, wo steht "FUNZT NIT!!!"?
Also, mit welchem "Gedanken"? ^^

Mfg, Destroxi

Destroxi 4. Nov 2011 21:21

AW: Tetris erstellen - wie ?
 
Hat nirgendwer nen Tipp oder guckt keiner rein? :|

Sir Rufo 4. Nov 2011 21:25

AW: Tetris erstellen - wie ?
 
Zitat:

Zitat von Destroxi (Beitrag 1134539)
Hat nirgendwer nen Tipp oder guckt keiner rein? :|

Wir schlagen gerade im Duden deine Wörter nach ("funzt") um zu verstehen was du meinst :stupid:

BTW Wieso bist du die ganze Zeit am Runden? Das ist IMHO völliger Unsinn


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

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