• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - maszyna stanów wysypuje program, oraz pytanie

VPS Starter Arubacloud
0 głosów
607 wizyt
pytanie zadane 26 marca 2017 w C i C++ przez szym3ns Użytkownik (860 p.)

Hejże hej. Mam pewien problem. Jestem w trakcie dzielenia mojego kodu (nie wszystko w jednej klasie) i oczywiście natrafiłem na problem, który postawił mnie pod ścianą. Chciałem zrobić maszynę stanów (abstrakcyjna klasa StateManager + klasy dziedziczące StateMenu, StateGame itd.). Zależnie od tego na co wskazuje obiekt klasy StateManager, miało się rysować menu lub gra. Problem w tym, że w momencie rysowania menu, moja aplikacja się 'wysypuje'. Domyślam się, że pewnie źle przekazuje okno mojej aplikacji, ale nie mam już pomysłów co jest nie tak. Wcześniej zrobiłem to w klasie Engine (zawiera główną pętle, okno itp.), i za pomocą IF'a kontrolowałem co ma być rysowane i normalnie działało, a gdy chce to przenieść do mojej "maszyny stanów" to nie działa.

Oto kod:

statemanager.hpp http://codepad.org/EyrYroFe

statemenu.hpp http://codepad.org/mzCphvaO

statemenu.cpp http://codepad.org/JwKQ4eut

engine.hpp http://codepad.org/gthM1vQg

engine.cpp http://codepad.org/U3TZJC64

text.hpp http://codepad.org/th3O5bmZ (tworzy tekst)

main.cpp

#include "Engine.hpp"

int main()
{
    Engine *TicTacToe = new Engine;
    TicTacToe->RunEngine();

    delete TicTacToe;
    return 0;
}

 

I jeszcze mam pytanie. Jak mógłbym zrobić wspólne okno dla wszystkich klas? Przesyłanie okna przez funkcje za każdym razem jest według mnie bezsensowne, szkoda pamięci. Na dodatek trzeba robić osobną funkcję jak zrobiłem wyżej, do przesłania okna żeby utworzyć moje napisu do menu.. Próbowałem użyć static, ale mi nie wychodziło. Utworzyłem też osobny plik zmienne.hpp, w którym zadeklarowałem moje okno, ale to też nie działa. Już nie mam pomysłów..

1 odpowiedź

0 głosów
odpowiedź 27 marca 2017 przez criss Mędrzec (172,590 p.)
wybrane 27 marca 2017 przez szym3ns
 
Najlepsza

Engine::Initialize:

    StateMenu s_menu;
    state = &s_menu;
    state->InitState(*mainwindow);

s_menu to obiekt lokalny. Wskaźnik state wskazuje na nieistniejący obiekt jak tylko Initialize zakończy działanie. Powinieneś zaalokować go dynamicznie. A właściwie to najnormalniej wyglądałaby tablica (będąca polem klasy Engine) obiektów klas dziedziczących po StateManager (btw. dziwna nazwa skoro to klasa bazowa stanów) i "przełączanie" wskaźnika state na właściwy obiekt (stan). Albo przełączanie w inny sposób whatever - np. wybieranie właściwego indeksu tablicy.

update:

I jeszcze mam pytanie. Jak mógłbym zrobić wspólne okno dla wszystkich klas? 

Okno jest ci potrzebne tylko do renderowania. Więc przekazujesz tylko do draw(). I jakiej pamięci szkoda? Na referencje na stosie? 

Zamiast zapisywać w stanach wskaźnik na okno, przekazuj do okno do DrawState tak jak jest zaprojektowany SFML. Swoją drogą - dlaczego StateManager nie może dziedziczyć po sf::Drawable? Wszystko co można renderować powinno dziedziczyć po sf::Drawable - zdecydowanie ułatwia sprawe.

Podobne pytania

0 głosów
0 odpowiedzi 811 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez kaminie318 Bywalec (2,070 p.)
0 głosów
0 odpowiedzi 167 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Knayder Nałogowiec (37,640 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...