Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

GrimmDominik

Frischling

  • »GrimmDominik« ist der Autor dieses Themas

Beiträge: 51

Wohnort: Plattling/Bayern

Beruf: Schüler

  • Private Nachricht senden

1

01.02.2004, 12:09

"3D-Engine" beenden ohne das programm zu beenden?

Hallo,

Ich habe eine kleine 3d-Engine geschrieben! Jetzt will ich diese Beenden und wieder zu meinen Ürsprünglichen WindowHandle das ich mit CreateWindowEx() erzeugt habe zurückkehren um von dort aus neue Einstellungen vorzuhnemen!
Meine Frage funktioniert das überhaupt? Wann ja wie?

Wäre um jede Hilfe dankbar!!

MFG Dominik

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

01.02.2004, 13:01

natürlich funzt das! Du musst dir nur ne eigene shutdown funktion für die engine schreiben in der alles was damit zu tun hat runtergefahren wird.

3

01.02.2004, 16:10

Vieleicht schreibst du dria auch einen kleinen Manager. Über den du alle Komponenten deiner Engine laden kannst und dieser hat dann auch eine Shutdown Methode.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

GrimmDominik

Frischling

  • »GrimmDominik« ist der Autor dieses Themas

Beiträge: 51

Wohnort: Plattling/Bayern

Beruf: Schüler

  • Private Nachricht senden

4

01.02.2004, 21:36

Das bedeutet jetzt also,dass ich alle erzeugten Strukturen, Pointer ... was mit D3D zu tun hat auf Null gesetzten werden muss, oder??

5

01.02.2004, 21:54

Ich zwar nicht wie du deine Engine aufgebaut hast. Aber wenn sie heruntergefahren werden soll mußt du schon alle Interfaces von D3D freigeben und jeglichen Speicher, den du für deine Engine reserviert hast, freigeben.

Halt alles Rückgänig machen was du gemacht hast um deine Engine zu Initialisieren.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

6

01.02.2004, 22:18

Hi,

ich hab dir mal was psoidocode gemacht :)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
bool init_engine (params)
{
    PUSH_FUNCTION

    Initialisiere Direct3D/OpenGL/SDL oder was weis ich
    Initialisiere DirectInput oder Submodule von SDL
    
    Lade Texturen und Sounds sowie Modelle

    POP_FUNCTION
}

bool shutdown_engine (void)
{
    PUSH_FUNCTION

    leere Manager für Texturen, Sounds und Modelle
    deinitialisiere DirectInput/Submodule von SDL
    deinitialisiere alle Surfaces
    deinitialisiere Direct3D/OpenGL/SDL oder was weis ich

    alle pointer auf NULL setzen 

    POP_FUNCTION
}

#ifdef _WIN32
    int __stdcall WinMain (HINSTANCE__ *Instance, HINSTANCE__ *prevInstance, char *cmdLine, int cmdShow) 
#else
    int main (int argc, char *argv[])
#endif
{
    PUSH_FUNCTION

        // Fenster erstellen
    // ############################################
    // [...]
    // ############################################

    while (true)
    {
        try
        {
                // initialisiere Engine
            init_engine (keine);

                // Fahre sie wieder runter
            shutdown_engine ();

            break;
        }
        catch (CException &ex)
        {
            PROTOKOLL.writeException (ex);
        }
    }

        // Fenster wie gewohnt weiter steuern ohne die engine
    // ############################################
    // [...]
    // ############################################

    POP_FUNCTION

    return 0;
}


Gruß,
Patrick :)

GrimmDominik

Frischling

  • »GrimmDominik« ist der Autor dieses Themas

Beiträge: 51

Wohnort: Plattling/Bayern

Beruf: Schüler

  • Private Nachricht senden

7

03.02.2004, 14:27

Die folgende Funktion habe ich in meine Render Funktion eingefügt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(GetAsyncKeyState(VK_F12)&0x8000)?1:0)
    {
        Pause = true;
{
if(lpDDSBack)
    {
        lpDDSBack->Release();
        lpDDSBack = NULL;
    }
    if(lpD3DDevice) 
    {
        lpTextur->Release();
        lpTextur = NULL;
        lpD3DDevice->Release();
        lpD3DDevice = NULL;
        lpD3D->Release();
        lpD3D = NULL;
    }
}
}


Das Problem: Wenn ich F12 drücke wird mein komplettes Programm beendet!!

MFG

Dominik

8

03.02.2004, 15:00

Deine IF-Anweisung sieht eh etwas komisch aus. Vor allem wundert es mich das es keinen Fehler gibt. Du machst 2 Klammern auf und schließt drei ??? Und wieso ist die Anweisung so komisch gestalltet? Warum diese doppelte IF-Anweisung?

