Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 07, 2025 22:04

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 3D Map aus 2D Textmap
BeitragVerfasst: So Mai 06, 2007 20:10 
Offline
DGL Member

Registriert: So Mai 06, 2007 16:20
Beiträge: 2
Wohnort: Hamburg
Hi, ich bin absoluter neuling in OpenGL, aber habe schon so einiges mit DelphiX gemacht. Leider schon viel zu lange nicht mehr und daher hänge ich derzeit an 2 Problemen:

Problem 1:

Ich habe eine Textdatei in welcher sich eine 2-Dimensionale Karte verbirgt:

1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 0 0 1 1 1 1
1 1 0 0 0 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

1 = Wand
0 = Leer (Ein Boden wird dargestellt)...

für Wände und Böden habe ich mir prozeduren geschrieben um diese variabel zu erstellen. nur irgendwie sieht die generierte Karte alles andere also nach dem aus, wie es aussehen soll.

Code:
  1.  
  2. procedure TForm2.Ground(var x, z: integer);
  3. begin
  4.  glBindTexture(GL_TEXTURE_2D, TexID2);
  5.  glEnable(GL_TEXTURE_2D);
  6.  glBegin(GL_QUADS);
  7.    glTexCoord2f(0,0); glVertex3d((x*2)+0,0,(z*2)+0);
  8.    glTexCoord2f(0,1); glVertex3d((x*2)+0,0,(z*2)+2);
  9.    glTexCoord2f(1,1); glVertex3d((x*2)+2,0,(z*2)+2);
  10.    glTexCoord2f(1,0); glVertex3d((x*2)+2,0,(z*2)+0);
  11.  glEnd();
  12. end;
  13.  
  14. procedure TForm2.Mauer(var x, z, links, rechts, vorn, hinten:integer);
  15. begin
  16.  if (vorn = 0) then
  17.  begin
  18.  glBindTexture(GL_TEXTURE_2D, TexID);
  19.  glEnable(GL_TEXTURE_2D);
  20.  glBegin(GL_QUADS);
  21.    glTexCoord2f(0,0); glVertex3d((x*2)+0,0,(z*2)+2);
  22.    glTexCoord2f(0,1); glVertex3d((x*2)+0,2,(z*2)+2);
  23.    glTexCoord2f(1,1); glVertex3d((x*2)+2,2,(z*2)+2);
  24.    glTexCoord2f(1,0); glVertex3d((x*2)+2,0,(z*2)+2);
  25.  glEnd();
  26.  end;
  27.  if (hinten = 0) then
  28.  begin
  29.  glBindTexture(GL_TEXTURE_2D, TexID);
  30.  glEnable(GL_TEXTURE_2D);
  31.  glBegin(GL_QUADS);
  32.    glTexCoord2f(0,0); glVertex3d((x*2)+0,0,(z*2)+0);
  33.    glTexCoord2f(0,1); glVertex3d((x*2)+0,2,(z*2)+0);
  34.    glTexCoord2f(1,1); glVertex3d((x*2)+2,2,(z*2)+0);
  35.    glTexCoord2f(1,0); glVertex3d((x*2)+2,0,(z*2)+0);
  36.  glEnd();
  37.  end;
  38.  if (links = 0) then
  39.  begin
  40.  glBindTexture(GL_TEXTURE_2D, TexID);
  41.  glEnable(GL_TEXTURE_2D);
  42.  glBegin(GL_QUADS);
  43.    glTexCoord2f(0,0); glVertex3d((x*2)+0,0,(z*2)+0);
  44.    glTexCoord2f(0,1); glVertex3d((x*2)+0,2,(z*2)+0);
  45.    glTexCoord2f(1,1); glVertex3d((x*2)+0,2,(z*2)+2);
  46.    glTexCoord2f(1,0); glVertex3d((x*2)+0,0,(z*2)+2);
  47.  glEnd();
  48.  end;
  49.  if (rechts = 0) then
  50.  begin
  51.  glBindTexture(GL_TEXTURE_2D, TexID);
  52.  glEnable(GL_TEXTURE_2D);
  53.  glBegin(GL_QUADS);
  54.    glTexCoord2f(0,0); glVertex3d((x*2)+2,0,(z*2)+0);
  55.    glTexCoord2f(0,1); glVertex3d((x*2)+2,2,(z*2)+0);
  56.    glTexCoord2f(1,1); glVertex3d((x*2)+2,2,(z*2)+2);
  57.    glTexCoord2f(1,0); glVertex3d((x*2)+2,0,(z*2)+2);
  58.  glEnd();
  59.  end;
  60.  
  61. end;
  62.  


