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

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

06.09.2013, 19:33

[Gelöst][C++ & SDL] Wie frage ich ab ob mein Fenster aktiv ist?

Hi,

ich schreibe gerade ein kleines Spielchen mit der SDL und C++. Nun wollte ich abfragen ob mein Fenster gerade im Vordergrund ist (aktiv) oder im Hintergrund (inaktiv). Ich habe leider bei Google nichts passendes gefunden. Hoffe ihr versteht was ich mein und danke schon mal für die Hilfe.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Swoerm« (14.09.2013, 14:19)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

06.09.2013, 19:55

Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

3

06.09.2013, 21:17

Hab's jetzt damit versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ( Event.type == SDL_ACTIVEEVENT)
            {
            if(Event.active.state & SDL_APPACTIVE)                   
                {
                    if(Event.active.gain)                                
                        Visible = true;                                    
                    else                                              
                        Visible = false;                               
                }
                
            }

        else
        {
            if(!Visible)                                               
                    StartGame.fTime = 0.0f;     }


Funktioniert leider nicht. :(
Kann mir allerding nicht erklären warum.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

06.09.2013, 21:34

Sieht ähnlich aus wie das hier: http://stackoverflow.com/questions/94399…ave-focus-sdl-c
Dort wird auch eine Lösung vorgeschlagen. Funktioniert die bei dir?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

5

07.09.2013, 01:05

Nein, die funktioniert leider auch nicht. :(
Meine Bilder bewegen sich wenn ich das Fenster im Hintergrund hab immer noch (ich nehm die Bewegungsgeschwindigkeit mal der Zeitvariable d.h. wenn die Zeitvariable 0 ist sollte es auch keine Bewegung geben).

Code-Ausschnitt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
case (SDL_ACTIVEEVENT):
             {
                if( Event.active.state & SDL_APPACTIVE ||
                    Event.active.state & SDL_APPINPUTFOCUS )
                {
                    Visible = (Event.active.gain == 1);
                }
             } break;
        
            if(!Visible)                                                
                    StartGame.fTime = 0;        


Aber Danke für deine Bemühungen. :thumbsup:

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

07.09.2013, 01:18

Kann ich mal mehr Code sehen? Mir schwant, dass du durch das break den if Block nie erreichst. Hast du das getestet?
Aber mehr Code würde nichts desto trotz helfen. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

7

07.09.2013, 01:38

Ich denke die Funktion in der ich die Events prüfe dürfte genügen:

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
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
67
68
69
70
71
72
73
74
75
76
77
78
void CGame::ProcessEvents ()
{


    SDL_Event Event;

    if( SDL_PollEvent (&Event))
    {
    
        switch(Event.type)
        {
        /* ... */
         case (SDL_ACTIVEEVENT):
             {
                if( Event.active.state & SDL_APPACTIVE ||
                    Event.active.state & SDL_APPINPUTFOCUS )
                {
                    Visible = (Event.active.gain == 1);
                }
             } break;
        
            if(!Visible)                                            
                    StartGame.fTime = 0;    
        /* ... */
        case (SDL_QUIT):
            {
            m_bGameRun = false;
            } break;

        case (SDL_KEYDOWN):
            {
                switch (Event.key.keysym.sym)
                {
                
                case (SDLK_ESCAPE):
                    {
                    m_bGameRun = false;
                    } break;


                } // Key

                if( GameState == MainMenu )
                {
                
                    switch (Event.key.keysym.sym)
                    {
                    
                    case( SDLK_d ):
                        {
                        GameState = Game; 
                        } break;
                    }


                } // Haumtmenü

                if( GameState == Game )
                {
                
                    switch (Event.key.keysym.sym)
                    {
                    
                    

                    case ( SDLK_TAB ):
                        {
                        
                        GameState = MainMenu;
                        } break;
                    }
                
                } // Game
            
            } break; // SDL_KEYDOWN
        } // Eventtyp
    }
}


Ich entschuldige mich jetzt schon mal für den grausigen Codestil. :wacko: :crazy: :whistling: (unglaublich aber alle drei passen irgendwie)

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

07.09.2013, 09:58

Ok, wie befürchtet: In Zeile 20 springst du durch das break aus dem switch Konstrukt raus. Dein If wird nie erreicht. Das muss innerhalb des case's, sprich vor dem break.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

9

07.09.2013, 12:56

Meinst du so?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* ... */
         case (SDL_ACTIVEEVENT):
             {
                if( Event.active.state & SDL_APPACTIVE ||
                    Event.active.state & SDL_APPINPUTFOCUS )
                {
                    Visible = (Event.active.gain == 1);
                }

                if(!Visible)                                            
                    StartGame.fTime = 0;    
             } break;
        
        /* ... */


Meine Sprites bewegen sich jedenfalls immer noch fort egal ob das Fenster aktiv ist oder nicht.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

07.09.2013, 13:06

Dann solltest du mal gucken, ob es an etwas anderen liegt, und ob deine Variablen die Werte haben, die du erwartest. Stichwort: Debugger
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige