Feeds:
Wpisy
Komentarze

Posts Tagged ‘kurs SFML’

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 »

Zainteresowałem się ostatnio biblioteką SFML. Jest to dość prosta w obsłudze biblioteka do obsługi grafiki, dźwięku,sieci… Jest dostępna zarówno na Windowsa, jak i na Linuksa oraz MAC OS X. Stanowi według mnie niezłą konkurencję dla SDL czy Allegro 🙂

Postanowiłem zacząć opisywać co jakiś czas podstawy tej biblioteki. Jak się może łatwo domyślić, na stronie projektu dostępne są tutoriale po angielsku, ale nie każdy musi umieć/chcieć czytać w tym języku. Wśród programistów to raczej powinna występować ta dru… Tfu, co ja plotę – programista gier powinien umieć i chcieć czytać po angielsku 🙂 Ale do rzeczy – będę się mocno wzorował tutorialami ze strony SFML’a, ale postaram się także dorzucać jakieś refleksje od siebie :p

Zaczynajmy więc!

Jako, że każdy szanujący się programista powinien sobie poradzić z odpowiednią konfiguracją swego ulubionego IDE do pracy z SFML, pozwolę sobie ominąć ten jakże nudny z mojego punktu widzenia fragment zabawy ze wszystkimi bibliotekami i przejdę od razu do konkretów – czyli utworzenia pierwszego okienka!

Najpierw musimy dołączyć jeden z nagłówków biblioteki SFML, odpowiadający za utworzenie i obsługę okienka.

#include <SFML/Window.hpp>

Następnie, jak się pewnie już wszyscy domyślili, musimy napisać swoją funkcję main() <- jeżeli czytasz ten artykuł, to zakładam, że wiesz co to jest 😀

int main()
{
return 0;
}

Oczywiście, może to też być funkcja WinMain() jeżeli piszemy pod Windowsa, ale SFML pisze czasem po stderr, więc wygodnie mieć konsolkę 😀
Przykładowe programiki będą zazwyczaj na tyle krótkie i proste, że opakowywanie tego wszystkiego we własne klasy byłoby już znacznym przegięciem.
Moment, w którym napiszemy kod wyświetlający okienko jest coraz bliżej. A właściwie to już nadszedł.

sf::Window app(sf::VideoMode(800, 600, 32), "SFML Window");

Co tutaj robimy? Otóż tworzymy sobie zmienną typu sf::Window. Nazywa się ona app. Konstruktor przyjmuje kilka parametrów, kolejno:
-zmienną typu sf::VideoMode, której kolejne parametry to szerokość, wysokość i ilość bitów na piksel
-tytuł okienka
-opcjonalnie może przyjmować także dodatkowe parametry do ustawienia stylu okienka i innych bardziej zaawansowanych aspektów naszego okienka – na razie nie będziemy się tym przejmować, a chętni mogą poczytać sobie o tych parametrach w dokumentacji, choć o stylach trochę zaraz wspomnę.
Przy okazji od razu widać, że wszystkie funkcje i obiekty SFML znajdują się w przestrzeni nazw sf.

No więc, miałem coś wspomnieć o stylach okienka – otóż możemy podać jako ten parametr kombinację flag sf::Style:

None, Titlebar, Fullscreen, Resize, Close. Domyślny styl to Resize|Close

Pozwolę sobie chwilowo pominąć fullscreen w SFML, gdyż programy podczas uczenia się biblioteki będzie i tak dość wygodnie testować w okienku. Prawdopodobnie jednak kiedyś o tej możliwości napiszę.

Idziemy dalej. Mamy już okienko, ale program zamyka się od razu po uruchomieniu – czy zrobiliśmy błąd, a może kompilator jest popsuty i źle kompiluje program? Albo to jakiś BUG w bibliotece SFML? Otóż nie! Potrzebujemy tak zwanej pętli głównej programu. Czyli, krótko mówiąc, potrzebujemy pętli, w której będziemy co chwila uaktualniać stan okienka, wczytywać dane od użytkownika, albo wykonywać inne czynności związane z aktualnym stanem gry (tudzież innej aplikacji).

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

Co się dzieje? okienko się pojawia, ale po zamknięciu go krzyżykiem program nadal działa. A właściwie to nawet okienko się nie zamyka.  Czy to jakiś bug w bibliotece? Jak się zapewne domyślasz – nie 🙂 Ale do rozwiązania tego problemu potrzebna jest znajomość tak zwanych eventów – ale to dopiero w następnej części artykułu 😉

Read Full Post »