um resourcen zu sparen, werden auch nur die Wände dargestellt, die man auch wirklich sehen könnte im Level.

Aufgerufen werden die Prozeduren folgendermaßen:

Code:
  1.  
  2. for i := 0 to sizex-1 do
  3.  begin
  4.    for j := 0 to sizey-1 do
  5.    begin
  6.      glTranslatef(0,0,0);
  7.      if (map[i,j] = 0) then
  8.      begin
  9.        Ground(i,j);
  10.      end;
  11.      if (map[i,j] = 1) then
  12.      begin
  13.       links := 0;
  14.       rechts := 0;
  15.       vorn := 0;
  16.       hinten := 0;
  17.       if (i > 0) then
  18.       begin
  19.         if (map[i-1,j] = 1) then links := 1;
  20.       end else
  21.       begin
  22.         links := 1;
  23.       end;
  24.       if (i < sizex -1) then
  25.       begin
  26.         if (map[i+1,j] = 1) then rechts := 1;
  27.       end else
  28.       begin
  29.         rechts := 1;
  30.       end;
  31.       if (j > 0) then
  32.       begin
  33.         if (map[i,j-1] = 1) then vorn := 1;
  34.       end else
  35.       begin
  36.         vorn := 1;
  37.       end;
  38.       if (j < sizey) then
  39.       begin
  40.         if (map[i,j+1] = 1) then hinten := 1;
  41.       end else
  42.       begin
  43.         hinten := 1;
  44.       end;
  45.       Mauer(i, j, links, rechts, vorn, hinten);
  46.      end;
  47.    end;
  48.  end;
  49.  SwapBuffers(DC);
  50.  


Den Code kann man zwar sicher auch einfacher ausführen, aber für mich reicht es erst einmal.



Problem 2:

beim Beenden des Programms wird seit kurzem ein schwerer Ausnahmefehler ausgeführt, ich finde es einfach nicht heraus, an welcher Zeile es liegen könnte... darum werde ich einfach mal meinen Quellcode als Attachment anhängen, vielleicht hat ja einer Zeit und sieht sich das mal an und kann danach einem neuling erklären, was dieser neuling nicht so richtig auf die Reihe bekommen hat :)

Danke schön


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: e w
BeitragVerfasst: Mo Mai 07, 2007 16:23 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hab mir mal den src angeschaut, also wenn ich das ding so kompiliere wie es ist.
Seh ich nur nen Graues bild O_o

Wenn ich deine ersten Matrix verschiebung (glTranslate) ändere, auf z.b. glTranslate(0,0,-4) dann seh ich ein grünes grassiges rechteck vor mir.

Du hast globale variablen, benannt x,y,z... hast aber auch als Parameter x,z in Mauer und Ground.
Da solltest du zumindest, die parameter in Mauer und Ground ändern, in i, j oder so...

Wozu ist dieses *2 immer ?

For schleifen technisch würde ich dir empfehlen von Y zu X durchzugehen.

For Y := 0 to SizeY-1 do
begin
For X := 0 to SizeX-1 do
begin
end;
end;

Ok, am ende noch bei Destroy... hast du glDeleteTextures vergessen, du solltest schon die 2 Texturen freigeben am ende die du verwendest.
Allerdings löst das nicht das Fehler problem am ende.

Im grunde um das Fehler problem zu fixen, Ausgrenzen bis du den fehler gefunden hast, und wenn du Später nur noch ne Formcreatest ohne was zu machen und der fehler kommt... dann stimmt was an den libs nicht...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 07, 2007 16:29 
Offline
DGL Member

Registriert: So Mai 06, 2007 16:20
Beiträge: 2
Wohnort: Hamburg
Hi, danke für deine Hilfen...

also das graue Bild liegt daran, dass ich noch keinen richtigen Startpunkt gesetzt habe, man fängt ein wenig links und unterhalb der Map an... einfach paar schritte zurück gehen und dann mit PageUp nach oben fliegen :D

das mit den Variablen ist gut, ist mir gar nicht aufgefallen... wohl zu müde gewesen.

*2, da die Mauern und Grounds eine länge und Breite von 2 haben, so muss also der z.B. x-Wert verdoppelt werden, damit das nächste Mauernstück nicht in dem vorherigen platziert wird ;)

Werde mal die Anmerkungen befolgen und schauen ob es was bewirkt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 17 Queries | GZIP : On ]