Feeds:
Wpisy
Komentarze

Posts Tagged ‘zdarzenia’

Obiecałem ostatnio, że opiszę eventy w SFML. A więc – zaczynamy!

Eventy można podzielić na pewne grupy, dla których struktura Event będzie zawierała określone dane.

Zdarzenie zmiany rozmiaru okna

event.Type=sf::Event::Resized;
event.Size.Width=szerokość w pikselach;
event.Size.Height=wysokość w pikselach;

Zdarzenie wpisania znaku

event.type=sf::Event::TextEntered;
event.Text.Unicode=znak w UTF-32;

Zdarzenia klawiatury

event.type=sf::Event::KeyPressed lub sf::Event::KeyReleased;
event.Key.Code=kod klawisza;
event.Key.Alt=czy alt jest_wciśnięty;
event.Key.Shift=czy shift jest wciśnięty;
event.Key.Control=czy Ctrl jest wciśnięty

Zdarzenia klawisza myszki

event.Type=sf::Event::KeyPressed lub sf::Event::KeyReleased;
event.MouseButton.Button=którego przycisku zdarzenie dotyczy

Zdarzenia przesunięcia kursora myszki

event.Type=sf::Event::MouseMoved;
event.MouseMove.X=współrzędna X kursora;
event.MouseMove.Y=współrzędna Y kursora;

Zdarzenie kółka myszki

event.Type=sf::Event::MouseWheelMoved;
event.MouseWheel.Delta=przesunięcie rolki myszki;

Myślę, że na początek powinno tyle wystarczyć 🙂

Read Full Post »

Kto czytał mój poprzedni wpis zapewne pamięta także, że na jego końcu wspomniałem, że aby ruszyć dalej (tzn. zamknąć okienko) musimy poznać tak zwane eventy.

Co to jest event? Tłumacząc ten wyraz na polski zapewne będzie on oznaczać „zdarzenie”. Co może być zdarzeniem? Właściwie to wiele rzeczy, na przykład kliknięcie myszką, przesunięcie kursora nad okienkiem, naciśnięcie jakiegoś klawisza, czy wreszcie naciśnięcie „krzyżyka” zamykającego okno. Wszystkie typy komunikatów w SFML (przynajmniej w wersji 1.6) opiszę za chwilę. Najpierw zaprezentuję w jaki sposób można ten mechanizm wykorzystać w aplikacji.

Pamiętacie pętlę główną programu z poprzedniej części naszego „tutoriala”? Wyglądała ona tak:

while(true)
{
app.Display();
}

I teraz pojawia się pytanie: co zrobić, aby ta pętla kiedyś się skończyła? Odpowiedź jest oczywista – można użyć w pewnym miejscu pętli instrukcji break, albo po prostu zmienić warunek wykonywania tejże pętli. Ja wolę tę drugą opcję i jej tutaj użyję.

No ale zaraz – zapytasz zapewne jaki powinien być ten warunek zakończenia. Już śpieszę z odpowiedzią. Mianowicie dobrym momentem na zatrzymanie naszej pętli głównej jest moment zamknięcia okienka. Możemy sprawdzić, czy okienko jest aktualnie otwarte, wywołując metodę IsOpened() naszego okna (czyli ‚app’). Oczywiście, jeżeli ktoś chce, to może ustalić jakiś inny warunek zakończenia 🙂

„No dobra – powiesz – wiemy już jak sprawdzić, czy okienko jest otwarte. No ale kiedy je zamknąć?”
No cóż, w sumie to okienko można zamknąć w dowolnej chwili wywołując mu metodę Close(). Fajnie jest  jednak, kiedy istnieje możliwość zamknięcia okna po naciśnięciu „krzyżyka”. Ale żeby to zrobić potrzebna jest informacja, że ktoś tenże przycisk wcisnął. Jak ją uzyskać? Poprzez obsłużenie odpowiedniego eventu 🙂

Teraz już się nie wymigam i muszę wyjaśnić w jaki sposób obsługuje się eventy w SFML 🙂 Otóż jest to zadanie bardzo proste.Potrzebujemy zmiennej typu sf::Event. Za pomocą metody GetEvent() możemy pobrać kolejne zdarzenia z kolejki. Może się w niej znajdować więcej niż jedno zdarzenie, toteż powinniśmy w jakiejś pętli obsłużyć je wszystkie przy każdym obiegu pętli głównej. Przydatną informacją jest fakt, że metoda GetEvent() zwraca true jeżeli zostanie pobrane jakieś zdarzenie do obsłużenia i false w przeciwnym wypadku. Niepobranie komunikatu świadczy oczywiście o tym, że można powrócić do wykonywania dalszych instrukcji w pętli głównej programu 🙂

while(app.IsOpened())
{
sf::Event event;
while(app.GetEvent(Event))
{
if(event.Type==sf::Event::Closed)
{
app.Close();
break;
}
}
app.Display();
}

Powyższy kod jest pętlą główną programu. Pobieramy w każdym przebiegu pętli głównej wszystkie eventy. Jeżeli trafimy po drodze na zdarzenie naciśnięcia „krzyżyka” do zamykania okienka, to zamykamy nasze okno wywołując mu metodę Close().
Widać tutaj, że korzystamy z pola Type naszego eventu. Poniżej przedstawiam listę możliwych wartości tegoż pola i krótki opis danego typu zdarzenia.

W następnej części postaram się przedstawić krótko możliwe typy eventów w SFML.

Read Full Post »