ich mochte gerne die ode physikengine für meine pb sachen nutzen, dabei gibt es leider noch einige schwirigkeiten, wie folgt:
Code: Alles auswählen
;ode include datei:
;Gebaut von robert Wünsche
;benötigt die ode.dll datei im C/windows verzeichniss mit der version 0.5 oder höher.
;setze den debuger auf an
;DebugLevel 10
Global ode_error ;ist ein debugparameter, ob die funktion zum suchen der dll funktionen weitermachen kann oder nicht
; wenn 0 --> höre beim fehler auf !
; wenn 1 --> suche einfach weiter !
Global ode_errors ;ist die fehleranzahl !
Global ode_direkt ;wenn 1 --> letzter funktionsaufruf war direkt (sehr schnell)
;wenn 0 --> letzter funktionsaufruf war nicht direkt (langsam)
Procedure ODEStart()
time = ElapsedMilliseconds()
Debug "ODEStart() | bei "+Str(time),10
;setze die globalen variablen:
Global dWorldCreate
Global dWorldDestroy
Global dWorldSetGravity
Global dWorldgetgravity
If OpenLibrary(100,"C:\WINDOWS\ode.dll") <> 0
;lade alle pointervariablen:
Debug " Library wurde erfolgreich geöffnet ! | bei "+Str(ElapsedMilliseconds() - time),10
If ExamineLibraryFunctions(100) = 0
Debug " Funktionen konnten nicht abgefragt werden ! | bei "+Str(ElapsedMilliseconds() - time),10
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
Else
;überprüfe die funktionsnammen und füge ihre adressen hinzu:
temp = IsFunction(100, "dWorldCreate")
If temp = 0
Debug " dWorldCreate() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
;eintrag konnte nicht gefunden werden !"
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
Else
;Eintrag erfolgreich gefunden !
Debug " dWorldCreate() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
Debug " bei adresse "+Str(temp), 10
dWorldCreate = temp
EndIf
temp = IsFunction(100, "dWorldDestroy")
If temp = 0
Debug " dWorldDestroy() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
;eintrag konnte nicht gefunden werden !"
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
Else
;Eintrag erfolgreich gefunden !
Debug " dWorldDestroy() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
Debug " bei adresse "+Str(temp), 10
dWorldDestroy = temp
EndIf
temp = IsFunction(100, "dWorldSetGravity")
If temp = 0
Debug " dWorldSetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
;eintrag konnte nicht gefunden werden !"
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
Else
;Eintrag erfolgreich gefunden !
Debug " dWorldSetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
Debug " bei adresse "+Str(temp), 10
dWorldSetGravity = temp
EndIf
temp = IsFunction(100, "dWorldGetGravity")
If temp = 0
Debug " dWorldGetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
;eintrag konnte nicht gefunden werden !"
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
Else
;Eintrag erfolgreich gefunden !
Debug " dWorldGetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
Debug " bei adresse "+Str(temp), 10
dWorldgetgravity = temp
EndIf
;fertig :-)
;jetzt geben wir noch das ergebniss aus:
ProcedureReturn 1
EndIf
Else
time = ElapsedMilliseconds() - time
Debug " library konnte nicht geladen werden ! | bei "+Str(ElapsedMilliseconds() - time),10
If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
EndIf
EndProcedure
;-Und nun die konvertierten befehle:
Procedure dWorldCreate()
If dWorldCreate = 0
;indirekter aufruf !
ergebniss = CallFunction(100, "dWorldCreate")
;setze variable:
ode_direkt = 0
ProcedureReturn ergebniss
EndIf
;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
dWorldID = CallFunctionFast(dWorldCreate)
;setze variable:
ode_direkt = 1
ProcedureReturn dWorldID
EndProcedure
Procedure dWorldDestroy (dWorldID)
If dWorldDestroy = 0
;indirekter aufruf !
CallFunction(100, "dWorldDestroy",dWorldID)
;setze variable:
ode_direkt = 0
EndIf
;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
CallFunctionFast(dWorldDestroy,dWorldID)
;setze variable:
ode_direkt = 1
EndProcedure
Procedure dWorldSetGravity (dWorldID,x.f,y.f,z.f)
If dWorldSetGravity = 0
;indirekter aufruf !
CallFunction(100, "dWorldSetGravity",dWorldID,x.f,y.f,z.f)
;setze variable:
ode_direkt = 0
EndIf
;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
CallFunctionFast(dWorldSetGravity,dWorldID,x.f,y.f,z.f)
;setze variable:
ode_direkt = 1
EndProcedure
Procedure dWorldGetGravity (dWorldID,Gravity)
If dWorldgetgravity = 0
;indirekter aufruf !
CallFunction(100, "dWorldGetGravity",dWorldID,Gravity)
;setze variable:
ode_direkt = 0
EndIf
;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
CallFunctionFast(dWorldgetgravity,dWorldID,Gravity)
;setze variable:
ode_direkt = 1
EndProcedure
;:setze den errorparameter auf 1 (nicht gefundene funktionen werden mit einer 0 versehen !
ode_error = 1
Debug ODEStart()
Debug "fehler : "+ Str(ode_errors)
;test:
world = dWorldCreate()
Debug world
Debug ode_direkt
;dWorldSetGravity(world,0,0,-9.0)
;datenplätze reservieren:
memory = AllocateMemory(48)
If memory = 0
Debug "datenplätze (ram) konnte nicht reserviert werden !"
End
Else
EndIf
;dWorldSetERP(world,0.3)
End
Soweit funktioniert alles aber: wenn ich die richtigen befehle benutze, stürtzt das progi immer ab, warum ?
Im foraus: Danke !
