sty 19 2012

Uczę się Flasha

Rozpocząłem niedawno naukę technologii Adobe Flash i języka Actionscript 3. Pozawala ona w prosty i wygodny sposób tworzyć gry które można wstawiać bezpośrednio na stronę WWW. Takie gry o wiele łatwiej potem rozprowadzać i może nawet wydać, z racji tego, że istnieje wiele portali trzymających u siebie tego typu gry (Armor Games, Kongregate …). Gry flash zwykle są także zazwyczaj znacznie prostsze, ich mechanika ogranicza się często do przestawiania kolorowych klocków, MMOGRPG raczej nikt w tym nie pisze.

Używam darmowego IDE o nazwie FlashDevelop i frameworka Flex SDK. Spodobał mi się także gotowy silnik AS3 o nazwie Flixel. Upraszcza on wiele czynności które często się w kodzie powtarzają.

Zarejestrowałem się także na portalu Kongregate na którym można za darmo udostępniać gry. Na razie  nic tam jeszcze nie dodałem ale pracuję właśnie nad banalną grą testową podczas pisania której opanowuję AS3. Mój profil na Kongregate dodaję do Social Bara na blogu.

sty 07 2012

Oświetlanie sceny 2D w OpenGL

Ostatnio sporo czasu spędziłem szukając w internecie metod oświetlania sceny top-down 2D w OpenGL. Znalazłem wiele poradników i metod. Niestety część z nich okazała się albo bardzo przestarzała i wolna, albo trudna w implementacji. Na szczęście na forum serwisu warsztat.gd, użytkownik Adam27 podsunął mi dobry i szybki sposób na wykonanie takiego algorytmu. Wszystko opiera się na bardzo prostej matematyce.

Założenia:

Mamy dostępną kartę graficzną wspierającą rozszerzenie GL_EXT_framebuffer_object i shadery GLSL w wersji 1.1. Mamy gotową do wyrenderowania mapę otoczenia i współrzędne wierzchołków wszystkich przeszkód na owej mapie (ja zrealizowałem algorytm jedynie dla przeszkód w kształcie quadów lecz myślę, że implementacja dla innych figur będzie równie prosta). Musimy stworzyć także teksturę światła (polecam GIMPA i efekt flary).

Przepis:

  • Tworzymy dwa FBO, pierwszy to shadow mapa a drugi environment mapa.
  • Ustawiamy jako render target pierwszy FBO i wypełniamy go kolorem ciemnogranatowym
  • Renderujemy do niego wcześniej przygotowaną teksturę światła w żądanym miejscu.
  •  Tam gdzie znajdują się przeszkody rysujemy quady wypełnione kolorem tła aby światło nie przenikało przez przeszkody.
  • Dla każdej przeszkody:
    • Wyznaczamy dwa wektory od źródła światła do dwóch wierzchołków które mają rzucać cień (patrz – film na dole wpisu)
    • Przedłużamy te wektory 4-krotnie.
    • Wyznaczamy współrzędne końców wektorów (po przedłużeniu)
    • Rysujemy quada zaczynającego się na wierzchołkach przeszkody które rzucają cień i kończącego na wyznaczonych wcześniej końcach wektora. Quada wypełniamy kolorem tła, tak aby światło nie przenikało na drugą stronę przeszkody.
    • Rysujemy jeszcze raz takiego samego quada, tyle, że tym razem wypełniamy go kolorem czarnym o niskim współczynniku alpha (można nawet zrobić gradient).
  • Przełączamy render target na drugi framebuffer i rysujemy do niego mapę otoczenia.
  • Wrzucamy wszystko do shadera i mieszamy kolory obu FBO.
  • Wyświetlamy na fullscreenie wszystko co zwrócił nam shader.

Metoda wydaje się być dziecinnie łatwa w realizacji. Udało mi się zaimplementować ją w C++. Oto końcowy efekt działania algorytmu:

gru 13 2011

OOP i inne fetysze

Im bardziej człowiek zagłębia się w programowanie tym częściej czyta komentarze na temat tak zwanych standardów programowania. Jednym z nich jest OOP, czyli akronim od object-oriented programming  (programowanie zorientowane na obiekty).  Jest to ogólnie mówiąc zbiór reguł jak należy pisać swój kod aby był on jak najbardziej uniwersalny i działał jak najlepiej. Do tych reguł należy między innymi zasada, że raz napisana klasa powinna być zaprojektowana tak, aby bez zmian w jej kodzie można było ją przenieść do zupełnie innego projektu bez przenoszenia do niego innych zależności. Mądre prawda? Otóż, moim zdaniem – tylko do pewnego stopnia. W niektórych przypadkach ta zasada jest w 100% słuszna, są jednak przypadki gdy takie napisanie klasy jest po prostu niemożliwe. Jako przykład podam klasę Renderera z mojego frameworka. Zawiera ona w sobie pointery na między innymi takie klasy jak ParticleManager, GUIManager czy SpriteBatch i bez tych klas sam Renderer nie miały w ogóle racji bytu! Ponadto każda z tych klas korzysta z loggera który… o zgrozo… jest singletonem.
I tutaj dochodzę do właściwej treści tego wpisu.

