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

11

28.02.2008, 01:13

Hab mal ein paar Anpassungen vorgenommen:

MessageLoop:

C-/C++-Quelltext

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
while( msg.message!=WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
            HRESULT hr = direct3dDevice->TestCooperativeLevel();
            if ( hr == D3DERR_DEVICELOST )
            {
                Sleep( 50 ); // Reset nicht möglich

            } 
            else if( hr == D3DERR_DEVICENOTRESET) 
            {
                if (!g_AppPaused) onLostDevice(); // Reset möglich

            }
            else
            {
                beginRender(0xFF1D2E48);
                endRender();
            }
        }
    }


Funktion onLostDevice (einiges hardcodiert, g_d3dpp global)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void onLostDevice()
{
    HRESULT hr;

    ZeroMemory( &g_d3dpp, sizeof(g_d3dpp) );
    g_d3dpp.Windowed = false;
    g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    g_d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    g_d3dpp.BackBufferCount  = 1;
    g_d3dpp.BackBufferHeight = 1024;
    g_d3dpp.BackBufferWidth  = 1280;
    g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    g_d3dpp.EnableAutoDepthStencil = TRUE;
    g_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

    direct3dDevice->Reset(&g_d3dpp);
}


WinProc (g_AppPaused ist bool, global):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
case WM_ACTIVATE:
        if( LOWORD(wParam) == WA_INACTIVE )
        {
            SetWindowText(hWnd, "Pause"); // Zur Kontrolle

            g_AppPaused = true;
        }
        else
            g_AppPaused = false;
        return 0;


Also bei mir funktioniert das.
Fragen dazu kann ich dir morgen beantworten. Bzw. heute, hab gesehen, du warst auch noch online um die Zeit :oops:

12

28.02.2008, 02:13

wieso um die Zeit? Ist doch noch früh am Abend *G*

mit meiner WinProc und deiner MsgLoop klappts bei mir jetzt auch :-) (wenn ich dein WinProc nehme wird bei mir erst garkein Fenster erstellt, kA warum).
Worans jetzt genau lag guck ich mir aber erst morgen an. Dann werd ich das Ganze nämlich Stück für Stück in das Projekt übertragen.

13

28.02.2008, 08:33

War nur ein Ausschnitt aus deiner (nicht geposteten) WinProc. Die Activate-Meldung eben, die abgearbeitet wurde.
Freut mich, daß es jetzt klappt. Das Handling gehört imho einfach in eine robuste Anwendung.
Ich hatte beim Testen das Problem, daß ich irgendwo Breite und Höhe vertauscht hatte und der Reset immer fehlschlug. (Wenn's mal wieder etwas länger dauert...)
(Btw, hat dein Nick etwas mit der Band CoB zu tun?)

14

28.02.2008, 15:36

ne, CoB steht für Clan ohne Bestimmung *G*
Haben den Clan mal in der 6. Klasse gegründet, und seitdem häng ich es überall vor, weil die Nicks sonst schon vergeben sind.
Hab mir irgendwie nie so Gedanken gemacht, was passiert, wenn man switched (kann damit zusammenhängen, dass bis jetzt all meine Anwendungen mit DirectX solange im Vordergrund waren, bis ich wieder den nächsten Fehler gefunden hab, den es auszubessern galt *G*).
Danke nochmal für die Hilfe. Heute komm ich wohl leider nicht mehr dazu alles richtig einzubauen, aber das sollte jetzt wohl kein großes Problem darstellen.

/edit:
Hab grad noch ein wenig Zeit gefunden und jetzt eine Frage:

Wenn ich das richtig verstehe wird WM_ACTIVATE sowohl an das Fenster gesendet, wenn es wieder in den Vordergrund gerufen wird, als auch, wenn es minimiert wird? Und mit

C-/C++-Quelltext

1
LOWORD(wParam) == WA_INACTIVE

wird dann gerpüft ob es minimiert wurde? Falls nicht, wurde es maximiert bzw wieder in den Vordergrund gestellt?

Hab länger nach einer guten Erklärung der einzelnen Window Messages gesucht, aber leider nicht viel gescheites gefunden.

/edit2

so, taucht noch ein zweites kleines Problem auf: Im Vollbildmodus klappt nun alles, wenn ich keinen Text und keine Bilder rendere. Sobald ich aber eines der beiden rendern will, habe ich wieder das gleiche Problem.
Die Vermutung liegt also nahe, dass die Schriften und Texturen verloren gegangen sind. (Schriften erstellt mit D3DXCreateFont, Texturen mit D3DXCreateTextureFromFileEx).
Die Schrift hab ich zB noch unter g_font gespeichert. Gibts einen Befehl, diese wieder "anzumelden" oder wie muss ich das machen?

/edit3:

ok, bei den Schriften hab ich die Funktionen gefunden. (In meiner D3DReset-Methode muss ich dann nur für jede Schrift OnLostDevice und OnResetDevice aufrufen)
Für die Texturen suche ich gerade noch

15

29.02.2008, 17:53

Hab deine Edits grade nur durch Zufall entdeckt (neuer Post wäre als Signal für Neues angebrachter ;)).
Für Minimieren, Maximieren und Wiederherstellen ist die Meldung WM_SIZE zuständig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//WinProc Ausschnitt

case WM_SIZE:
    if( wParam == SIZE_MINIMIZED )
    {
        // Code

    }
    else if( wParam == SIZE_MAXIMIZED )
    {
        // Code

    }
    else if( wParam == SIZE_RESTORED )
    {
        // Code

    }


Bezüglich Wiederherstellen von Ressourcen hast du ja für Fonts schon das Richtige gefunden.
Bei Texturen kommt es darauf an, welchen Memory-Pool du beim Ausführen von D3DXCreateTextureFromFileEx angegeben hast. Verwendest du D3DPOOL_MANAGED, erledigt DirectX bei einem Reset für dich die Kleinarbeit.

16

03.03.2008, 16:03

so, nach dem Wochenende hab ich wieder was Zeit gefunden.

Also D3DPOOL_MANAGED benutze ich. Trotzdem funktioniert es irgendwie nicht. Hier mal der Aufruf:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
D3DXCreateTextureFromFileEx(direct3dDevice,
                                filename.c_str(),
                                D3DX_DEFAULT_NONPOW2,
                                D3DX_DEFAULT_NONPOW2,
                                D3DX_FROM_FILE,
                                0,
                                D3DFMT_A8R8G8B8,
                                D3DPOOL_MANAGED,
                                D3DX_DEFAULT,
                                D3DX_DEFAULT,
                                ColorKey,
                                &imageInfo,
                                NULL,
                                &texture);
[/code]

17

03.03.2008, 17:55

Probier mal, ob bei Verwendung der "abgespeckten" Version D3DXCreateTextureFromFile (ohne Ex) das Problem immer noch auftritt. Wenn ja, bitte mehr Info, was du da genau machst, und den relevanten Code.

18

03.03.2008, 18:54

ohne Ex gibts den selben Fehler.
Genauer Code kommt heute Abend, bin jetzt erstmal unterwegs.

19

03.03.2008, 23:16

Problem gelöst:

Es lag nicht an den Texturen, die wurden korrekt wieder hergestellt. Aber das zugehörige Sprite auf das ich zeichne (mach atm was mit 2D) habe ich nicht neu geladen. Musste einfach der D3DReset-Methode noch den Aufruf OnLostDevice und OnResetDevice für mein Sprite hinzufügen.

Danke nochmal für die Hilfe!

20

03.03.2008, 23:20

Freut mich! Kannst ja dein Meisterwerk hier irgendwann unter Projekte präsentieren. :)

Werbeanzeige