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.