Klasse nach Benutzung wegschmeissen



  • Hallo

    Ich versuche mich gerade an einem Spiel und hab dazu eine Frage zu Klassen.
    Ich benutze bisher zwei Klassen.
    Eine dient dafür, dass Hauptmenü anzuzeigen, das andere führt das Spiel aus.
    Beide verwenden dafür eine Referenz zum Fenster.
    Nachdem man das Menü durch das Klicken auf "START" verlässt wird die zweite Klasse erstellt und das Spiel beginnt.
    Nun bin ich mir nicht sicher, ob ich, bevor ich die Spiel-Klasse erstelle, die Menü-Klasse löschen sollte.
    Das ganze sieht bisher so aus:

    #include <SFML/Graphics.hpp>
    #include <SFML/Window.hpp>
    
    #include "Game_Board.h" // Beinhaltet Class Menue
    #include "Game_Map"     // Beinhaltet Class TileMap
    
    int main()
    {
        // Erstelle, dass Fenster in 32bit
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML TEST");
    
        // Limit to 30 frames per second
        App.SetFramerateLimit(30);
    
        // Erstelle das Menü
        Menue menue(App);
    
        // Prüfe,  ob das Bild für Button Start usw. geladen werden konnte
        if (menue.Init() != 0)
        {
            // Error ... Benutzer daraufhinweisen(String wird erstellt mit entsprechendem Inhalt)
    
                            sf::String Error;
                            Error.SetPosition(150.f, 300.f);
                            Error.SetScale(1.f, 1.f);
                            Error.SetText("Error!\nDas Menü konnte nicht geladen werden!");
                            App.Clear();
                            App.Draw(Error);  // String anzeigen
                            App.Display();    // Anzeige rendern
    
            Sleep(4500);
    
            App.Close();
            return 0;
        }
        else
        {
            menue.Main_Loop();     // Wenn nichts schiefgelaufen ist übernimmt menue die ganze Kontrolle über das Fenster mit der Function Main_Loop
    
        }
    
        // Hier würde TileMap tilemap hinkommen, aber ich will davor menue löschen. 
    
        return 0;
    }
    

    Achja, dafür benutze ich natürlich SFML : D
    Ich habe es schon mit Classen-pointern versucht, aber ohne Erfolg ; (

    Ich hätte da noch eine Frage.
    Wie kann man mehrere Rückgabewerte beim Beenden eines Funktionsaufrufs abfragen.
    Mir käme nur sowas in den Sinn:

    // Diese sind mögliche Rückgabewerte
    #define ERROR_IMAGE_LOAD  223
    #define ERROR_FONT_LOAD   224
    #define ERROR_INIT        225
    
    if (Init() == ERROR_IMAGE_LOAD)
       {
       // Error ...tue das ...
       }
    else
    if (Init() == ERROR_FONT_LOAD)
       {
       // Error ...tue das ...
       }
    else
    if (Init() == ERROR_INIT)
       {
       // Error ...tue das ...
       }
    else
       // Erfolg ...
    

    mfg



  • Der liebe volkard mit seinem Edit/Answer Button Problem. 🙂
    (sind die wirklich so böse nahe beieinander?!)



  • drakon schrieb:

    Der liebe volkard mit seinem Edit/Answer Button Problem. 🙂
    (sind die wirklich so böse nahe beieinander?!)

    Nein, ich bin ein C64-Kind und komme mit der Maus noch nicht zurecht.



  • Vielleicht wäre Lynx ja etwas für dich. xD

    @Topic:

    // Diese sind mögliche Rückgabewerte
    const unsigned int ERROR_IMAGE_LOAD  = 223;
    const unsigned int ERROR_FONT_LOAD   = 224;
    const unsigned int ERROR_INIT        = 225;
    
    int temp = Init ();
    
    switch ( temp )
    {
     case ERROR_IMAGE_LOAD: /**/ break;
     case ERROR_FONT_LOAD: /**/ break;
     case ERROR_INIT: /**/ break;
     default: /**/
    };
    

    Wirkt doch gleich viel sauberer, nicht?
    Und für so etwas, wie oben nimmt man keine Makros, sondern konstante Integer. (Typsicherheit usw.)

    Warum willst du denn das Menü löschen? Üblicherweise möchte jemand ja wieder zu einem Menü wechseln und nicht das Spiel beenden, wenn man mal etwas angefangen hat.

    //EDIT:
    Wenn ich mir das so anschaue, dann wären hier anstatt solche Rückgabewerte in C++ Exceptions angebrachter. Das mit den Rückgabewerten ist so C-Style. Wirf eine Exception aus der Init Funktion, falls etwas schief läuft und fange die dann auf einem höheren Level.



  • Vielleicht ist das in Deinem Sinne, im Menue wegzuschmeißen:

    #include <SFML/Graphics.hpp>
    #include <SFML/Window.hpp>
    
    #include "Game_Board.h" // Beinhaltet Class Menue
    #include "Game_Map"     // Beinhaltet Class TileMap
    
    int main()
    {
        // Erstelle, dass Fenster in 32bit
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML TEST");
    
        // Limit to 30 frames per second
        App.SetFramerateLimit(30);
    
        // Erstelle das Menü
    {//Lokalen Blockk aufmachen
        Menue menue(App);
        // Prüfe,  ob das Bild für Button Start usw. geladen werden konnte
        if (menue.Init() != 0)
        {
            // Error ... Benutzer daraufhinweisen(String wird erstellt mit entsprechendem Inhalt)
    
                            sf::String Error;
                            Error.SetPosition(150.f, 300.f);
                            Error.SetScale(1.f, 1.f);
                            Error.SetText("Error!\nDas Menü konnte nicht geladen werden!");
                            App.Clear();
                            App.Draw(Error);  // String anzeigen
                            App.Display();    // Anzeige rendern
    
            Sleep(4500);
    
            App.Close();
            return 0;
        }
        else
        {
            menue.Main_Loop();     // Wenn nichts schiefgelaufen ist übernimmt menue die ganze Kontrolle über das Fenster mit der Function Main_Loop
    
        }
    }//Und wieder zu und Menue ist weg
        // Hier würde TileMap tilemap hinkommen, aber ich will davor menue löschen. 
    
        return 0;
    }
    


  • Wäre technisch sicher eine Möglichkeit, allerdings bezweifle ich, dass sich das gescheit verhält. Menü -> Spiel -> Fertig ist ein wenig zu engstirnig. Der Spieler will vielleicht nochmal eine Runde spielen?



  • @Drakon

    Nee, das Spiel beinhaltet doch Bilder : D

    Danke euch beiden : D
    Ich fürchte mich nur, ob das nicht gefärhlich sein kann wenn zwei Classen (ja, eigentlich zeitgleich) per Referenz auf das Fenster zugreifen.

    Wie wäre das :

    // ...
    
    const int INGAME = 223;
    const int MENUE  = 224;
    
    int Winwow_state;
    
    while (App.IsOpened)
    {
    
         while (Window_state == INGAME)
         {
         // Führe das Spiel aus
         Draw_Game();
         // Die Funktion würde jedes Mal prüfen, ob Window_state stimmt
         // Bsp. Window_state = GetWindowState();
    
         }
    
         while (Window_state == MENUE)
         {
         Draw_Menue();
         }
    
    {
    


  • @Drakon

    Nee, das Spiel beinhaltet doch Bilder : D

    Versteh ich nicht ganz.

    Üblicherweise wird das aber so in etwa gemacht:

    class game_state
    {
    public:
      virtual void run ();
      virtual ~game_state (){}
    };
    
    class in_game : public game_state
    {
     public:
     void run (){/**/}
    };
    
    class in_menue : public game_state
    {
     public:
     void run (){/**/}
    };
    
    int main ()
    {
     game_state* current_state;
     in_game game;
     in_menu menue;
    
     current_state = &menu;
    
     while ( /*running*/ )
     {
      if (/**/) current_state = &game;
      else if (/**/) current_state = &menu;
    
      current_state->run ();
      ..
     }
    }
    

    Also so in etwa. Somit kannst du einen beliebigen State erstellen und der kann dann ausgewählt und aufgerufen werden.



  • drakon schrieb:

    Vielleicht wäre Lynx ja etwas für dich. xD

    Das ist lieb.
    Neulich habe ich mal links benutzt, um was kleines zu recherchieren. Spaßigerweise halten einen die Zuschauer nicht für einen, der zu doof oder zu faul ist, auf seinem Laptop X zu installieren, sondern für einen Haxx0r-Gott, der sich bestimmt in 5 Minuten in Pentagon hacken könnte.



  • Danke nochmal
    Ich glaube das wars : D

    EDIT :
    Der Compiler nervt mal wieder :

    error: expected class-name before '{' token|
    

    Geschrieben:

    class Menue : public game_state
    {
    // ...
    };
    

    Ich habe für jede Klassendeklaration und -definition je eine Cpp oder H Datei angelegt.



  • volkard schrieb:

    [..]sondern für einen Haxx0r-Gott, der sich bestimmt in 5 Minuten in Pentagon hacken könnte.

    Eigentlich sind es ja nur 60 Sekunden, aber auch nur mit einer gewissen "Unterstützung". :p
    ~(ich denke mal, dass wir den gleichen Film ansprechen..)~

    @Demian01
    Es gibt viele Möglichkeiten, aber wenn du diese verstehst, dann kriegst du auch andere hin, falls nötig.


Log in to reply