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
Seite 2 von 3     12 3      
Edlmann

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

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 12: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
 
#12

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 13: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 13:09 Uhr)
  Mit Zitat antworten Zitat
Edlmann

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

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 13: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.624 Beiträge
 
Delphi 12 Athens
 
#14

AW: Tetris erstellen - wie ?

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

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 14: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 14:21 Uhr)
  Mit Zitat antworten Zitat
Edlmann

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

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 18: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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Tetris erstellen - wie ?

  Alt 3. Nov 2011, 20:56
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Destroxi

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

AW: Tetris erstellen - wie ?

  Alt 4. Nov 2011, 12:58
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

Geändert von Destroxi ( 4. Nov 2011 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Destroxi

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

AW: Tetris erstellen - wie ?

  Alt 4. Nov 2011, 22:21
Hat nirgendwer nen Tipp oder guckt keiner rein?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

AW: Tetris erstellen - wie ?

  Alt 4. Nov 2011, 22:25
Hat nirgendwer nen Tipp oder guckt keiner rein?
Wir schlagen gerade im Duden deine Wörter nach ("funzt") um zu verstehen was du meinst

BTW Wieso bist du die ganze Zeit am Runden? Das ist IMHO völliger Unsinn
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:40 Uhr.
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