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.

18 maja 2011

Przykład obsługi zdarzeń

Do wyjaśnienia na czym polega obsługa zdarzeń posłuży mi niniejszy przykład. Program charakteryzuje 2 części. Pierwsza to ta, która odpowiada za narysowanie 5 ilustracji. Natomiast druga zajmuje się wyświetlaniem współrzędnych klikniętego obrazku.

Kliknij, aby powiększyć.

Kod:
http://wklej.org/id/531774/

Animacja

Spora liczba początkujących programistów C++ stawiając swe pierwsze kroczki w dziedzinie gier 2D używa biblioteki Allegro. Co sprawia, że wykonanie animacji sprowadza się do wczytania kilku obrazków, które będą co jakiś krótki czas zmieniane. Tak jak w filmach.



Od strony kodu w C++ sprawa nie wygląda najlepiej, bo to programista musi zbudować, bądź zdobyć klasę animacji, a następnie podczas tworzenia gry, musi żywcem w kodzie opisywać parametry na temat tworzonej animacji. Oczywiście da się zrobić w ten sposób grę, ale to niewątpliwie jest uciążliwe. 

Z resztą spójrz na ten artykuł: http://cpp0x.pl/kursy/Kurs-Allegro-C++/Animacja/71

W przypadku aplikacji Flash, sprawa ma się zdecydowanie lepiej. Otóż animacje tworzy się w specjalnych edytorach, a wynik pracy zapisuje się jako plik SWF, który sam w sobie dysponuje wszystkimi informacjami na temat utworzonej animacji. Tego typu rozwiązanie ma w sobie kilka zalet:
  • Kod jest lepszy, bo nie zawiera zbędnych informacji
  • Łatwiej i lepiej tworzy się animacje w edytorze Flasha
  • Animacje możesz modyfikować, bez modyfikowania kodu
Aby tworzyć animacje jak wspomniałem potrzebny jest edytor Flasha. Na rynku jest wiele produktów oczywiście na ich czele są produkty Adobe, jednak ich cena może być szokująca :-) W chwili obecnej cena ta za Adobe Flash Pro CS5 wynosi ponad 3 tysiące złotych. Dlatego początkującym polecałbym korzystanie z wersji Trial bądź z innych programów, które są darmowe.

Tworzenie animacji wymaga pewnej wprawy, ja sam jestem początkującym i w chwili obecnej co najwyżej mogę się poszczycić latającą chmurką. Nie będę tutaj rozpisywał się w jaki sposób tworzyć animacje, bo to najlepiej to zobaczyć na youtube.

Aby móc użyć gotową animację w AS3 wystarczy użyć kodu z wątku Wyświetlenie Obrazu i zamiast nazwy grafiki podać nazwę animacji.

Wyświetlanie obrazu

Użyłem kodu ze strony społeczności adobe i efekt pracy wygląda następująco:



Nie sądziłem, że w tego rodzaju zadaniu, niemal wszystko wykona klasa Loader. Zauważ, że nie stosuje w kodzie żadnej klasy typu Image, a mimo to Loader jest wstanie wczytać wiele różnych plików graficznych i także je wyświetlić.

Uwagi:
Jeśli używasz IDE - FlashDevelop. To grafikę należy osadzić w katalogu bin twego projektu. W przeciwnym razie podczas wykonywania aplikacji zostanie zgłoszony błąd.

17 maja 2011

Tutoriale społeczności Adobe

Przypadek! Trafiłem na stronę, która skupia w sobie artykuły społeczności Adobe. Tekst jest ciekawy i w dodatku po polsku. Zalecam zajrzeć, szczególnie początkującym!









Link:
http://help.adobe.com/pl_PL/ActionScript/3.0_ProgrammingAS3/

Definiowanie własnego buttona

Utworzyłem przykład ukazujący w jaki sposób można zdefiniować własny button we flashu. Jest to trochę karkołomna operacja, ale pozwala utworzyć button wg własnego uznania, a przecież to może być owocne w przypadku budowania menu gry. Póki co, button działa, ale jego oprawa graficzna pozostawia po sobie wiele do życzenia.

Kod:

Pytanie:
Czy we Fleksie występują standardowe buttony?

Książka: ActionScript3.0 Game Programming University

Udało mi się pozyskać ciekawą czytankę, mowa o ActionScript3.0 Game Programming University  - książce, która traktuje o budowaniu gier w AS3. W sieci publikacja jest wyjątkowo łatwa do nabycia.

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

Jak efektywnie uczyć się ActionScript3?

Bardzo negatywnie zaskoczyła mnie mała ilość materiałów na temat nauki programowania w ActionScript3.0 (AS3 ku zwięzłości). Oczywiście występuje kilka książek, ba nawet w języku polskim. Rzecz w tym, że tego rodzaju książki trochę pomruczą o AS3, a potem głównie koncentrują się na obrazowaniu możliwości Flexa.

Tego mruczenia jest zdecydowanie za mało dla czytelnika, który nigdy nie programował. Dlatego nowicjuszom radziłbym wstrzymać operację 'nauka AS3', do czasu nim wyrobią sobie solidne podstawy w innym języku programowania.