Moim celem nie jest krytykowanie zasad OOP, które notabene skonstruowali ludzie kilkakrotnie razy bardziej ode mnie kumaci. Chcę jedynie zwrócić uwagę co niektórych na to, że OOP to jedynie zasady do których można i warto się stosować  jeśli jest taka możliwość. Nie powinny one jednak zaciemnić nam naszego własnego kodu! Moim zdaniem priorytetem przy projektowaniu kodu jest jego czytelność dla nas samych (i jeśli pracujemy w zespole – dla reszty programistów). Nie powinniśmy sztucznie angażować OOP w nasz kod tam gdzie nie ma takiej potrzeby.

lis 20 2011

Skyrim!

Skyrim logoW końcu naszła mnie ochotę by zakupić sobie i sprawdzić najnowszą część serii The Elder Scrolls, oznaczoną numerkiem 5. Cóż, co by tu dużo nie mówić, gra po prostu mnie zachwyciła. Oprócz charakterystycznego dla serii ogromnego i rozbudowanego świata gry, ogromu questów i bohaterów niezależnych tytuł ten oferuje zupełnie nowy dynamiczny system walki i czarów, a także wspaniałą grafikę i cudny soundtrack.

Jedną z rzeczy która najbardziej mi się w tej grze podoba jest, jak to okreslił ROJO – „Wywalenie całego drewna z tej serii”. Zgadzam się z tym w 100%. W przeciwieństwie do sztucznych i sztywnych animacji z Obliviona, ta część wygląda bardzo dynamicznie i ładnie. Twórcy zadbali o najmniejsze szczegół. Nawet gdy rzucimy czar ognia na trawę, ta na chwilę się zapala.

Kolejną rzeczą która mnie zachwyciła jest.. miodny soundtrack. W ostatnich latach nie grałem w grę z lepiej wykonanym soundtrackiem. Zresztą, zobaczcie sami.

Podsumowując, naprawdę polecam grę. Całość jest świetnie wykonana i wygląda pięknie. Zapewni na pewno wiele godzin świetnej rozrywki. A wszystko za jedyne 105 zł na Steamie :)

paź 28 2011

World of Warcraft: Mists of Pandaria

Z początku stwierdziłem, że nie ma sensu opisywać tu tego dodatku, ale skoro Xion opisał, to ja też coś naskrobię.

Mists of PandarianNa ostatnim BlizzConie byliśmy świadkami prezentacji nowego dodatku do gry World of Warcraft o nazwie Mists of Pandaria. Do gry zostaną dodane między innymi walki zwierząt podczas których będziemy mogli kierować ruchami naszego pupila, nowa klasa – Mnich (wojownik walczący wręcz, zamiast many używający… o zgrozo… energii Ki) oraz nowa rasa – wojowniczy… miś panda (i to nie jest dowcip). Pandarianie (bo tak Blizzard nazwał nową rasę) byli ludem który od wieków ukrywał się przed cywilizacją (k*rwa, znowu ten sam pomysł?). Któregoś dnia z jakiś błahych powodów postanowili wyjść do cywilizacji i walczyć stylem Kung-Fu. Misie są z natury neutralne, dzięki czemu mogą się dołączyć do dowolnie wybranej frakcji. Uwielbiają także jeść, dzięki czemu zyskują premię do bonusów od jedzenia, a także +15 do Cooking Skills.

Cóż, mocno zawiodłem się na mojej ulubionej firmie. Coraz częściej odnoszę wrażenie, że pracuje tam stado pojeb.. szalonych Azjatów, którzy stylizują najlepszego światowego MMORPG na Pokemony/Anime czy inne chińskie bajki. A może chszczyzna to taki nowy trend w dziedzinie gier komputerowych?

Mists of Pandaria będzie także pierwszym dodatkiem do WoWa, którego obiecałem sobie NIE KUPOWAĆ. Jako wieloletni fan Blizzarda, jestem BARDZO zawiedziony. Teraz pozostaje tylko trzymać kciuki za Diablo 3.

paź 07 2011

Git!

github Zarejestrowałem niedawno konto w serwisie github.com umożliwiającym darmowe dzielenie się swoimi projektami open-source z szerszą publicznością. Kody źródłowe wszystkich projektów open-source które będę od tej pory tworzył będą udostępnione właśnie tam. Na razie jest tam tylko zalążek mojego nowego pomysłu, nazwanego McHttpPanel, który umożliwia zdalne administrowanie serwerem gry Minecraft z poziomu przeglądarki internetowej. Więcej szczegółów podam w następnych wpisach.

Link do mojego profilu: https://github.com/dynax

sie 13 2011

Grofilmy

