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

SFML 2 pytania

Ostatnio zmodyfikowano 2011-07-08 22:23
Autor Wiadomość
Dawidsoni
Temat założony przez niniejszego użytkownika
SFML 2 pytania
» 2011-07-08 21:52:07
Mam 2 pytania odnośnie biblioteki SFML.

1. Bardzo mnie zdziwiło kilka linijek w przykładzie kursu SFML w tym serwisie:
C/C++
if( sterowanie.IsKeyDown( sf::Key::Up ) )
     naszSprajt.Move( 0, - 0.2 );

if( sterowanie.IsKeyDown( sf::Key::Down ) )
     naszSprajt.Move( 0, + 0.2 );
Zgodnie z osią y do góry, czyli Key::Up powinno się zwiększać, czyli powinno być + 0.2. Oczywiście w Key::Down powinno być wtedy   - 0.2. Skoro było odwrotnie niż zgodnie z osią y to uznałem to za błąd i w swojej aplikacji zrobiłem po swojemu. Jednak okazało się, że ten kod u góry jest poprawny i to ja popełniłem błąd. Dlaczego tak jest?

2. Bardzo się zdziwiłem, gdy okazało się, że w SFML jeśli coś ma pozostać na ekranie to musi być rysowane przy każdej klatce! Otóż chciałem napisać program, gdzie po kliknięciu lewym przyciskiem myszy narysuje się kwadrat i będzie on tam przez cały czas. Chciałem rysować mnóstwo kwadratów na ekranie. Jednak po napisaniu kodu:
C/C++
#include<SFML/Window.hpp>
#include<SFML/Graphics.hpp>
using namespace sf;

int main() {
    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() ) {
        Okno.Clear( Color::Green );
        while( Okno.GetEvent( zdarzenie ) ) {
            if( zdarzenie.Type == Event::Closed )
                 Okno.Close();
           
            if( przycisk.IsMouseButtonDown( Mouse::Left ) )
                 Okno.Draw( sprajt );
           
        }
        Okno.Display();
    }
    return 0;
}
okazało się, że prostokąt tylko miga i znika.

A więc zabrałem się za zrobienie tego co chciałem i wyszło mi coś takiego:
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.

Jak widać trochę się namęczyłem, żeby napisać coś prostego. Czy da się zapobiec temu "znikaniu" bitmap z ekranu? Czy w innych bibliotekach graficznych też po każdej klatce trzeba rysować wszystko od nowa? Proszę o wypowiedzi.
P-35582
SeaMonster131
» 2011-07-08 21:58:39
1. Lewy górny róg ekranu to jest 0,0. Czyli tutaj oś Y trzeba odwrotnie liczyć niż na osi współrzędnych :)

2. Jeżeli z każdym obiegiem pętli czyścisz ekran to nic dziwnego że tak jest ;)
Można to zrobić np tak:
C/C++
bool wyswietl_kwadrat = false;
//...

if( klikniesz_mysza )
     wyswietl_kwadrat = true;

if( wyswietl_kwadrat )
     rysuj_kwadrat();

P-35584
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-08 22:07:19
Chodzi ci o funkcję Display? Jeśli ją usuwam to nic się nie rysuje, tylko jest ciągle pusty ekran.
P-35586
kamillo121
» 2011-07-08 22:12:59
C/C++
Okno.Clear( Color::Green );

Ten "diabeł" Ci okno czyści za każdym obiegiem, chyba jasne?
P-35589
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-08 22:18:35
A nie popatrzyłem jakoś na to:D. To już wszystko wiem, tylko gdzie mam wtedy umieścić funkcję Clear()? Jak umieszczam przed pętlą to mi miga ekran. Mam zrobić coś takiego jakby: "jeśli to 1 klatka programu to wykonaj funkcję Clear()?
P-35591
kamillo121
» 2011-07-08 22:20:17
Jak nie chcesz czyścić ekranu to po cholere ją wywoływać ? :)
P-35592
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-07-08 22:23:24
Dobra:D 2 godziny snu to chyba za mało. Już nawet zapomniałem znaczenia tej funkcji i chciałem sobie nią kolorować ekran:P. Dzięki za wszystko, już rozumiem i na dziś koniec:D.
P-35593
« 1 »
  Strona 1 z 1