Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
moin
ich hab das problem, dass bei mir glgentextures und auch glgenlists einen EAccess Error auslöst. ich hab mir zuerst gedacht es liege an mir, aber dann hab ich mal die partikel engine von hier kompiliert und siehe da, der gleiche fehler. die funktion ist doch ganz wichtig, und es wäre super wenn ihr mir lösungsvorschläge geben könntet.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jo die Fragen stell ich mir auch gerade. Da die Funktionen eigentlich recht trivial sind, sollten die von jedem GL Header zur verfügung gestellt werden, außer man bindet die Funktionen selber, und vergisst selbige.
Also bitte mehr Infos.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
jep, war wohl n bissl zu kurz
also ich benutze dglopengl.pas, delphi 7, die partikelengine ist diejenige der tutorials, ich hab allerdings auch probiert, das ganze irgendwie sonst zu benutzen, ohne sdl ging es teilweise, aber eben auch nur teilweise und mit sdl meldet der immer EAccessViolation (read 00000) ich weiss nicht woran es liegt, früher ging das jeweils, evtl liegt es auch an mir bzw meinem pc.
das ganze kommt immer hier in der zweiten zeile vor:
procedure STUB_glGenTextures(n: TGLsizei; textures: PGLuint); {$IFNDEF CLR}{$IFDEF Win32} stdcall; {$ELSE} cdecl; {$ENDIF}{$ENDIF}
begin
_glGenTextures := TglGenTextures(glProcedure('glGenTextures'{$IFDEF CLR}, typeof(TglGenTextures){$ENDIF}));
_glGenTextures(n, textures);
end;
2. Problem:
bei TgluQuadricDrawStyle(Quadobject, GL_LINES); gibt mir der compiler immer
[Error] Mainunit.pas(172): ')' expected but ',' found
aus. das schlimme daran, wenn ich das ganze auskommentiere, hat er überhaupt kein problem
das ganze sieht so aus:
procedure Tgame.draw_opengl;
var
i,j: integer;
Quadobject: PGLUquadric;
begin
Quadobject := gluNewQuadric;
TgluQuadricDrawStyle(Quadobject, GL_LINES);
[..]
end;
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Gaukler hat geschrieben:
das ganze kommt immer hier in der zweiten zeile vor: procedure STUB_glGenTextures(n: TGLsizei; textures: PGLuint); {$IFNDEF CLR}{$IFDEF Win32} stdcall; {$ELSE} cdecl; {$ENDIF}{$ENDIF} ...
Hänge mal deinen ganzen Code an. Ich vermute, dass dein Template defekt ist und du OpenGL vor dem SDL-Fenster initialisierst.
Gaukler hat geschrieben:
2. Problem: bei TgluQuadricDrawStyle(Quadobject, GL_LINES); gibt mir der compiler immer
Die Funktion heisst auch gluQuadricDrawStyle ohne T.
Das T dient zu zeigen, dass es ein Object, Record, Klasse ist, was es hier aber nicht ist.
Wenn du das änders sollte der Code problemlos laufen.
Übrigens kannst du bei sowas ins Wiki schauen. Dort existiert eine GL(U)-Funktionsübersicht aus der du die korrekte Bezeichnung entnehmen kannst und auch die restlichen Infos die man benötigt.
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
jo stimmt das wirds wohl sein, ich weiss das mitm t eigentlich scho, habs nur irgendwie übersehen...
beim 2ten werd ich dann mal mein template posten, also das sdl template, kann sein, dass ich da eine änderung gemacht hab, die ich nicht hätte machen sollen. dummerweise bin ich grad in der schule und komm nich an die source ran....
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das T gibt normal an, dass es sich um einen Typen handelt. Das sind zu 98% Klassen, Records etc. In diesem Falle ist es aber eine Procedur. Und zwar kann man dann eine Methode genau so behandeln wie eine Variable. Sie zuweisen und ausführen kann man sie natürlich immer noch. In dem Falle hat i0n0s aber recht. Benutzt die Variante ohne T dann wird alles gut.
Zu der AccessVialotion. Die ist an Adresse 0000. Das bedeutet, dass jemand versucht auf etwas zu zugreifen was aber nil ist. All die Funktionen sind zu Begin nil, da sie erst geladen werden müssen. Diese STUB methode macht nichts anderes als sie zu laden, sich selbst aus dem Methodenaufruf rauszuschmeißen und die Methode dann aufzurufen. Und da denke ich mal, dass die Methode nicht geladen werden konnte.
Stellt sich jetzt die Frage warum ist das so. Das kann meherere Gründe haben. Du musst als erstes in deinem Programm InitOpenGL aufrufen oder aber die Methode CreateRenderingContext. Die ruft das InitOpenGL selbsttätig auf. Und du musst einen Context erstellt haben. Entweder manuell oder eben wieder per CreateRenderingContext. Erst dann darfst du glGenTextures oder sonst etwas aufrufen, da erst jetzt OpenGL richtig initialisiert wurde.
Es bietet sich an, so lange du nicht unter .NET arbeitest, dass du nach dem Erstellen ActivateRenderContext aufrufst. Dabei werden alle Methodenpointer geladen und der Kontex aktiviert. Das mit den Stubs funktioniert zwar meistens aber einige Konstelationen mögen das nicht. Zum Beispiel wenn ein Stub zwischen glBegin und glEnd aufgerufen wird.
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
hmm glbegin und glend hab ich eigentlich nicht benutzt, ich hab da wirklich keine ahnung, bins scho vielmal durchgegangen...
zuerst der mainunit code, ist nicht ganz vollständig, sollte aber nich so wichtig sein. ausserdem hab ich hier auch die 2 units der partikelengine nicht drin, das ganze sollte aber in ordnung sein, stehen ja auch in der wiki
Code:
procedure TForm1.FormCreate(Sender:TObject);
begin
SDL_Unit:=TSDL_Unit.create;
Effect:=TexampleFX.Create;
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
// Eintritt in Main-Loop
while( Done <> -1)do
begin
SDL_Unit.glHandleEvents;
Draw_OpenGL;
Inc(FPSCount);
end;
SDL_Unit.Quit_App;
end;
procedure Tform1.Draw_OpenGL;
begin
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Effect.Advance(25);
//Render-Particles
glLoadIdentity;
glTranslatef(0,-1,-3);
Effect.Render;
SDL_GL_SwapBuffers;
end;
end.
hier der code der sdl_unit:
Code:
unit Unit_SDL;
interface
uses
windows,sdl, easysdl, dglOpenGL, sysutils;
type
TSDL_UNIT =class
procedure Init_SDL;
function glResizeWindow( width :integer; height :integer):Boolean;
procedure glHandleEvents;
procedure Quit_App;
function glTimer( interval : UInt32; param :Pointer): UInt32;
procedure Init;
private
{ Private declarations }
public
{ Public declarations }
end;
const
INVALID_MODULEHANDLE =0;
var
Windows_Caption:shortstring='The Butision';
Screen_width:integer=800;
Screen_height:integer=600;
Screen_bpp:integer=8;
FPSCount:LongInt;
Done:integer=0;
videoFlags:integer;
surface: PSDL_Surface;
h_DC: HDC;// Device Context
h_RC: HGLRC;// OpenGL Rendering Context
h_Wnd: HWND;// Handle aufs Fenster
GLHandle: HINST;
GLUHandle: HINST;
implementation
uses Unit1;
procedure TSDL_Unit.Init;
begin
// Initalisierung
Init_SDL;
InitOpenGL;
//gibt schönere Animationen IN SDL UNIT VERSCHIEBEN SPÄTER -> nicht nötig hier
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
grrr vielen dank, das hab ich bei diesem code vergessen, das war aber eigentlich nicht so wichtig, da dieser code nur beweisen sollte, das irgendwas nicht stimmt.
ich hab nun herausgefunden was ich falsch gemacht hab, hab glgentextures vor sdlunit.init laufen lassen, was dann auch zu dem fehler geführt hat. ich versuche grundsätzlich immer zuerst lange nachzudenken und dann zu posten, aber bin einfach nich weitergekommen...
auf jeden fall steht jetzt das sdl.init ziemlich weit vorne im code, also so was sollte nicht nochmal passieren
naja hab ich wieder mal was gelernt
vielen dank für die schnellen antworten!
@ionisos:
leider kenne ich mich mit sdl recht wenig aus, bzw kenne ich die anderen compiler nicht, also ich weiss nicht was ich nun verwenden darf von delphi und was nicht, ich vermute mal integer darf man zb normal addieren oder? ich weiss also nicht was vcl alles beinhaltet. könntest du mir sagen was bei diesem code:
Code:
//einzelne Units kreieren
game:= Tgame.Create;
SDL_Unit:= TSDL_Unit.Create;
SDL_Unit.Init;//SDL & OpenGL starten
Cam:= TCam.Create;
Movement:= TMovement.create;
gameVariabeln:= TgameVariabeln.Create;
EventHandler:= TEventHandler.Create;
tools:= TTools.Create;
//eher unwichtige einstellungen um aus den Variabeln keine bugs zu erhalten
game.maxchars:=2;
setlength(game.chars, game.maxchars);
gameVariabeln.setdefault;
Movement.OldTimer:=false;
//tools.make_arial_15; //schrift arial mit grösse 15 erstellen für opengl
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Stop, Nein.
VCL ist einfach eine Unit von Delphi, sie ist für die graphische Oberfläche der Delphianwendungen da.
Einfach aufgrund der Bezeichnung: TForm1 habe ich vermutet, dass du VCL noch verwendest.
Wenn du VCL noch verwendest, steht halt in der dpr-Datei das:
Code:
begin
Application.Initialize;
Application.CreateForm(TGLForm, GLForm);
Application.Run;
end.
Was unnötig ist, weil SDL sich schon um das Fenster kümmert.
Ansonsten kannst du bei SDL exact dieselben Befehle wie bei VCL verwenden.
Weil die aus der Sprache Delphi sind, und dann ist es egal was für Units du einbindest, egal ob SDL oder VCL.
Noch ein kleiner Tipp am Rande:
Schreib {$Apptype Console} in die dpr-Datei rein, dann bekommst du zusätzlich noch ein Konsolenfenster wo du mit writeln Infos ausgeben kannst.
Ist für Fehlersuche recht praktisch.
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
achso, das stimmt, fand ich eigentlich auch nicht wirklich sinnvoll, aber ich habs vorläufig so gelassen weils nicht wichtig ist, ich kann grundsätzlich das ganze sehr einfach in eine dpr rüberkopieren, muss dann einfach noch die procedure game.start ein bisschen abändern. habe ja auch erst angefangen zu proggen, da wird sich noch einiges ändern .
das mit der konsole ist cool, aber was kann sie, muss man die wiederum programmieren? weil schreiben kann ich irgendwie nicht drin....
und wenn mans irgendwie schaft zu schreiben, kann man dann einfach solche sachen wie variabeln ausgeben?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Gaukler hat geschrieben:
das mit der konsole ist cool, aber was kann sie, muss man die wiederum programmieren? weil schreiben kann ich irgendwie nicht drin.... und wenn mans irgendwie schaft zu schreiben, kann man dann einfach solche sachen wie variabeln ausgeben?
Code:
Writeln('Visit wiki.delphigl.com');//Gibt den String aus und geht in die nächste Zeile
Write('Froggs per minute: ');//Gibt den String aus, springt aber nicht in die nächste Zeile
Writeln(FPS);//Gibt die FPS aus. FPS kann eine Variable vom Typ Integer oder Single sein, wird automatisch konvertiert
Readln(variable);//Liesst die Eingabe eines Users aus und speichert sie in Variable
Daneben gehen noch weitere Tricks mit writeln man aber nicht unbedingt kennen muss. Ich kenne sie auch nicht
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
ja, die writeln readln funktionen kenne ich eigentlich sehr gut - zu gut ich kann irgendwie eben nichts in die anderen formen schreiben, also auch nicht in die konsole, während ich sdl am laufen habe. lustigerweise geht es bei der normalen form, mit der maus etwas zu machen, also zb rechtsklick "kopieren" dann in ein anderes edit feld und "einfügen" aber komischerweise kann ich nicht einfach hineinschreiben. es löst aber auch nicht ein keyevent aus in sdl, wenn ich in die anderen formen schreibe, es passiert einfach gar nichts.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.