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

SFML - po podzieleniu kodu funkcja nie działa jak powinna

Object Storage Arubacloud
0 głosów
504 wizyt
pytanie zadane 20 kwietnia 2017 w C i C++ przez szym3ns Użytkownik (860 p.)
Witam, napisałem menu do aplikacji, w skrócie: po najechaniu myszką na napis podświetla się on na wybrany kolor, a po kliknięciu zmienia stan aplikacji. Wszystko mi pięknie działało, lecz postanowiłem pójść dalej i ogarnąć trochę bałagan w kodzie, więc podzieliłem program na pomniejsze części - między innymi postanowiłem dla każdego stanu aplikacji dać osobną pętle zdarzeń, tj. klasa Menu ma osobną pętle, Options, Game itd. Wszystko się wyświetla, kliknięcia zmieniają stan na podany, ale napis podświetla się tylko wtedy gdy kursor jest w ruchu, nie gdy jest na nim, co jest totalnie bez sensu i nie mam zielonego pojęcia dlaczego tak się dzieje (to znaczy domyślam się, że coś jest nie tak z pętlą, ale nie mam pojęcia co..).

Funkcja zmieniająca kolor napisu: http://codepad.org/SMnPaET3

Menu.cpp http://codepad.org/4Bjkhy0o

StateManager.cpp http://codepad.org/2eRetTF6

main.cpp http://codepad.org/BrYFZaKw

3 odpowiedzi

0 głosów
odpowiedź 20 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
Sprawdzasz czy mysz jest na tekście tylko jeżeli okno obsługuje jakiś event. (Ruch myszką, kliknięcie przycisku. Cokolwiek). Jeżeli myszą nie ruszasz, pętla while(window->pollEvent(event)) nie wykonuje się ani razu.
komentarz 24 kwietnia 2017 przez szym3ns Użytkownik (860 p.)
Ale przecież przed podzieleniem programu działało normalnie, funkcja była w tej samej pętli (bo musi w niej być).
0 głosów
odpowiedź 24 kwietnia 2017 przez szym3ns Użytkownik (860 p.)
Ktoś ma jakiś pomysł?
komentarz 24 kwietnia 2017 przez Munvik Dyskutant (9,350 p.)
To właśnie były moje przeczucia. Tu coś nie gra, najlepiej zrób konstruktor ustaw tam wszystko co potrzebne i koniec
1
komentarz 24 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
No i taka porada na przyszłość.
Widziałem że ogarniasz w miarę dziedziczenie. Robiłeś klasy dziedziczące np. po sf::Drawable.

Ale np. klasa Text, mogłaby dziedziczyć po samym sf::Text.
Nie musiałbyś tworzyć w środku obiektów klasy sf::Text, nie musiałbyś pisać funkcji draw(). Pozycje, obrót itp. byłyby już gotowe. Wystarczyłoby że dodałbyś niezbędne ci funkcje i traktował obiekty tej klasy, jak obiekty klasy sf::Text.
komentarz 24 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
Aham no i StateManager, to może być klasa. Np. Singleton, albo monostate. (Poczytaj w googlach)
komentarz 24 kwietnia 2017 przez Munvik Dyskutant (9,350 p.)
StateManager to może być klasa abstrakcyjna, która ma metode czysto wirtualna draw(sf::RenderWindow &window) i update().

Potem robisz kolejną klasę menuState dziedziczysz po niej, nadpisujesz metody i voilà
komentarz 24 kwietnia 2017 przez Munvik Dyskutant (9,350 p.)
I najlepiej właśnie jak zastosujesz Singleton. Ja sobie teraz nie wyobrażam robienia gry bez użycia Singletonu.
0 głosów
odpowiedź 25 kwietnia 2017 przez szym3ns Użytkownik (860 p.)

Dzięki wszystkim za rady, ogarnąłem to już i zrozumiałem, gdzie robię problem smiley Mam jeszcze takie pytanie: kombinowałem z operatorem New tak jak mieliście okazje zobaczyć, ponieważ chciałem aby moje Menu było tworzone tylko w przypadku gdy stan aplikacji = state_menu, po zmianie stanu byłby kasowany, ale jak widzicie nie za bardzo mi to wyszło :D Nie chce już zakładać nowego tematu żeby śmiecić, ma ktoś jakiś pomysł jak można to rozwiązać?

komentarz 25 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
W klasie menu, w funkcji run() dajesz pętlę, while(state == state_menu)
komentarz 26 kwietnia 2017 przez szym3ns Użytkownik (860 p.)
Chodzi mi o to jak tworzyć je tylko gdy będzie potrzebne za pomocą operatora 'new' i potem usuwać, a wyżej nie wyszło mi to za bardzo..
komentarz 26 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
Co masz na myśli? Zostaw tak jak jest teraz, tylko że w klasie Menu w funkcji run() daj pętle while(state == state_menu)
komentarz 27 kwietnia 2017 przez szym3ns Użytkownik (860 p.)
Dokładniej chodzi mi o to, żeby Menu było tworzone tylko i wyłącznie wtedy, gdy stan aplikacji wskazuje na 'state_menu' (dynamiczna alokacja). Gdy zmieni się stan powinno zostać skasowane. Próbowałem zrobić to wcześniej, ale zamiast jednego wskaźnika tworzyło się ich multum..
komentarz 27 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
No rozumiem. Zrób w metodzie 'run' klasy 'Menu' pętle while, która się zakończy gdy zmieni się status. Czego nie rozumiesz?

Podobne pytania

–1 głos
2 odpowiedzi 499 wizyt
pytanie zadane 11 czerwca 2017 w C i C++ przez Tomek Kozioł Obywatel (1,740 p.)
0 głosów
1 odpowiedź 212 wizyt
pytanie zadane 11 lutego 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)
0 głosów
1 odpowiedź 99 wizyt
pytanie zadane 2 maja 2019 w C i C++ przez Gryczny Początkujący (320 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...