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:
var
FigureMap:array[1..8]ofarray[1..8]ofinteger;
Model:array[10..26]of TStaticModelGL;
Den PositionArray fülle ich zB. so
Code:
{ ..... }
FigureMap[2][1]:=11;
FigureMap[2][2]:=11;
FigureMap[2][3]:=11;
FigureMap[2][4]:=11;
FigureMap[2][5]:=11;
FigureMap[2][6]:=11;
FigureMap[2][7]:=11;
FigureMap[2][8]:=11;
{ .... }
Bedeutet soviel das die ganze 2. REiche mit schwarzen Bauern 'gesetzt' wird. Die Models (ms3d) lade ich so
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.
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:
ifassigned(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.
Was evtl ein bisschen kritisch ist ist die Stelle mit
Code:
ifassigned(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
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.
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.