26 czerwca 2011

Zmiana rejsu

Przez ostatnie trzy dni moją uwagę skierowałem na zapoznanie się ze sposobem programowania dynamicznych gier. Wiadomo tam gdzie ruch tam i kolizję, które należy wykryć i obsłużyć reakcjami. Bardzo przypadł mi do gustu ten temat, a także to, że jest powiązany z fizyką, za którą nie przepadałem!

Korci mnie wykonanie własnego SpriteEngine, który zajmowałby się wyświetlaniem spritów, animacji, a także wspomnianą detekcją kolizji.

Poza tym chciałbym nauczyć się renderować znacznie ciekawsze rzeczy niż tylko pliki graficzne. Ciekawi mnie jak narysować programowo deszcz, dym czy ogień.

To przyszłe programowanie nie będę opierał o język actionscript3. Nie dla tego, że AS3 to "skopany język :-)". Da się w nim programować i wielu tego uświadcza. Własny engine pewnie i w tym języku mógłbym wykonać. Czego przykładem jest projekt flixel. Mnie chodzi po prostu o to, że nie chce się zamykać tylko na webowe rozwiązania.


Myślę, że lepiej będzie jeśli mój silnik wykonam w oparciu o OpenGL, wtedy zdobędę wiedzę, która jednocześnie przyda mi się na wielu platformach, a tymsamym umożliwi mi lepszy start w grafice 3D.

Uwaga:
Za kilka dni podam adres na mój kolejny blog o programowaniu w OpenGL.


24 czerwca 2011

Porównywanie obiektów

Rzeczowo ujmując, porównywanie obiektów w AS3 jest bardzo trudne, o ile możliwe. Osobiście nie mam pomysłu jak można porównać dwa obiekty tej samej klasy.

Szperając w google, znalazłem informację (ostatni post), aby oba obiekty zapisywać do postaci bajtowej, a następnie bajt po bajcie je porównywać, aż do przerwania.

Nie wiem czemu, ale u mnie to nie działa. W związku z zaistniała sytuacja utworzyłem wątek na devpytania, lecz nikt do tej pory, nie udzielił mi odpowiedzi.

Rozwodząc się dalej nad problemem, dopowiem, że jeszcze gorzej ma się cześciowe porównywanie obiektów, to znaczy w oparciu o kilka parametrów, a nie wszystkie.

AS3 nie ma wsparcia dla funkcji porównywania. To znaczy, nie ma tu takiej możliwości jak w Java czy C++, gdzie można w funkcji porównywania uzyskać prywatne atrybuty drugiego obiektu. Oznacza to, że w wielu przypadkach skazanym jest się na upublicznianie stanów obiektu.

Rozumiem, że AS3 jest z gatunku tych lżejszych języków, ale czemu do diaska mamy tu tak zaniedbany fundament? Najbardziej ironiczne jest to, że mamy tutaj operator == dla stringów, czego nie można zaświadczyć u Javy :-) . Pytanie, czemu tylko na tym poprzestano?

23 czerwca 2011

Pierwsze demo: Simpsons Memory Game

Po wielu godzinach zmagań z AS3 udało mi się stworzyć pierwsze demo gry.


Jest to klasyczna gra w pamięć. Gra w chwili obecnej nie osiągnie wysokich notowań, bo wiele rzeczy zostało wykonanych na odwal. Nie dodałem żadnego intra z instrukcją, nie mam żadnego podkładu muzycznego, a sam  interfejs użytkownika jest zbyt statyczny. Ogólnie zdałem sobie sprawę, że nie wszystko da się polubić w tworzeniu gier.

Mnie największą frajdę sprawiło implementowanie relacji jaka występuje pomiędzy kartami.

22 czerwca 2011

Sposób na random int

Standardowy moduł Math oferuje tylko jedna funkcja, która losuje liczbę zmiennoprzecinkową z zakresu od 0 do 1. To powoduje, że dość wkurzające jest losowanie liczb całkowitych. Trzeba robić do tego osobną funkcję. Zupełnie nie rozumiem czemu mam tu tak ubogi asortyment standardowych funkcji. Już język python oferuje lepsze wsparcie. 

Czy tylko mnie się tak wydaje?

Oto moja funkcja do losowania liczb całkowitych z podanego przedziału.

Własny kursor

Aby nadać grze lepszego klimatu można standardowy wygląd kursora zastąpić czymś bardziej szykownym, np. ręką orka, czy rózgą czarodzieja. 


Wykonanie takiej sztuczki nie jest trudne wystarczy po prostu schować mysz i  co odświeżenie klatki rysować własny obrazek w miejscu współrzędnych "niewidzialnego" kursora.


21 czerwca 2011

Prosty menadżer zasobów

W poście wyświetlanie obrazu przedstawiłem w jak można wczytać grafikę do programu. To rozwiązanie jest akurat bardzo łatwe, ale i zarazem pozostawia sobie wiele do życzenia.

W grach bardzo często zachodzi konieczność wyświetlenia tej samej grafiki w wielu miejscach na ekranie jednocześnie. Uzmysławiającym przykładem może być rysowanie terenu gry platformowej. Tutaj wczytuje się niewielkie obszary grafiki, które w efekcie powiela się wielokrotnie na ekranie.



Jednak jeśli gra wymaga, aby 100 razy narysować taką kostkę to nierozsądne byłby tworzenie 100 loaderów po to, by wczytać 100 identycznych grafik. To postępowanie byłoby nierozsądne i szybko sprawiłoby, że gra stanie się strasznie pamięciożerna. Można się o tym przekonać wywołując funkcję informującą o aktualnym zużyciu pamięci.

