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
[SFML, C++] Miganie ekranu
» 2011-07-09 18:55:56
Dlaczego, kiedy rysuję na ekranie prostokąty to migają one? Poniżej kod:
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;
    obraz.LoadFromFile( "obraz.bmp" );
    Sprite sprajt( obraz );
    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() );
                Okno.Draw( sprajt );
            }
        }
        Okno.Display();
    }
   
    return 0;
}
P-35641
skovv
» 2011-07-09 19:28:55
Może podwójne bufowanie?
P-35649
Nevervell
» 2011-07-09 19:31:09
A może następny rozdział??? Już na samym początku jest napisane dlaczego się tak dzieje.
P-35652
DejaVu
» 2011-07-09 19:42:14
Czemu robisz rysowanie w pętli przetwarzania komunikatów?
P-35653
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-09 21:04:30
Dobra. Rozumiem, że nie można nic rysować w pętli komunikatów, bo wtedy ekran miga. Zmieniłem to tak:
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;
    obraz.LoadFromFile( "obraz.bmp" );
    Sprite sprajt( obraz );
    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 );
        }
        Okno.Display();
    }
    return 0;
}
i działa.

A gdybym chciał, żeby raz na samym początku sprawić, że tło będzie białe? Próbowałem czyścić ekran na biało w tym samym miejscu, co rysowałem tego sprajta. Program jednak miga. Jeśli zrobię tak:
C/C++
if( przycisk.IsMouseButtonDown( Mouse::Right ) )
     Okno.Clear( Color::White );
to działa, a chcę, żeby okno zrobiło się białe na samym początku, więc piszę:
C/C++
bool czy = false;
.....
.....
.....
while( Okno.IsOpened() ) {
    .....
    .....
    .....
    if( czy == false ) {
        czy = true;
        Okno.Clear( Color::White );
    }
    Okno.Display();
}
i znów miga. Dlaczego?
P-35665
SeaMonster131
» 2011-07-09 22:17:02
To może spróbuj wyczyścić ekran na biało przed pętlą?
P-35666
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-09 22:26:10
Pròbowałem, ale też migało. A może macie jakiś inny sprawdzony sposób na to, żeby nie migało w tym przypadku?
P-35667
DejaVu
» 2011-07-10 04:25:45
Będzie ekran migał z prostego powodu - komunikaty nie przychodzą za każdym obiegiem pętli - przychodzą tylko i wyłącznie gdy się pojawią. Równie dobrze żaden komunikat może nie przyjść przez kilka minut jeżeli użytkownik nie będzie podejmował żadnej interakcji, a pętla renderująca wykona się w tym czasie tysiące razy. Jak się pisze kod źle to i będzie on źle działał - pisz poprawnie kod to ekran nie będzie mrugał?
P-35675
« 1 » 2
  Strona 1 z 2 Następna strona