|
DirectX-Forum - Beitragsübersicht - |
|
Thema | DX8: DirectX lässt sich nicht richtig Beenden |
Von |
enny |
E-Mail |
robotronik123@freenet.de |
Datum |
04. März 2009 um 14:06:43 |
Frage |
Hallo Leute,
ich habe folgendes Problem: Ich lasse mein 3D Proggi im Vollbildmodus laufen. Die Variable run unterbricht die Hauptschleife in der alles notwendige für das 3D abgearbeitet wird.
Die Variable run setze ich nun auf False wenn Direct Input die Escape-Taste erkennt. Danach führe ich ein Unload aller Komponenten durch, Speicherbereinigung etc. und mach noch ein unload des Formulars. Jedoch bleibt bei mir dann das zuletzt gerenderte Bild einfach auf dem Bildschirm stehen, statt zu verschwinden.
Ich muss dazu sagen: Es handelt sich um ein normales VB Programm mit fenstern und so. Und da gibts dann einen Button mit dem man eine "3D-Tour" startetn kann. Diese wird dann im Vollbildmodus angezeigt, und soll halt durch Escape abgebrochen werden können. Und nach dem Abbruch soll der rest des Programmes normal weiter betrieben werden können.
Hier mal ein Auszug aus der Main-Schleife: Do frametime = (Timer * 1000) KAMERA.TurnHor = 0# KAMERA.TurnVer = 0# KAMERA.Move = MOVE_NONE 'prüfen auf Anwender-Eingabe DIModule.CheckInput DIModule.CheckMouse set_bot_position Form1.curr_x_mm / 10, Form1.curr_y_mm / 10, Form1.winkel 'Umsetzung der Bewegung mit der Maus: (x=Hoch/runter; y=links/rechts) With KAMERA 'y-Achse rotieren If .TurnHor <> 0 Then .AngleY = .AngleY + (.TurnHor / 5) .Move = .Move Or MOVE_TURN If .AngleY < 0 Then .AngleY = 360 + .AngleY ElseIf .AngleY > 360 Then .AngleY = .AngleY - 360 End If End If 'x-Achse rotieren If .TurnVer <> 0 Then .AngleX = .AngleX + (.TurnVer / 10) If .AngleX > 90 Then .AngleX = 90 If .AngleX < -70 Then .AngleX = -70 .Move = .Move Or MOVE_TURN End If End With 'hat sich der Spieler überhaupt bewegt ? If KAMERA.Move <> MOVE_NONE Then 'neue Spielerposition berechnen CalculateViewStartPos 'Matrix-Ursprung auf Spielerposition setzen TranslateMatrix myTranslateMatrix, vec3(KAMERA.X * -1, KAMERA.z * -1, KAMERA.Y * -1) 'Matrix Y-Rotation RotateYMatrix myYMatrix, KAMERA.AngleY * PI / 180 'Matrix X-Rotation RotateXMatrix myXMatrix, KAMERA.AngleX * PI / 180 'Matrizen zusammenführen myNewMatrix = RetMatrixMult(myTranslateMatrix, myYMatrix) View3DMatrix = RetMatrixMult(myNewMatrix, myXMatrix) 'Transformation der ViewPortMatrix durchführen gD3DDevice8.SetTransform D3DTS_VIEW, View3DMatrix End If DoEvents '3D Szene rendern Render3D DoEvents frame_cnt = frame_cnt + 1 If frame_cnt > 10 Then framerate = Round(1000 / ((Timer * 1000) - frametime), 1) frame_cnt = 0 End If Loop While running Form2.temperatur_timer.Enabled = False Form2.akkuspannung_timer.Enabled = False 'Windows-Mauszeiger einblenden Call gD3DDevice8.ShowCursor(True) 'Speicher bereinigen TerminateTexture TerminateDInput TerminateDX Unload Form3D End Sub Noch zur Info: Ab und zu funktioniert es so wie ich das gern möchte, dass sich das ganze schließt. Aber leider nur ab und zu, um nicht zu sagen eher selten....
Hoffe mir kann jemand weiter helfen und sagen wo der Fehler liegt bzw. liegen könnte. Wenn andere Quellcode-Bereiche zur Lösungsfindung wichtig sind, dann sagt einfach was ihr braucht, kanns euch alles noch schicken. |
|
Antwort: |
Von |
enny |
E-Mail |
robotronik123@freenet.de |
Datum |
04. März 2009 um 17:44:24 |
Antwort |
Hallo, danke für die schnelle Antwort.
Also die Terminate-Funktionen sehen wie folgt aus bei mir:Public Sub TerminateTexture() Set texDecke = Nothing Set texWand = Nothing Set texBoden(5) = Nothing End Sub Public Sub TerminateDInput() On Error GoTo ErrEnd DIDEV.Unacquire Set DIDEV = Nothing DIMouse.Unacquire Set DIMouse = Nothing Set DI = Nothing Exit Sub ErrEnd: running = False End Sub Public Sub TerminateDX() Set gD3DDevice8 = Nothing Set gD3DX8Sprite = Nothing Set gD3D8 = Nothing Set gD3DX8 = Nothing Set myDXFont = Nothing Set MenueFont = Nothing Set gDX8 = Nothing End Sub Sollte doch eigentlich passen oder? |
|
[ Antwort schreiben | Zurück zum DirectX-Forum | Forum-Hilfe ] |
|
Letzte Aktualisierung: Sonntag, 13. Dezember 2015 |
|