SFML 2 pytania
Ostatnio zmodyfikowano 2011-07-08 22:23
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: 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: #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: #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. |
|
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: bool wyswietl_kwadrat = false;
if( klikniesz_mysza ) wyswietl_kwadrat = true;
if( wyswietl_kwadrat ) rysuj_kwadrat();
|
|
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. |
|
kamillo121 |
» 2011-07-08 22:12:59 Okno.Clear( Color::Green );
Ten "diabeł" Ci okno czyści za każdym obiegiem, chyba jasne? |
|
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()? |
|
kamillo121 |
» 2011-07-08 22:20:17 Jak nie chcesz czyścić ekranu to po cholere ją wywoływać ? :) |
|
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. |
|
« 1 » |