Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML, C++] Miganie ekranu

Ostatnio zmodyfikowano 2011-07-10 14:43
Autor Wiadomość
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-10 11:05:42
Sugerujesz, że znów rysuję w pętli komunikatów? Wklejam 2 kody poniżej i proszę o wyjaśnienie, dlaczego kod A nie mruga, a kod B mruga.
Kod A:
C/C++
#include<SFML/Window.hpp>
#include<SFML/Graphics.hpp>
using namespace sf;

int main() {
    RenderWindow Okno( VideoMode( 800, 600, 32 ), "Edytor" );
    Event zdarzenie;
    Image obraz;
    Image obraz2;
    obraz.LoadFromFile( "obraz.bmp" );
    obraz2.Create( 800, 600, Color::White );
    Sprite sprajt( obraz );
    Sprite sprajt2( obraz2 );
    const Input & przycisk = Okno.GetInput();
    while( Okno.IsOpened() ) {
        while( Okno.GetEvent( zdarzenie ) ) {
            if( zdarzenie.Type == Event::Closed )
                 Okno.Close();
           
            if( przycisk.IsMouseButtonDown( Mouse::Left ) ) {
                sprajt.SetPosition( przycisk.GetMouseX(), przycisk.GetMouseY() );
            }
        }
        if( przycisk.IsMouseButtonDown( Mouse::Left ) ) {
            sprajt.SetPosition( przycisk.GetMouseX(), przycisk.GetMouseY() );
            Okno.Draw( sprajt );
        }
        if( przycisk.IsMouseButtonDown( Mouse::Right ) ) {
            Okno.Draw( sprajt2 );
        }
       
        Okno.Display();
    }
    return 0;
}
 w tym przypadku jeśli nacisnę prawy przycisk myszy to ekran staje się biały i nie mruga.

Kod B:
C/C++
#include<SFML/Window.hpp>
#include<SFML/Graphics.hpp>
using namespace sf;

int main() {
    RenderWindow Okno( VideoMode( 800, 600, 32 ), "Edytor" );
    Event zdarzenie;
    Image obraz;
    Image obraz2;
    bool czy = false;
    obraz.LoadFromFile( "obraz.bmp" );
    obraz2.Create( 800, 600, Color::White );
    Sprite sprajt( obraz );
    Sprite sprajt2( obraz2 );
    const Input & przycisk = Okno.GetInput();
    while( Okno.IsOpened() ) {
        while( Okno.GetEvent( zdarzenie ) ) {
            if( zdarzenie.Type == Event::Closed )
                 Okno.Close();
           
            if( przycisk.IsMouseButtonDown( Mouse::Left ) ) {
                sprajt.SetPosition( przycisk.GetMouseX(), przycisk.GetMouseY() );
            }
        }
        if( przycisk.IsMouseButtonDown( Mouse::Left ) ) {
            sprajt.SetPosition( przycisk.GetMouseX(), przycisk.GetMouseY() );
            Okno.Draw( sprajt );
        }
        if( czy == false ) {
            Okno.Draw( sprajt2 );
            czy = true;
        }
       
        Okno.Display();
    }
    return 0;
   
}
Dlaczego teraz mruga?
P-35681
DejaVu
» 2011-07-10 12:40:40
http://cpp0x.pl/kursy/Kurs-SFML-C++ /Tworzenie-i-wyswietlanie-sprajtow/333

Czy ostatni kompletny kod ze wskazanego rozdziału Ci mruga?

/edit:
http://www.sfml-dev.org/forum/viewtopic.php?t=225&sid=e2e62cad6b59beaf08b1c57d4f9d335d

W powyższym temacie sugerują jeszcze włączenie synchronizacji pionowej, czyli:
C/C++
oknoAplikacji.UseVerticalSync( true );
P-35690
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-10 13:31:55
1. Nie mruga mi, ale to dlatego, bo tam EKRAN JEST CZYSZCZONY CO KLATKĘ. Ja nie mogę zastosować takiego rozwiązania, bo wtedy moje poprzednie rysunki będą zmazywane. Muszę na samym początku wyczyścić ekran na biało lub narysować białego Sprita na ekranie.
2. Niestety ta funkcja nic nie daje.
P-35708
DejaVu
» 2011-07-10 14:33:58
Zawsze się tak scenę tworzy w grach. Jeżeli chcesz by obiekt był wyświetlany co klatkę to go renderujesz co klatkę. Da się oczywiście zrobić grę inaczej, czyli bez czyszczenia ekranu co klatkę ale ręczę Ci i gwarantuję, że zajeździsz się na śmierć z taką koncepcją tworzenia aplikacji - co więcej będziesz walczył co i rusz z wiatrakami. Odradzam Ci taki sposób wytwarzania aplikacji - kilka lat temu próbowałem tak tworzyć kod (jeszcze za czasów Turbo Pascala) i nic dobrego z tego nie wynikło.
P-35712
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-10 14:41:02
Aha, bo w ostatnim moim temacie pytałem, co zrobić, żeby ekran się nie czyścił i wszystko zostawało na nim. Użytkownicy powiedzieli, że mam wywalić funkcję Clear() to myślałem, że tak się robi. Czyli zrobić to w taki sposób? :
C/C++
#include<SFML/Window.hpp>
#include<SFML/Graphics.hpp>
using namespace sf;

int main() {
    int x[ 100 ];
    int y[ 100 ];
    int i = 0;
    RenderWindow Okno( VideoMode( 800, 600, 32 ), "Nazwa" );
    Event zdarzenie;
    Image obraz;
    const Input & przycisk = Okno.GetInput();
    obraz.LoadFromFile( "obraz.bmp" );
    Sprite sprajt( obraz );
    while( Okno.IsOpened() ) {
       
        while( Okno.GetEvent( zdarzenie ) ) {
            if( zdarzenie.Type == Event::Closed )
                 Okno.Close();
           
            if( przycisk.IsMouseButtonDown( Mouse::Left ) ) {
                x[ i ] = przycisk.GetMouseX();
                y[ i ] = przycisk.GetMouseY();
                i++;
            }
           
        }
        Okno.Clear( Color::Green );
        for( int licznik = 0; licznik < i; licznik++ ) {
            sprajt.SetPosition( x[ licznik ], y[ licznik ] );
            Okno.Draw( sprajt );
        }
        Okno.Display();
    }
    return 0;
}
OCZYWIŚCIE GDYBYM CHCIAŁ TEN KOD NAPISAĆ LEPIEJ TO NIE UŻYŁBYM TABLICY, BO SĄ NA TO DUŻE LEPRZE SPOSOBY. JEDNAK MIAŁEM MAŁO CZASU.
P-35717
DejaVu
» 2011-07-10 14:43:37
Nie wiem co chcesz osiągnąć no ale w skrócie:
1. czyścisz ekran
2. rysujesz obiekty, które mają być wyświetlone na scenie w danej klatce
3. wyświetlasz wszystko przy pomocy metody Display.
P-35719
1 « 2 »
Poprzednia strona Strona 2 z 2