SFML - działanie pętli głównej

0

Witam. Od pewnego czasu piszę grę w C++ z użyciem SFML 2.4, ale właśnie naszły mnie pewne wątpliwości. Utworzyłem klasę Game, w której umieściłem metody takie, jak "ekran powitalny", "wybierz klasę postaci", "stwórz gracza" (tu ustala się statystyki), "walka", itp. Moje wątpliwości związane są z wyświetlaniem. Zgodnie z tym, co stworzyłem, pętla główna:

while(window.isOpen()...window.display())

wykona swoje przejście tylko raz. Tak więc - jak mają zostać wykonane wszystkie ekrany, animacje, itd.? Nawet napisałem prosty program, który ma wyświetlać dwa napisy jeden po drugim (pierwszy napis, draw, sleep, clear i drugi napis) - na ekranie pojawia się tylko drugi napis.

1

Nie możesz robić sleep w pętli gry. Takie rzeczy się robi z timerem, którym liczysz czas. Dodatkowo możesz użyć enuma i zrobisz sobie maszynę stanu. Sleep blokuje działanie programu, co w aplikacjach okienkowych sprawia, że program nie odpowiada...

Na razie możesz spróbować przed sleepem dodać window.display();, bo pewnie masz to na końcu pętli i przez sleep, pętla do tego dochodzi dopiero przy drugim napisie.

Tylko nie traktuj tego jak ostateczne rozwiązanie.

0

Tutaj jest to w skrócie opisane – SFML with C++ Tutorial Series–Windows, Game loops and Timers.

Sleep możesz użyć co najwyżej w grze konsolowej. ;)

0

@Spine: Dzięki. Zaczynam łapać, co się dzieje w pętli głównej. Wciąż jednak mam wątpliwości co do mojej gry. Jeśli dobrze rozumiem, będę musiał do każdej funkcji wrzucić window.clear() oraz window.display (z pętlą lub bez)? Niestety, zorientowałem się, że coś jest nie tak dopiero po napisaniu prawie 700 linii kodu :D

@furious programming: Co do tego sleep() - pozwoliłem sobie na taką prowizorkę jedynie na potrzeby programu, który i tak robi u mnie za poligon doświadczalny (tzn. jeśli nie jestem czegoś pewien, wrzucam to tam i sprawdzam, jak działa).

0

Jeśli do funkcji/klasy wsadzisz pętlę, to ona przejmuje kontrolę nad aplikacją... Co by było jakbyś na raz chciał kontrolować/pokazywać postać i wyświetlać napisy na środku ekranu? Jeśli każda akcja ma pętle, czy sleepy, to jedna akcja zapobiega wykonaniu drugiej akcji.

0

@kst142: hmm… niby ten sf::sleep jest zalecany do tego celu.

Jednak jeśli korzysta z systemowego zegara niskiej rozdzielczości, to jest bardzo niedokładny i lepiej nie opierać na nim głównej pętli. A skoro nie zabiera mocy CPU, to wszystko na to wskazuje.

0

Ogólnie mój zamysł byłby taki: pętle wrzuciłbym do kreatora postaci (tam, gdzie się ustawia statystyki - wtedy przejście dalej byłoby poprzez odpowiedni klawisz) oraz do walki - wszelkie rysowanie postaci, hp, itp. odbywałoby się w tej pętli walki. Opuszczenie pętli związane byłoby ze śmiercią gracza lub przeciwnika.

Jeśli dobrze rozumiem: jedno wywołanie window.display() równe jest jednej klatce?

1 użytkowników online, w tym zalogowanych: 0, gości: 1