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

[SFML] Wyświetlanie obiektu podczas poruszania

Object Storage Arubacloud
0 głosów
552 wizyt
pytanie zadane 16 października 2015 w C i C++ przez Linker Bywalec (2,690 p.)

Witam. Mam problem, robiąc prostą grę w sfml chciałbym aby podczas poruszania 1 obiekt był cały czas wyświetlany(chyba, że będę mu kazał się gdzie indziej narysować ;)) a on nawet nie przy każdym ruchu miga. Nie wiem co jest tego przyczyną. Kolega zaproponował mi abym spróbował z wątkami. Ale czy trzeba tutaj używać wątków? Co myślicie o tej sprawie?

4 odpowiedzi

0 głosów
odpowiedź 16 października 2015 przez criss Mędrzec (172,590 p.)
Nie bardzo wiem o co ci chodzi, ale wydaje mi sie, ze nie rozumiesz jak to działa. Najlepiej pokaż, jak u ciebie wygląda kod poruszania się.
0 głosów
odpowiedź 16 października 2015 przez furas Maniak (53,800 p.)

Bez pokazania kodu nic nie można powiedzieć.

Mogę jedynie z doświadczenia z innymi problemami wnioskować, że problem jest w zrozumieniu działania systemu. 

System polega na tym, że jest wykonywana pętla (powiedzmy 60 razy na sekundę - stąd mamy 60FPS - Frames Per Second) i za każdym razem wykonuje się takie rzeczy jak: sprawdzenie stanu klawiatury i myszy, przeliczenie pozycji obiektów a na koniec narysowanie wszystkich elementów jeszcze raz (tło, obiekty stałe, obiekty ruchome). Jeśli jakiś obiekt nie jest rysowany w każdym wykonaniu pętli to wtedy on raz jest na ekranie a raz go nie ma - więc mruga.

0 głosów
odpowiedź 16 października 2015 przez niezalogowany
Zakładam, że ten obiekt to element GUI?
komentarz 16 października 2015 przez Linker Bywalec (2,690 p.)

Obiekt typu sf::RectangleShape.

