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

Aktuelle Zeit: Mi Jul 16, 2025 16:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 16, 2006 15:47 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 15:32
Beiträge: 2
Hallo, ich habe erst neu mit OpenGL angefangen und habe mich an ein Schachspiel gewagt und bin soweit auch schon recht weit.
Nur bekomme ich folgenden Fehler:

Erste Zufalls-Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00496AF5 in Modul 'Project1.exe'. Lesen von Adresse 00000019'. Prozess Project1.exe (3088)

Ich habe bisher schon herausgefunden das es was mit dem Rendern der Models auf sich hat.
Mein Array in dem ich die Position der Figuren schreibe sieht wie folgt aus

Code:
  1.  
  2. var
  3.   FigureMap: array[1..8] of array[1..8] of integer;
  4.   Model: array[10..26] of TStaticModelGL;
  5.  


Den PositionArray fülle ich zB. so

Code:
  1.  
  2.  { ..... }
  3.   FigureMap[2][1]:= 11;
  4.   FigureMap[2][2]:= 11;
  5.   FigureMap[2][3]:= 11;
  6.   FigureMap[2][4]:= 11;
  7.   FigureMap[2][5]:= 11;
  8.   FigureMap[2][6]:= 11;
  9.   FigureMap[2][7]:= 11;
  10.   FigureMap[2][8]:= 11;
  11.  { .... }
  12.  


Bedeutet soviel das die ganze 2. REiche mit schwarzen Bauern 'gesetzt' wird. Die Models (ms3d) lade ich so

Code:
  1.  
  2. Model[11]:= ms3dLoadStaticModel('Models/BPawn.ms3d');
  3.  


Die Szene zeichne ich nun so

Code:
  1.  
  2. for a:=1 to 8 do
  3.     begin
  4.       for i:=1 to 8 do
  5.         begin
  6.           glLoadName(((8*(a-1))+i));
  7.           // Figuren zeichnen
  8.           glPushMatrix;
  9.             if FigureMap[a][i]>20 then
  10.               glColor3f(1, 1, 1)
  11.             else
  12.               glColor3f(0.1, 0.1, 0.1);
  13.             glTranslatef(-5+i+0.5,-5,-8-a-0.5);
  14.             glScalef(0.03,0.03,0.03);
  15.  
  16.             if assigned(Model[FigureMap[a][i]]) then
  17.               Model[FigureMap[a][i]].Render;
  18.  
  19.           glPopMatrix;
  20.  
  21.           // Spielbrett zeichnen
  22.           glPushMatrix;
  23.             glTranslatef(-5, -5, -8);
  24.             glEnable(GL_TEXTURE_2D);
  25.  
  26.             if ((i+a-1) mod 2) = 0 then
  27.               fTexture[2].Bind
  28.             else
  29.               fTexture[1].Bind;
  30.  
  31.  
  32.             glBegin(GL_QUADS);
  33.               if (FieldSelect[1]=a) AND (FieldSelect[2]=i) then
  34.                  glColor3f(1, 0, 0)
  35.               else
  36.                  glColor3f(1, 1, 1);
  37.  
  38.               glTexCoord2f(1,0); glVertex3f( i, 0, -1*a);
  39.               glTexCoord2f(1,1); glVertex3f( i+1, 0, -1*a);
  40.               glTexCoord2f(0,1); glVertex3f( i+1, 0, -1*a-1);
  41.               glTexCoord2f(0,0); glVertex3f( i, 0, -1*a-1);
  42.  
  43.               glTexCoord2f(1,0); glVertex3f( i, 0, -1*a);
  44.               glTexCoord2f(1,1); glVertex3f( i, -0.1, -1*a);
  45.               glTexCoord2f(0,1); glVertex3f( i+1, -0.1, -1*a);
  46.               glTexCoord2f(0,0); glVertex3f( i+1, 0, -1*a);
  47.  
  48.             glEnd();
  49.           glPopMatrix;
  50.  
  51.         end;
  52.     end;
  53.  


Er zeichnet alle Figuren nur an der Stelle [7][7] gibt es das Problem oben, also wenn ich diese nicht definiere funktioniert es, nur halt mit der einen bestimmten Stelle nicht.

Kann mir jemand helfen? Ich hoffe es ist nur ein kleines Problem was schnell gelöst werden kann.