Stałem się niedawno szczęśliwym posiadaczem gry Wiedźmin 2, która zgodnie z tym co mówią media okazuje się być doskonała zarówno pod względem fabularnym, jak i pod względem zwykłego hack & slashowego mordobicia. Jednak nie o konkretnej grze chciałem tu wspomnieć lecz bardziej ogólnie, o współczesnym rynku gier. Kiedy 10 lat temu odpaliłem pierwszy raz Captain Claw, ścieżka fabularna ograniczała się do minumum. Wystarczyło włożyć płytę, opcjonalnie obejrzeć cutscenkę w rozdzielczości 640×480 i już dostawaliśmy do ręki broń i mogliśmy cieszyć się rozwalanie całych hord przeciwników. Niestety (a może stety?) w ostatnim czasie na rynku gier coś się zepsuło. Żeby w ogóle rozpocząć większość współczesnych gier RPG, trzeba obejrzeć 20 różnych cutscenek i przeprowadzić 20 dialogów. Może po 10. gra się zlituje i da nam na chwile miecz do ręki abyśmy (kierowani wskazówkami komputera) mogli zabić jednego przeciwnika.

Nie wiem czy to dobrze, czy źle. Po prostu coś się w grach zmieniło. Niektórzy powiedzą, że to dobrze, że twórcy stawiają na rozwój fabuły i wczucie się w naszego bohatera. Inni stwierdzą, że dzisiejszym grom czegoś brakuje, za dużo w nich myślenia i zmagania się z fabułą. Ja osobiście lubię sobie od czasu do czasu pograć w RPG, gdzie większość gry to wybieranie okienek dialogowych i oglądanie cutscenek. Lecz lubię sobie czasem odskoczyć do gier, gdzie bez większego zastanawiania się możemy przebijać się przez tony przeciwników nawalając 2 klawisze (Diablo 2 ;) ).

MB1 MB2
lip 23 2011

Problemy ze stroną

Od kilku dni mam spore problemy ze stroną. Działa baaardzo wolno, a zanim załaduje się jakakolwiek podstrona można iść do kuchni i zaparzyć herbatę. Jest to niestety wina dostawcy hostingu (boo.pl). Od czasu kiedy firma została wykupiona przez Telico poziom usług spadł na dno. Będę musiał rozważyć zmianę hosta na coś bardziej stabilnego i godnego zaufania.

cze 16 2011

Python

Jakiś czas temu, pisząc w języku C++ pewną grę zdałem sobie sprawę, że jest on strasznie niewygodny. Często jeden, długi kod musiałem wpisywać setki razy, program wywalał się przy małych błędach nie mówiąc sam z siebie nic o przyczynie a składnia nie miała żadnych uproszczeń. Denerwował mnie brak takich konstrukcji jak pętla foreach, wyrażenia lambda czy lekka kontrola typów. Zacząłem szukać jakiegoś języka który pozwoliłby mi pisać kod w o wiele prostszy sposób, omijając na przykład iterację po tablicach niewygodną i długą pętlą for. Na szczęście znalazłem Pythona.

 

Python, jest to prosty, interpretowany język programowania. Składnia jest o wiele prostsza, zamiast bloków kodu zamykanych nawiasami klamrowymi używamy tutaj wcięć (tabulatorów). Mamy dostępną lekką kontrolę typów, pętle forach, lambda, zmienną liczbę argumentów funkcji i mnóstwo innego lukru składniowego. Mimo tego, że język jest interpretowany, możemy użyć szeregu narzędzi które zamienią skrypt pythona w gotową aplikację .exe. Poza tym, do każdego pola i metody klasy możemy się dobrać funkcją specjalną __getattr__
która przyjmuję nazwę pola/metody w formie stringa! Można się łatwo domyślić jak upraszcza to niektóre konstrukcje.

Teraz przenoszę mój framework do gier na Pythona i postaram się w te wakacje coś poważniejszego napisać :)

cze 04 2011

Nowy sprzęt

Właśnie konfiguruję nową zabawkę którą sobie sprawiłem. Jest to nowy komputer, kupiony głównie dlatego, że nieziemsko denerwowały mnie lagi w grach Minecraft i World of Warcraft (jedyne gry w które gram). Nowy komputer ma na pokładzie między innymi Intel Dual Core 2x 2.66 GHz, 2 GB RAM DDR3 (rozbuduję za jakiś czas do 4GB) oraz kartę GeForce GT 210. Niektórzy mogą się przyczepić, że zestaw jest stosunkowo słaby. To prawda, do demonów prędkości nie należy. Ale tak jak już pisałem, ja gram tylko w 2 wyżej wymienione gry i lepszy sprzęt od tego jest mi po prostu niepotrzebny.

Miałem kilka problemów. Już od zainstalowania systemu męczyły mnie BSODy lecz wymiana driverów grafiki pomogła i już nie widuję tego okropnego niebieskiego ekranu. Drugim problemem była niedociśnięta w serwisie karta graficzna (wystawała ze slotu). Oczywiście z tym poradziłem sobie bardzo szybko :)

WordPress Themes