komentarz 16 października 2015 przez niezalogowany
Pytam raczej, czy ten obiekt ma pełnić funkcę interfejsu skoro ma być w miejscu, tzn jeżeli poruszasz kamerą to on zawsze ma być w tym samym rogu ekranu (np. pasek życia)?
komentarz 17 października 2015 przez Linker Bywalec (2,690 p.)
Nie. Ten obiekt nie pełni funkcji interfejsu.
komentarz 17 października 2015 przez niezalogowany
W takim razie ten obiekt ma się nie poruszać względem kamery? Podrzuć kawałek kodu odpowiedzialny za: poruszanie i rysowanie
komentarz 17 października 2015 przez Linker Bywalec (2,690 p.)
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            {
            kierunek = GORA;
            waz.wyswietl(window, owoc);
            }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            {
            kierunek = LEWO;
            waz.wyswietl(window, owoc);
            }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            {
            kierunek = PRAWO;
            waz.wyswietl(window, owoc);
            }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            {
            kierunek = DOL;
            waz.wyswietl(window, owoc);
            }
        while(kierunek == GORA)
            {
                waz.naprzod(window);
                sf::sleep(sf::seconds(0.2f));
                waz.wyswietl(window, owoc);

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                {
                    kierunek = LEWO;
                    waz.wyswietl(window, owoc);
                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                kierunek = PRAWO;
                waz.wyswietl(window, owoc);

                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                {
                kierunek = DOL;
                waz.wyswietl(window, owoc);
                }
            }

        while(kierunek == LEWO)
            {
                waz.lewo(window);
                sf::sleep(sf::seconds(0.2f));
                waz.wyswietl(window, owoc);

                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                {
                kierunek = GORA;
                waz.wyswietl(window, owoc);
                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                kierunek = PRAWO;
                waz.wyswietl(window, owoc);
                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                {
                kierunek = DOL;
                waz.wyswietl(window, owoc);
                }
                if(sf::Keyboard::isKeyPressed(Keyboard::Escape))
                    menu = true;
            }

        while(kierunek == PRAWO)
        {
            waz.prawo(window);
            sf::sleep(sf::seconds(0.2f));
            waz.wyswietl(window, owoc);
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                {
                kierunek = GORA;
                waz.wyswietl(window, owoc);
                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                {kierunek = LEWO;
                waz.wyswietl(window, owoc);
                }


            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                {
                kierunek = DOL;
                waz.wyswietl(window, owoc);
                }
                if(sf::Keyboard::isKeyPressed(Keyboard::Escape) )
                menu = true;
                break;
        }
        while(kierunek == DOL)
        {
            waz.wstecz(window);
            sf::sleep(sf::seconds(0.2f));
            waz.wyswietl(window, owoc);

                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                {
                kierunek = GORA;
                waz.wyswietl(window, owoc);
                }

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                {
                kierunek = LEWO;
                waz.wyswietl(window, owoc);
                }


            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                    kierunek = PRAWO;
                    waz.wyswietl(window, owoc);
                }


                if(sf::Keyboard::isKeyPressed(Keyboard::Escape) )
                menu = true;

        }

 

komentarz 17 października 2015 przez niezalogowany

Tragicznie napisany kod, słyszałeś o tym że zjawisko redundacji jest czymś złym? Kod mógłby być z ~4 razy krótszy i czytelniejszy.

Ten sleep powoduje ci miganie, co robi metoda wstecz(...)? Ciekawi mnie po co wysyłasz tam instację okna (to też może mieć wpływ na mruganie).

Napisz ten kod od nowa, ale tym razem bez pętli wewnątrz:

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { ... }

 

komentarz 18 października 2015 przez Linker Bywalec (2,690 p.)
Słyszałem o tym. Metoda wstecz porusza "graczem" do tyłu. Sprawdziłem metody poruszania miały metodę sf::clear() i dlatego migało ;) Muszę nauczyć się pisać czytelniejszy i przejrzysty kod. Dzięki za pomoc.
0 głosów
odpowiedź 16 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

A masz w kodzie metodę clear (sf::RenderWindow)?

komentarz 16 października 2015 przez Linker Bywalec (2,690 p.)
Nie, wiem że wtedy by mazało ;)
komentarz 16 października 2015 przez criss Mędrzec (172,590 p.)
co.
Jak nazwa sugeruje, clear() nie jest od mazania (cokolwiek to jest :D).

A w sumie to o co chodzi z tym mazaniem? XD
komentarz 16 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

@Linker Ehh... może najpierw byś się nauczył, jak wygląda pętla gry w SFML? Metoda clear czyści bufor, aby każda kolejna klatka tworzyła się na wyczyszczonym obszarze. Gdy tego nie zrobimy, to wtedy może występować efekt migotania.

komentarz 17 października 2015 przez Linker Bywalec (2,690 p.)
No właśnie jest tak, że nawet gdy jest ta metoda to nie zawsze miga więc przyjąłęm, że jeśli nic nie zmienia to można ją usunąć.
komentarz 17 października 2015 przez niezalogowany
Metoda clear() czyści wcześniej wyświetloną klatkę, co można porównać do rysowania w paincie:

metoda clear() sprawia że rysujesz po pustej ramce (masz tylko 1 kolorowe tło),

dalej: draw() sprawia że rysujesz jakieś obiekty w określonej kolejności na sobie

display() sprawa że to co narysowałeś od poprzeniego wywołania display() pojawi się w oknie

Niewywołanie clear() jest w pewnym sensie błędne, pokaż w jaki sposób rysujesz obiekty
komentarz 17 października 2015 przez Linker Bywalec (2,690 p.)
Wiem ale tutaj to nie rozwiązuje problemu jak wcześniej pisali.
komentarz 17 października 2015 przez criss Mędrzec (172,590 p.)
Pokażeszten kod wreszcie?

Podobne pytania

0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 27 marca 2017 w Inne języki przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 29 września 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
+3 głosów
0 odpowiedzi 222 wizyt

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 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!

...