Bye Danny


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 16, 2006 16:01 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ganz bescheuerte Frage... Du hast aus deinen Klassen mit Create schon Objekte gemacht, bevor Du die Modelle lädst?

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 16, 2006 16:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
EAccessViolations sind Fehler die auftreten, wenn du versucht auf etwas zuzugreifen was nicht existiert. Da es sonst funktioniert denke ich mal, dass du überall den Selben OpenGL Header verwendest. Hast du mal im Debugger versucht näher an das Problem herran zu kommen? Versuch doch mal das Model was an Stelle 7, 7 stand an eine andere Stelle zu setzen. So kann ich im Code jetzt keinen Fehler erkennen. Zu mindest nicht so spontan.

Was evtl ein bisschen kritisch ist ist die Stelle mit
Code:
  1. if assigned(Model[FigureMap[a][i]]) then

Du solltest überprüfen ob in FigureMap ein gültiger Wert enthalten ist und nicht ob das Objekt dahinter gültig ist. Du kannst nämlich durchaus das Glück haben, dass du über die Arraygrenzen hinaus willst aber immer noch in dem Speicher bist den Delphi verwaltet. Was dazu führt, dass Assigned True zurück liefert du aber in Wirklichkeit gar kein gültiges Objekt hast. Das könnte dann unter anderem genau zu solch einem Fehler führen. Du solltest mal im Debugger schauen ob der Wert in dem Array richtig ist. Außerdem würde ich auch überprüfen ob die Modelle alle ordnunggemäß geladen wurden. Und ob alle Felder gefüllt wurde. Normal sollte in dem Array von Begin alles auf nil stehen. Wenn nicht solltest du das auf jeden Fall machen.

Noch etwas anderes. Es wäre besser, wenn du dein Zeichnen anders gestalten würdest. Also zu erst alle hellen Felder und dann alle dunklen Felder des Schachbrettest. So müsstest du nicht ständig die Textur wechseln. Und wenn du das hast dann würde ich die Figuren zeichnen. Das dürfte sich speziell auf nicht ganz so betugten Grafikkarten halbwegs ordentlich bemerkbar machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 16, 2006 17:11 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 15:32
Beiträge: 2
Lossy eX hat geschrieben:
Was evtl ein bisschen kritisch ist ist die Stelle mit
Code:
  1. if assigned(Model[FigureMap[a][i]]) then

Du solltest überprüfen ob in FigureMap ein gültiger Wert enthalten ist und nicht ob das Objekt dahinter gültig ist. Du kannst nämlich durchaus das Glück haben, dass du über die Arraygrenzen hinaus willst aber immer noch in dem Speicher bist den Delphi verwaltet. Was dazu führt, dass Assigned True zurück liefert du aber in Wirklichkeit gar kein gültiges Objekt hast. Das könnte dann unter anderem genau zu solch einem Fehler führen.


Ich danke euch, wenn ich die Abfrage wie oben beschrieben abändere funktioniert es :) . Hatte das mit dem assigned hier im Forum gefunden, deshalb hatte ich angenommen, dass es ohne weiteres funktionniert.

Lossy eX hat geschrieben:
Noch etwas anderes. Es wäre besser, wenn du dein Zeichnen anders gestalten würdest. Also zu erst alle hellen Felder und dann alle dunklen Felder des Schachbrettest. So müsstest du nicht ständig die Textur wechseln. Und wenn du das hast dann würde ich die Figuren zeichnen. Das dürfte sich speziell auf nicht ganz so betugten Grafikkarten halbwegs ordentlich bemerkbar machen.


Werde ich bei Gelegenheit aufgreifen das Problem.



----

Ich danke euch nochmal allen ( man bin ich dumm :( )
Danny


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 17, 2006 08:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Danny hat geschrieben:
Ich danke euch, wenn ich die Abfrage wie oben beschrieben abändere funktioniert es :) . Hatte das mit dem assigned hier im Forum gefunden, deshalb hatte ich angenommen, dass es ohne weiteres funktionniert.

Leider nicht. Das ist ein Trugschluss der Unglücklicherweise zu erst jedem so in den Sinn kommt. Das habe ich auch schon schmerzhaft erfahren dürfen, dass dem nicht so ist. Assigned solltest du nur dort verwenden wo du auf Nil oder <> Nil abprüfst. Und dann aber kleinlich darauf achten, dass alle Pointer Variablen (Pointer, Klassen etc) auf Nil (alles andere auf 0) initialisiert werden. Damit fahre ich seither recht gut. Klappt aber leider auch nicht immer. ;-)

Danny hat geschrieben:
man bin ich dumm :(

Also so würde ich das jetzt aber nicht sehen. Es gibt einfach Dinge die muss man entweder selber herraus finden oder sich erklären lassen. Das ist wie Autofahren. Das muss man erst einmal erlernen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]