--- Pytanie jest moim zdaniem dość obszerne, w razie nie zrozumienia go do końca lub pogubienia się w nim będę wdzięczny za danie znać ---
Witam, to już któreś z wielu pytań jakie zadałem na tym forum odnośnie pierwszego projektu jaki piszę w SFML. Struktura całego programu oparta jest na wzorcu projektowym state. Mam klasę abstrakcyjną mającą reprezentować różne stany gry:
-> TheAbstractState //abstrakcyjna klasa bazowa
dziedziczą z niej jak na razie klasy:
-> GameState //sama gra
-> GameOverState //gdy przegramy
-> MenuState //logiczne
Mam główną pętle gry w klasie w której jest wskaźnik na klasę abstrakcyjną wszystkich stanów, w zależności od tego jaki komunikat metody loop() z klas pochodnych klasy theAbstractState zwracają odpowiednio zmieniam stan gry ( wskaźnik ):
void Program::run() {
while (m_window.isOpen()) {
StatesReturns sig = m_states->loop(m_window, m_globalTimer);
if (sig.signals == Signals::EXIT) {
delete m_states;
m_window.close();
}
else if (sig.signals == Signals::GAME) {
m_globalTimer.restart();
delete m_states;
m_states = new GameState(sf::Vector2u(m_window.getSize().x, m_window.getSize().y));
}
else if (sig.signals == Signals::MENU) {
m_globalTimer.restart();
delete m_states;
m_states = new MenuState();
}
else if (sig.signals == Signals::GAMEOVER) {
m_globalTimer.restart();
delete m_states;
m_states = new GameOverState(sf::Vector2u(m_window.getSize().x, m_window.getSize().y), sig.additionalValue);
}
else if (sig.signals == Signals::NONE) {
delete m_states;
m_window.close();
}
}
}
Signals to odpowiedni typ wyliczeniowy, jednak my zwracamy strukturę:
struct StatesReturns {
Signals signals;
int additionalValue;
};
Druga składowa to dodatkowa informacja zwracana przez pętle danego stanu. Np. czas gry w sekundach. Problem jest taki że niektóre z metod loop() coś takiego muszą zwrócić a inne nie. Tam gdzie nie muszą to po prostu zwracałem zero:
if (event.type == sf::Event::Closed) {
return StatesReturns{ Signals::EXIT,0 };
}
Czasami jednak była potrzeba coś zwrócić dodatkowego:
if (areObjectsDefinitelyEqual(m_player, i))
return StatesReturns {Signals::GAMEOVER, int(timer.getElapsedTime().asSeconds() - gameStart)};
Wiem że to rozwiązanie nie jest do końca ładne ale przechodziło, wcześniej... teraz pasuje mi żeby metoda loop() z klasy GameState zwróciła jeszcze kolory obiektów gry podczas skucia gracza. W jednym miejscu zwracał bym masę wartości a w innych:
( Signals::jakisSygnal, NULL, NULL )
To nie jest chyba zbyt fajne :/ A nie mogę zmienić typu zwracanego przez metodę wirtualną z klasy bazowej w klasie pochodnej. Myślałem żeby te dodatkowe informacje zwracać za pomocą dodatkowych metod, jednak nie będę mógł je wywołać z poziomu wskaźnika na klasę bazową ( bo dziedziczenie działa tylko w jedną stronę ), zrobił bym jakieś zmienne globalne dla całego projektu ale słyszałem że potrzeba ich zastosowania znaczy że wszystko się napisał źle i kod jest do wyrzucenia ( a ja trochę się napracowałem )
Co powinienem zrobić ;(