Zdecydowanie lepszym rozwiązaniem jest wczytanie tylko jednej grafiki na wzór której gra będzie rysować te same kostki platformy. Wykonanie tego nie jest akurat tak oczywiste jak się wydaje, bo loader po wczytaniu grafiki wiąże ją ze swoimi współrzędnymi. Ważne jest odpowiednie wydobycie danych z loadera. Sposób ten przedstawiam w źródle programu.

Samo pozyskanie referencji na zasób to nie koniec pracy. Należy liczyć się, że w grze może być takich przypadków bardzo wiele, a ich rozrzutne traktowanie może sprawić, że kod gry stanie się makabryczny.

Dlatego warto zbudować klasę, która zajmuje się zarządzaniem zasobów. W moim przypadku utworzyłem klasę, która wczytuje zasoby, a następnie przechodzi w stan globalnego udostępniania, a wszystko za sprawą wzorca singleton.

Rozwiązanie przedstawia poniższy kod.

Kod:
http://3paste.com/s/2617
http://3paste.com/s/2621



Oczywiście ten efekt jest prosty i niespecjalnie nadaje się dla dużych aplikacji. Tutaj tylko menadżer raz wczytuje zasoby i następnie przetrzymuje je do końca przebiegu gry. To podejście na dłuższa meta nie jest rozsądne, dlatego w większych grach można wprowadzić funkcje do zwalniania i przydzielania zasobów dla poszczególnych poziomów gry.http://3paste.com/s/2621

20 czerwca 2011

Preconditions

Aby tworzyć bardziej bezpieczny kod można stosować programowanie kontraktowe. Jest to sposób organizowania kodu, który głównie polega na tym, aby przed wykonaniem operacji i po wykonaniu operacji sprawdzić status aplikacji. Mowa tu o wczesnym wykryciu potencjalnego źródła błędu.


Do implementacji kontraktów stosuje się asercje( ta strona przedstawa to od strony języka C) i wyjątki.

Jednak stosowanie wyjątków do tego celu jest nieco żmudne, bo dla każdego postawionego warunku trzeba rzucać osobny wyjątek. Z resztą taki kod nie czyta się najlepiej.

W bibliotekach guava od google można znaleźć ciekawe rozwiązanie dla tej sytuacji. Mowa o preconditions.

Implementacja tego rozwiązania jest bardzo prosta, bo z reguły opiera się na opakowaniu rzutu wyjątkiem przez statyczną funkcję. Poniższy kod przedstawia moje rozwiązanie w wersji dla AS3.

Sposób na enum

Typy wyliczeniowe są znane od wielu lat, a mimo to AS3 ich nie oferuje. To dziwne, bo gramatyka tego języka wspiera wiele nowoczesnych konstrukcji, a w tym przypadku lipa. Szkoda.


Poniższy kod przedstawia moje obejście tej niedogodności.

19 czerwca 2011

Implementacja wzorca singleton w AS3

Niniejsza notka skierowana jest do osób, które znają podstawowe wzorce projektowe. Jeśli nigdy o tym nie słyszałeś to wiedz, że to są sprawdzone techniki programowania, które sprawiają, że tworzony projekt jest bardziej elastyczny. Co w szczególności sprawia, że kod aplikacji jest lepiej przygotowany do zmian.

Wzorzec singletona w przypadku AS3 jest bardziej zawiły niż w językach takich jak C++, Java czy C#. Wszystko dlatego, bo tu nie ma możliwości na zdefiniowanie prywatnego konstruktora.

Aby obejść tę niedogodność można wymusić na konstruktorze publicznym odbieranie wygenerowanego klucza, który zna tylko statyczna metoda instance. Gdyby user podał fałszywy klucz wtedy konstruktor zgłosiłby wyjątek. Zatem user staje się zależny od metody instance, która za niego pilnuje, aby w projekcie istniała tylko jedna instancja danej klasy.

Sądzę, że powyższy opis stanie się bardziej jasny, gdy przekonasz się jak wygląda kod.

Tutoriale do programowania gier.

Poniższy link, prowadzi do strony, która zawiera wiele tutoriali na temat podstawowych algorytmów jakie wprowadza się do flashowych gier. Mowa tu o algorytmach pozwalających postaci na skakanie, zbieranie itemów, czy znajdowanie ścieżki do celu. Artykuły pisane są oczywiście w AS3.

Książka: Flash Game Development By Example

Kolejna książka na temat programowania gier we Flashu.

Do zrobienia:
Wykonaj recenzję tej książki.

Tutorial na temat grawitacji

Bardzo ciekawy tutorial, który ułatwia zaprogramowanie grawitacji w grach.






Linki:
http://www.emanueleferonato.com/2006/10/29/flash-game-creation-tutorial-part-1/
http://www.emanueleferonato.com/2006/11/18/flash-game-creation-tutorial-part-2/

Kurs OOP anulowany

Ogłaszam, że anulowałem prowadzenie pobocznego kursu na temat zorientowanego obiektowo programowania, a dotychczasowy materiał blokuje, bo pozostawia sobie wiele do życzenia. Nie mam ochoty przeznaczać na to więcej czasu. Wolę skupić się na tematach bardziej związanych z programowaniem gier flash, niż z ogólnym programowaniem.

Tak więc, tym o to ponurym wejściem wznawiam dalsze prowadzenie tego bloga.