Ein Ausdruck ist entweder Wahr oder Unwahr. Ist er NULL ist er Unwahr ist er ungleich NULL ist er Wahr. Dein Ausdruck ist "GetAsyncKeyState(VK_F12) & 0x8000".

Deine Klammern sehen alle etwas komisch aus ;D Vieleicht liegt es daran das du nicht alles gepostet hast. Nur ist es etwas Iretierend. Ich versuch deinen Code mal auseinander zu nehemen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(GetAsyncKeyState(VK_F12)&0x8000)?1:0) 
   { // Ausführungsblock der IF-Anweisung (Begin)
      Pause = true; 
{ // Warum diese Klammer? Oder soll sie obige Klammer schließen?
   if(lpDDSBack) 
   { 
      lpDDSBack->Release(); 
      lpDDSBack = NULL; 
   } 
   if(lpD3DDevice) 
   { 
      lpTextur->Release(); 
      lpTextur = NULL; 
      lpD3DDevice->Release(); 
      lpD3DDevice = NULL; 
      lpD3D->Release(); 
      lpD3D = NULL; 
   } 
} // Warum diese Klammer?
} // Ausführungsblock der IF-Anweisung (Ende)

So wie ich das sehe ist das kein Wunder das sich deine Anwendung Beendet. Denn sobald du F12 drückst heißt das für deinen Code das dein Ausdruck wahr ist und damit alle DX Schnittstellen freigegeben werden. Damit hast du deine Anwendung Praktisch geschlossen und nicht wie du es wohl wolltest nur pausieren lassen.

Wenn deine Anwendung bei F12 nur eine Pause einlegen soll, darfst du nicht die DX Komponenten freigeben.

Tipp:
Du solltest deine Variable "Pause" vorab Initialisieren (false) und dann bei deiner Abfrage dies schreiben.

Quellcode

1
Pause = !Pause;
Damit switched du Automatisch immer hin und her ;)

Tipp2:
Für das freigeben schreib dir ein schönes Makro

Quellcode

1
2
3
4
5
6
7
8
template<class T> void SafeRelease(T*& pInterface)
{
  if(pInterface)
  {
     pInterface->Release();
     pInterface = 0;
  }
}
Damit sieht dein Code etwas sauberer aus ;)[/code]
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

03.02.2004, 17:39

nimm nicht F12 sondern ESCAPE oder SPACE, diverse F-Tasten sind im Debugmode um das Programm anzuhalten, stoppen, beenden, neustarten usw.

F-Tasten neben F1 sind evil ;) Daran liegts bestimmt

GrimmDominik

Frischling

  • »GrimmDominik« ist der Autor dieses Themas

Beiträge: 51

Wohnort: Plattling/Bayern

Beruf: Schüler

  • Private Nachricht senden

10

03.02.2004, 17:47

Sorry das mit den Klammern war ein Tippfehler als ich den Code übernommen hab! Hab nämlich leider nicht auf meinen Arbeitsrechner Internet! :crying:
Ich will ja meine Anwendung aber nicht pausieren lassen sondern maine Engine nur Beenden das Hauptfenster Jedoch weiterlaufen lassen! Ich erkläre mal was ich eigentlich vorhabe!
Also ich muss ein Programm für Mathe(Analytische Geo) schreiben, welches Ebenen, Tetraeder, Schnittpunkte von Ebenen mit anderen Ebenen... darstellen kann.
Dieses Programm soll ein Dialogfeld besitzen in welchem ich unterschiedliche Einstellung vornehemen kann z.B. Renderstates ändern(Wireframe | Solid; Lightning; Transparentsefekte...). Als weiteres soll ich Eingabefelder haben in welchen ich neue Vektoren erzeugen kann welche meine z.B. meine Ebene neu beschreiben.
Dies Funktioniert auch schon einigermaßen.
Mein Problem ist jetzt nur, dass mein Dialogfeld am Start meines Programmes ausgeführt wird. Wenn ich nun weitere Änderungen durchführen will muss ich ja mein Dialogfeld wieder aufrufen. Das wollte ich so machen, dass ich meine Engine Beende jedoch nicht mein Hauptprogramm. Von dort aus soll mein Dialogfeld ausgeführt werden.

Gibts auch noch ne andere möglichkeit dieses Dialogfeld aufzurufen ohne die Engine herunterzufahren?
Zur Info: Die Engine läuft im Vollbildmodus, Das Dialogfeld habe ich beim Start des Programms mit OpenDialog(?Parameter?) aufgerufen

wäre dankbar für jede Hilfe

MFG

Dominik

Werbeanzeige