Slick

W jednym z poprzednich postów napisałem, że Slick udostępnia biblioteki natywne tylko dla Windowsa. Otóż dzisiaj przyjrzałem się temu dokładniej i okazało się, że po prostu Windowsowe nativy są w głównym katalogu natomiast pozostałe są popakowane w archiwa JAR i wrzucone do katalogu lib. Wcześniej ich po prostu nie zauważyłem.

W związku z poczynionym odkryciem uruchomiłem netbeansa na nowo zainstalowanym OpenSUSE i rozpocząłem poszukiwanie tutoriali w internecie. Tutaj niestety nie jest tak fajnie jak w GTGE. Dostępne są głównie przykładowe kody źródłowe. Udało mi się jednak znaleźć jeden tutorial ( http://thejavablog.wordpress.com/2008/06/08/using-slick-2d-to-write-a-game/ ), który pozwala załapać jak to mniejwięcej wygląda.

Prawdę mówiąc sam szkielet jest prawie taki sam jak to było w przypadku GTGE. Mamy metody init, update, render, których znaczenia i funkcji raczej nie trzeba tłumaczyć 😉

Slick jest pierwszym silnikiem 2D w Javie, w którym odkryłem możliwość dowolnego obracania obrazków. Dodatkowo przeglądając API zauważyłem, że posiada różne algorytmy wyszukiwania trasy, silnik cząsteczkowy (wraz z edytorem) oraz wsparcie dla tile-map rysowanych w programie Tiled.

Myślę że spędzę na tym silniku kilka ładnych godzin ponieważ zamierzam wziąć udział w tegorocznym WSOC! To chyba będzie pierwsza praca na WSOC napisana w Javie 😉

Reklamy

Przekształcenia wierzchołków w 2D

Postanowiłem nieco przebudować wyświetlanie grafiki w AGE. Do tej pory wszystko wyświetlane było za pomocą D3DXSprite… Ma to swoje zalety (prostota użycia), ale ma też wady. Ciężko tego używać chcąc jednocześnie wyświetlać osobno linie i inne takie.

Stwierdziłem, że przejdę na „niższy” poziom i wykorzystam do tego celu bufory wierzchołków. To mi da trochę więcej możliwości. Jedynym powodem, dla którego wcześniej nie zastosowałem tego rozwiązania było to, że napisałem już interfejs dla klasy ageSprite, a więc były pewne wymagania związane z użytkowaniem. Prawdę mówiąc pomysł przejścia na Vertex Buffery zabiło głównie to, że nie miałem ochoty kombinować z przekształceniami, a wykorzystywanie do tego wszystkiego D3DXMatrix i mnożenie ich za każdym razem, a później wymnażanie jeszcze wierzchołków przez iloczyn tych macierzy to prawie morderstwo obliczeniowe dla procesora 😉 Masa niepotrzebnych operacji.

Z tego względu rozpisałem sobie jak powinny wyglądać przekształcenia dla kolejnych wierzchołków biorąc pod uwagę, że chce określić sobie hotspot dla obrazka czyli środek obrotu i rotacji. Można próbować nazwać to środkiem obrazka, ale takim nie do końca 😉 Kolejność tych przekształceń wygląda tak:

  1. Przesunięcie wierzchołka o wektor [-hx, -hy] (hx, hy – współrzędne hotspot)
  2. Rotacja i skalowanie
  3. Przesunięcie wierzchołka o wektor [tx, ty] (tx, ty – współrzędne obrazka na ekranie)

Aby łatwiej było zrozumieć o co chodzi stworzyłem sobie taki prosty rysuneczek prezentujący te wszystkie współrzędne w zrozumiały sposób (mam nadzieję):

Postanowiłem połączyć pożyteczne z pożytecznym (to nie błąd) i ręcznie wymnożyć sobie te wszystkie macierze przekształceń a na końcu pomnożyć współrzędne hipotetycznego wierzchołka przez tak otrzymaną macierz. Dzięki temu zyskałem 2 rzeczy. Poćwiczyłem sobie mnożenie macierzy, co warto było zrobić oraz otrzymałem konkretne wzory na współrzędne punktu do którego zastosowane są te wszystkie przekształcenia za jednym zamachem.

Jednym słowem odwaliłem trochę roboty za komputer, ale za to powinienem zyskać trochę na czasie używając tych wzorków. Jeśli ktoś jest ciekaw jak one wyglądają dam je tutaj wraz z opisem wszystkich znaczków 🙂

x’ = s( sin A * (hy-y) + cos A * (x-hx) ) + tx
y’ = s( sin A * (x-hx) + cos A * (y-hy) ) + ty

x, y – współrzędne wierzchołka przed przekształceniami
x’, y’ – nowe współrzędne wierzchołka po przekształceniach
A – kąt obrotu ( sin A i cos A to odpowiednio sinus i cosinus kąta A )
hx, hy – współrzędne hotspot
tx, ty – współrzędne obrazka na ekranie (konkretniej to są to globalne współrzędne dla hx i hy co widać na obrazku wyżej )