SFML und ein Window
-
Hallo,
ich bin im Moment dabei mit SFML rumzuspielen. Jetzt habe ich ein kleines Problem: ich will ein Fenster haben, wobei der Inhalt aus verschiedenen Klassen kommt (z.B. verschiedene Menus, ein eigentliches Spielfeld, ...).
Wie aber mache ich das am Besten? Ich hab es wie folgt getestet, das hat aber nicht funktioniert:
Im Konstruktor der "Haupt"-Klasse (ich nenn es mal so) das Window gezeichnet und vorm .display() die relevanten Methoden (z.B. zum Zeichnen einer Schrift) aufgerufen. Leider interessiert das Fenster das nicht so wirklich, was vermutlich dran liegt, dass Fenster in ner while-Schleife abläuft und das dadurch irgendwie nicht so ganz funktioniert? Keine Ahnung.
Das Fenster selbst habe ich auch als Membervariable deklariert und alle Methoden innerhalb der Klasse greifen auf diese zu - nur irgendwie klappt es nicht
Danke schonmal
-
Ja, aha aha.
Zeig mal Code her.
Mit der Beschreibung kann ja kein Mensch was anfangen.
-
Soll ein kleiner Pong-Klon werden. Interessanterweise habe ich die Lösung schon gefunden, nur verstehen tu ich sie nicht
Window.h
class Window { public: Window(); /* weitere methoden, Menü-Anzeige, ... */ private: sf::RenderWindow wnd; };
Konstruktor von Window:
Window::Window() : wnd(sf::VideoMode(800, 600, 32), "Game") { while(wnd.isOpen()) { sf::Event evt; while(wnd.pollEvent(evt)) { if(evt.type == sf::Event::Closed) wnd.close(); } /* fensterinhalt */ wnd.display(); } }
Und so kann ich jetzt auch von anderen Methoden immer auf das selbe Fenster zugreifen. Das heißt, wenn ich beispielsweise in Window eine Methode "showMenu" habe und diese statt "fensterinhalt" einfüge, funktioniert das so jetzt. Was ich dran nicht verstehe ist die erste Zeile; was macht denn dieser ":" genau? Initialisiert das Objekt oder wie?
Und was ich mich im Moment noch frage, wofür ich noch keine Lösung habe:
Wenn ich nun eine andere Klasse, beispielsweise "Ball" habe - wie zeichne ich den dann in dem von Window geöffneten Fenster? Ich muss den Ball ja irgendwie ins Fenster kriegen, jedoch weiß die Ball-Klasse nicht das es das Fenster gibt... oder die hier genannte "wnd"-Variable einfach nur der Ball-Klasse über den Konstruktor übergeben?
-
Ja, die Syntax mit : nennt sich Konstruktor-Initialisierungsliste.
Zum zweiten Punkt gibt es mehrere Möglichkeiten. Du könntest eine Funktion
Window::Draw(const Ball& ball)
implementieren. Wenn neue Spielobjekte dazukommen, fügst du eine neue Überladung hinzu. Alternativ kannst du eine FunktionWindow::Draw(const sf::Drawable& drawable)
schreiben undBall
vonsf::Drawable
ableiten.Übrigens würde ich die Game-Loop nicht im Konstruktor ausführen, denn so wird das
Window
-Objekt gar nie fertig konstruiert. Lagere sie doch in eine separate Funktion aus, die du nach der Konstruktion aufrufst.
-
Mir scheint, als würden hier noch grundlegende C++-Kenntnisse fehlen. Ich würde dir raten, erstmal auf der Konsole zu programmieren, bis du in C++ einigermaßen fit bist.