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

1

26.09.2009, 18:45

[GELÖST] Problem "while-schleife"

Hallo,

ich arbeite zur Zeit an einer Game Klasse. Ich habe soweit alles fertig und theoretisch müsste alles funktionieren.
Nun habe ich das Problem dass sich sich die Klasse (Verwaltet Spielestates) in jeder der 3 Statemethoden aufhängt. Egal mit welcher ich initialisiere, es ist als ob sich das Programm in einer Endlosschleife aufhängt.
Das Programm ruft noch das jeweilige cout auf, danach reagiert das "SFML" fenster nicht mehr.
Ich hoffe mir kann jemand helfen.

Hier der Code:
CGame.h

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
#ifndef _GAME_h
#define _GAME_h

#include "AllHeaders.h"

class CGame
{
protected:
    sf::RenderWindow            MainWindow;
    sf::Event                   Event;
    int                         State;
    bool                        Running;


public:

    //InitFunktion

    void InitGame(int Height, int Width, int Colour);

    //Die 3 Spielzustände

    
    //IntroState ( 1 )

    void                            IntroState(void);
    //MenueState ( 2 )

    void                            MenueState(void);
    //MainState  ( 3 )

    void                            MainState(void);



    //Methoden für State


    //Methode um Spielzustand zu bekommen

    int CurrentState(void)
    {
        return this->State;
    };
    //Methode um Spielzustand zu erhöhen

    void NextState(void)
    {
        if (this->State > 0 && this->State < 3)
        this->State++;
        else if (this->State == 3)
        this->State = 1;
    };
    //Methode um Spielzustand zu senken

    void PreviousState(void)
    {
        if (this->State > 1 && this->State < 3)
        this->State--;
        else if (this->State == 1)
        this->State = 3;
    };
    //Methode um Spielzustand seperat zu ändern

    // 1 = Introstate

    // 2 = Menuestate

    // 3 = Mainstate

    void ChangeState(int NewState)
    {
        if (NewState > 0 && NewState < 4)
            this->State = NewState;
    };
    //Methode um herrauszufinden, ob Game läuft

    bool IsRunning(void)
    {
        return this->Running;
    };



};

#endif

CGame.cpp

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
#include "AllHeaders.h"



void CGame::InitGame(int Height, int Width, int Colour)
{
    this->MainWindow.Create(sf::VideoMode(Height, Width, Colour), "SFML Graphics", sf::Style::Titlebar);
    this->Running = true;
    this->State = 1;
}


void CGame::IntroState()
{
    std::cout<<"Spielzustand: Intro";

    while (this->CurrentState() == 1)
    {

        if (this->MainWindow.GetInput().IsKeyDown(sf::Key::N))
        {
            this->NextState();
        }
        this->MainWindow.Display();

    }

}


void CGame::MenueState()
{
    std::cout<<"Spielzustand: Menue";

    while (this->CurrentState() == 2)
    {

        if (this->MainWindow.GetInput().IsKeyDown(sf::Key::N))
        {
            this->NextState();
        }

        this->MainWindow.Display();

    }

}


void CGame::MainState()
{
    std::cout<<"Spielzustand: Main";
    
    while (this->CurrentState() == 3)
    {

        if (this->MainWindow.GetInput().IsKeyDown(sf::Key::N))
        {
            this->NextState();
        }

        this->MainWindow.Display();

    }

}


Main.cpp


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    //MainGame

    CGame Game;
    Game.InitGame(800, 600, 32);
    //MainLoop-------------------------

    while (Game.IsRunning() == true)
    {
        if (Game.CurrentState() == 1)
            Game.IntroState();
        else if (Game.CurrentState() == 2)
            Game.MenueState();
        else if (Game.CurrentState() == 3)
            Game.MainState();
    }
    //---------------------------------


    return 0;
}

2

26.09.2009, 19:49

Wo wird denn Game.IsRunning() bzw. die entsprechende Membervariable auf false gesetzt, um die Schleife zu verlassen?
fka tm

3

26.09.2009, 19:50

Die 1. Schleife wird momentan noch nicht verlassen weil ich nur zwischen den einzelnen States "wandeln" möchte.

4

26.09.2009, 19:56

Versuch mal break reinzumachen (und bei den anderern auch)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CGame::IntroState()
{
    std::cout<<"Spielzustand: Intro";

    while (this->CurrentState() == 1)
    {

        if (this->MainWindow.GetInput().IsKeyDown(sf::Key::N))
        {

            this->NextState();
           break; 
        }
        this->MainWindow.Display();

    }

}

5

26.09.2009, 19:59

Mit dem break; geht es leider auch nicht.
Ich habe mal zum testen ein cout in die Schleifen reingemacht.
Es scheint als ob die Schleife funktioniert, nur das Fenster nicht, das hängt sich nämlich auf.
Es reagiert nicht mehr und ist als ob es nicht aktualisiert wird. ( Wenn ich mit nem anderen Fenster rübergehe entsteht dieser Abdruck )

6

26.09.2009, 21:15

Versuch mal, irgendwas zu zeichnen,
oder window.Clear aufzurufen

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

7

26.09.2009, 21:33

Hast du vielleicht einfach vergessen die Windows(?)-Nachrichten zu verarbeiten?
Also PeekMessage und das ganze Zeug.

8

26.09.2009, 21:34

Edit: Vieeeeleen dank
Wie kann ich nur so... wie auch immer :D
Selbstverständlich ich habe die Eventschleife vergessen.
Danke für die Hilfe

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

9

26.09.2009, 22:10

Bitte :)

Werbeanzeige