AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tetris erstellen - wie ?

Ein Thema von Destroxi · begonnen am 3. Nov 2011 · letzter Beitrag vom 6. Nov 2011
Antwort Antwort
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 11:17
Danke für die vielen hilfreichen Antworten

Könntet ihr vielleicht nochmal hierzu Tipps geben?
Zitat:
Das Problem liegt eher woanders: bei den stehenden Steinen.
Wie lasse ich sie stehen, ohne dass ich sie immer neu zeichnen muss?
Muss ich alle Steine speichern?
€dit: Ich habe jez weiter gemacht und probiert das Aussehen eines Blockes durch ein Array anzugeben... Nur der Block ist immer gleich
Mein Quelltext:
Delphi-Quellcode:
var
  Form1: TForm1;
  FormBlocks: Array[0..Round(SizeX/BlockSizeX)] of Array [0..Round(SizeY/BlockSizeY)] of Integer; // Map Farben
  FormSettings: Record // Sonstige Optionen
    cRGB: TcRGB;
  end;
  FallingObject: Record // Fallendes Objekt
    pX, pY: Single;
    aType: Integer;
  end;
  ObjType: Array[1..7] of Record
    pX, pY: Array[1..4] of Single;
    ALengthX, ALengthY: Integer;
    cRGB: TcRGB;
  end;

implementation

{$R *.dfm}

// Rot, Grün, Blau in TcRGB umwandeln
function GetRGB(cRed, cGreen, cBlue: Single): TcRGB;
begin
 Result.cRed := cRed;
 Result.cGreen := cGreen;
 Result.cBlue := cBlue;
end;

// Block zeichnen
procedure DrawBlock(cRGB: TcRGB; pX, pY: Single);
begin
 glBegin(GL_QUADS);
  glColor3f(cRGB.cRed, cRGB.cGreen, cRGB.cBlue);
  glVertex3f(pX-BlockSizeX/2, pY-BlockSizeY/2, 0);
  glVertex3f(pX+BlockSizeX/2, pY-BlockSizeY/2, 0);
  glVertex3f(pX+BlockSizeX/2, pY+BlockSizeY/2, 0);
  glVertex3f(pX-BlockSizeX/2, pY+BlockSizeY/2, 0);
 glEnd;
end;

// Viewport und Größer der map einstellen
procedure TForm1.SetSizeOptions;
begin
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 glViewPort(Unusable_Margin_X, Unusable_Margin_Y, ClientWidth, ClientHeight);
 glOrtho(0, SizeX, 0, SizeY, -128, 128);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity;
end;

// Rendern
procedure TForm1.Render(Sender: TObject; var Done: Boolean);
var
 i1, i2: Integer;
begin
 SetSizeOptions;

 For i1 := 0 to Round(SizeX/BlockSizeX) do // Hintergrund für Tetris Färben
  For i2 := 0 to Round(SizeY/BlockSizeY) do
   If FormBlocks[i1][i2] = 0 then
    DrawBlock(FormSettings.cRGB, i1*BlockSizeX, i2*BlockSizeY)
   else if FormBlocks[i1][i2] = 1 then
    DrawBlock(ObjType[FallingObject.aType].cRGB, i1*BlockSizeX, i2*BlockSizeY);

 SwapBuffers(DC);

 Done := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 // OpenGL initialisieren
 InitOpenGL;
 DC := GetDC(Handle);
 RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
 ActivateRenderingContext(DC, RC);

 // Alle Blöcke löschen
 FillChar(FormBlocks, SizeOf(FormBlocks), 0);

 // Hintergrundfarbe einstellen
 FormSettings.cRGB := GetRGB(0.3, 0.3, 1);

 // Viewport und Größe der map einstellen
 SetSizeOptions;

 // Dauerhaft Rendern
 Application.OnIdle := Render;

 // Block erstellen
 FallingObject.aType := 1;
 FallingObject.pX := SizeX/2-BlockSizeX*ObjType[FallingObject.aType].ALengthX/2;
 FallingObject.pY := SizeY-20;
 For i := 1 to 4 do // Block aussehen angeben
  FormBlocks
  [Round(FallingObject.pX/BlockSizeX+ObjType[FallingObject.aType].pX[i])]
  [Round(FallingObject.pY/BlockSizeY+ObjType[FallingObject.aType].pY[i])]
  := 1;

 // Block-Daten einstellen
 // -- Type 1 -- //
 ObjType[1].cRGB := GetRGB(0, 1, 0); // Farbe
 ObjType[1].ALengthX := 4; // Länge
 ObjType[1].ALengthY := 1; // Länge
 ObjType[1].pX[1] := 0; // Aussehen
 ObjType[1].pX[2] := 1;
 ObjType[1].pX[3] := 2;
 ObjType[1].pX[4] := 3;
 ObjType[1].pY[1] := 0;
 ObjType[1].pY[2] := 0;
 ObjType[1].pY[3] := 0;
 ObjType[1].pY[4] := 0;
 // -- Type 2 -- //
 ObjType[2].cRGB := GetRGB(1, 1, 0);
 ObjType[2].ALengthX := 3; // Länge
 ObjType[2].ALengthY := 2; // Länge
 ObjType[2].pX[1] := 0;
 ObjType[2].pX[2] := 1;
 ObjType[2].pX[3] := 1;
 ObjType[2].pX[4] := 2;
 ObjType[2].pY[1] := 0;
 ObjType[2].pY[2] := 0;
 ObjType[2].pY[3] := 1;
 ObjType[2].pY[4] := 0;
end;

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

end.
PS: Screen im Anhang (Block quadratisch obwohl er Längs eingestellt ist)

Mfg, Destroxi
Angehängte Grafiken
Dateityp: jpg Tetris_Fehler.jpg (7,2 KB, 22x aufgerufen)

Geändert von Destroxi ( 3. Nov 2011 um 11:31 Uhr)
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#2

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 11:52
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 Round(FallingObject.pX/BlockSizeX) sondern nur noch [FallingObject.px] hast.

Mfg
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 12:03
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 ObjType[1].VMAtrix[0,0] := Bool(1); machen?
PS: Bin für ne Stunde weg, gucke danach wd hier rein [13:20]

Mfg, Destroxi

Geändert von Destroxi ( 3. Nov 2011 um 12:09 Uhr)
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#4

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 12:21
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
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!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.660 Beiträge
 
Delphi 12 Athens
 
#5

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 12:33
Wie ich schon sagte: erst die Logik, dann erst die Darstellung.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 13:14
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

Geändert von Destroxi ( 3. Nov 2011 um 13:21 Uhr)
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#7

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 17:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 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