![]() |
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:
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)
ObjType: Array[1..7] of Record
VMatrix: Array[0..3, 0..3] of Boolean; cRGB: TcRGB; end; Zum Zweiten: Du gehst im Moment nur jeden Wert durch und setzt ihn auf 1, korrekt wäre:
Delphi-Quellcode:
Auch könntest du in FallingObject die Koordinaten direkt als Blockanzahl abspeichern, so dass du bei deinen Berechnungen nicht immer // 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].;
Delphi-Quellcode:
sondern nur noch
Round(FallingObject.pX/BlockSizeX)
Delphi-Quellcode:
hast.
[FallingObject.px]
Mfg |
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:
machen?
ObjType[1].VMAtrix[0,0] := Bool(1);
PS: Bin für ne Stunde weg, gucke danach wd hier rein [13:20] Mfg, Destroxi |
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:
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!
FormBlocks: Array[0..Round(SizeX/BlockSizeX)] of Array [0..Round(SizeY/BlockSizeY)] of Integer;
|
AW: Tetris erstellen - wie ?
Wie ich schon sagte: erst die Logik, dann erst die Darstellung.
|
AW: Tetris erstellen - wie ?
Sollen die For-Schleifen dann etwa so aussehen (um das Aussehen direkt zu übergeben):
Delphi-Quellcode:
€dit: Ich habs jeze so aber es klappt nur bei der Linie:
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;
Delphi-Quellcode:
Mfg, Destroxi
// 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. |
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.
|
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:
Du solltest dir dabei eine entsprechende Funktion überlegen, der du quasi die Spielfelddaten übergibst und die Funktion daraus das Spielfeld zeichnet.
: : : : : : : : : : :
: : : :X:X: : : : : : : : : :X:X: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :X: : : : : : : : : : :X: : : : : : : : : : :X:X: : : : : : : : : :X:X:X:X: : : : : : : Nachher kannst du diese Funktion dann mit der OpenGL-Version ersetzen (oder auch immer nach Belieben austauschen) |
AW: Tetris erstellen - wie ?
Zitat:
Zitat:
:: Hab ich gemacht, rausgekommen sind 2 Fehler: - FormBlocks Y-Wert muss "BlockY-i2" gerechnet werden - Fehler im FormBlocks format, da im Textdokument steht
Code:
aber auf der Form ein Platz zuviel zischen dem untersten Block und dem abzweigendem Block (1 weiter rechts); habe aber noch keine Lösung
x
x xx Jetziger Code:
Delphi-Quellcode:
:: Fehler liegt in der Größer der Blöcke; bei Größer 30x30 passt alles; Ich gucke mal was da falsch ist...
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 gefunden: Es muss einzeln gerundet werden, also:
Delphi-Quellcode:
Vielen Dank, an alle die mir bis jetzt mit der Vorgehensweise geholfen haben :)
FormBlocks
[Round(FallingObject.pX)+Round(i1)] [Round(FallingObject.pY)-Round(i2)] := 1; 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:
Bloß wie kriege ich's hin, dass das funzt, wo steht "FUNZT NIT!!!"?
// 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; Also, mit welchem "Gedanken"? ^^ Mfg, Destroxi |
AW: Tetris erstellen - wie ?
Hat nirgendwer nen Tipp oder guckt keiner rein? :|
|
AW: Tetris erstellen - wie ?
Zitat:
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. |
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