Warto przyjrzeć się bardziej popularnym językom takim jak C++/C#/Java/Python, by na ich bazie zrozumieć na czym polega programowanie zorientowane obiektowo ( w skrócie OOP). Jest to bardzo ważna technika, szczególnie dla programisty gier, ponieważ pozwala postrzegać kod jako zbiór powiązanych obiektów, a to jest bardzo pomocne podczas budowania świata gry. Zamiast myśleć o sekwencji rozkazów myślisz o obiektach takich jak potwory, bronie, pieniądze itp.

Jeśli wiesz na czym polega programowanie, a samo OOP nie stanowi dla Ciebie problemu to powinieneś po prostu pobieżnie poznać gramatykę języka. To jest proste i przyjemne! Dziś skoczyłem do empiku i przejrzałem książkę ActionScript 3.0. Biblia, i po godzinie kartkowania wyłapałem różnice jakich do tej pory w żadnym języku nie spotkałem. Nie wgłębiałem się w tekst, bo większość ludzi pisze o tym samym. Po prostu analizowałem kod i mniej więcej rozumiałem jak należy pisać kod w AS3. Mimo, że obecnie nie jestem guru tego języka, sądzę, że właśnie nadeszła pora, abym poznał Flex.

Ogłoszenie:
OOP jest łatwiejsze niż sobie wyobrażasz. Po prostu wiele publikacji niewłaściwie podchodzi do tego tematu. Specjalnie dla osób, które chcą poznać OOP utworzę na blogu serię artykułów na temat OOP w AS3.

Do zrobienia:
Zyskując coraz większe doświadczenie w AS3. Opisz te różnice jakie trudno spotkać w innych językach programowania.

Jak zacząć naukę ActionScript3.0?

Bardzo negatywnie zaskoczyła mała ilość materiałów na temat nauki programowania w ActionScript3.0 (AS3 ku zwięzłości). Oczywiście występuje kilka książek, ba nawet w języku polskim. Rzecz w tym, że tego rodzaju książki trochę pomruczą o AS3, a potem głównie koncentrują się na obrazowaniu możliwości flexa.

Tego mruczenia jest zdecydowanie za mało dla czytelnika, który nigdy nie programował. Dlatego nowicjuszom radziłbym wstrzymać operację 'nauka AS3', do czasu nim wyrobią sobie podstawy.

Warto przyjrzeć się takim językom jak C++/C#/Java/Python, by na ich bazie zrozumieć na czym polega programowanie zorientowane obiektowo. Jest to bardzo ważna technika, szczególnie dla programisty gier, ponieważ pozwala postrzegać kod jak zbiór powiązanych obiektów, a to jest bardzo pomocne podczas budowania świata gry. Zamiast myśleć o sekwencji rozkazów myślisz o obiektach takich jak potwory, bronie,  pieniądze itp.

Jeśli wiesz na czym polega programowanie, a samo programowanie zorientowane obiektowo nie stanowi dla Ciebie problemu to powinieneś po prostu pobieżnie przyjrzeć się składni języka, bo ta właściwie jest bardzo podobna do gramatyki Javy.

Instalacja narzędzi

Aby móc zacząć programować musisz zainstalować najnowsza wersja Flex SDK (Software Development Kit). Jest to zbiór oprogramowania, który umożliwia programowanie w języku ActionScript3.0. W tym właśnie języku tworzy się gry flash.

Oczywiście kod możesz tworzyć w notatniku, a narzędzia obsługiwać z poziomu wiersza poleceń. Jednak tego typu rozwiązanie jest bardzo uciążliwe. Dlatego warto zainstalować IDE. Nie korzystałem ze wszystkich produktów, ale dużą popularnością cieszy się program FlashDevelop.

Poniżej przedstawiam, wygląd tego IDE.

Kliknij, aby powiększyć.

Poza IDE warto zainstalować program, który umożliwia tworzenia animacji w formacie SWF. Więcej szczegółów podaje w poście na temat animacji.

Zastrzeżenia:
Obecny post tyczy się głównie Windows 7, 64bit.

Do zrobienia:
Zainstaluj Flex SDK i IDE w systemie Linux.

O autorze i o blogu

Blog powstał z myślą dzielenia się użytecznymi informacjami na temat programowania gier we flashu. Obecnie jak widzisz, jest tu próżnia. Lecz z czasem ta sytuacja ulegnie poprawie. W przyszłości znajdziesz tu całkiem sporo samouczków mego autorstwa, a także odnośników do ciekawych witryn.

Zaznaczę, że na programowaniu znam się nie od dziś, ale samo tworzenie gier to dla mnie nowy wymiar. Z tego powodu na początku powstanie wiele wątków, które będą od zera opisywać w jaki sposób zacząć. Tekst będzie możliwie prosty, aby ułatwić naukę możliwie wielu osobom.

Zazwyczaj mam rację, ale nie zawsze. Dlatego od widowni ekspertów oczekuje przytomności i okrzyków w postaci "ten kod to amatorka, zrób to lepiej np. tak ...". Tego typu uwag nie będę ignorował, wręcz przeciwnie docenie i podziekuje za pomoc w ulepszaniu materiałów.

Życzcie mi powodzenia :)