Języki programowania: Flash
Gra logiczna

Ostatnio aktualizowano 22 czerwca 2008 r.

Wstęp

Jako jeden z projektów na zaliczenie z przedmiotu Systemy Multimedialne, trzeba wykonać prostą grę dla dzieci. Jak chyba łatwo się domyślić gra musi być wykonana w technologii flash z czymże nie jest istotne w której wersji (wszystko zależy od naszego gustu lub przyzwyczajeń). Na początku pracy korzystałem z Macromedia Flash MX, jednak z czasem przeszedłem na Adobe Flash CS3 i korzystałem z niego aż do zakończenia projektu. O samym środowisku nie mam zamiaru się wypowiadać, chciałbym opisać samą grę oraz jak została zaprojektowana.

Bloczki - jest to gra dla dzieci, przeznaczona dla 2 do 4 graczy. Nie ma możliwości gry z przeciwnikiem komputerowym, więc należy sobie znaleźć kompanów do zabawy ;). Gra polega na odpowiednim ustawianiu bloczków na planszy, im więcej uda nam się ułożyc bloczków tym więcej otrzymamy punktów. Osoba z największą ilością punktów wygrywa (co chyba jest zrozumiałe ;) ). Gra posiada trzy stopnie trudności zasad, ma to pozwolić najmlodszem graczowi powoli zapoznać się ze sposobami sterowania, przeciągania bloczków na planszę, obracania ich itp.

Przed opisem architektury warto rzucić okiem na samą grę, pomocne w tym może być kilka zrzutów z ekranu.

ekran startowy ekran po uruchomieniu obrot bloczka o 90 stopni odbicie wertykalne przeciaganie bloczka
rozgrywka rozpoczęta wybór bloczka poziom trudności mlekopij poziom trudności znasięconieco poziom trudności mistrzunio

Zasady

Gra posiada trzy poziomy rozgrywki: mlekopij (najłatwiejszy), znasięconieco (średnio zaawansowany), mistrzunio (trudny). Każdy kolejny rozbudowuje zasady poprzedniego poziomu. Mlekopij - gracze aby zdobywać punkty musza dostawiać bloczki na planszę, za każdy położony bloczek dostają określoną ilość punktów. Bloczki nie mogą się nakładać, nie ma ograniczeń gdzie mogą być postawione na planszy (nie muszą się stykać). Znasięconieco - bloczki danego gracza muszą stykać się narożnikami lub krawędziami, każdy gracz musi zacząć ustawiać swoje bloczki od swoich pól startowych (pole to zaznaczone jest kółkiem w odpowiednim kolorze). Mistrzunio - najwyższy poziom trudności, rozgrywka na tym poziomie daje największą satysfakcję poniważ, można ustawiać własne bloczki tylko tak aby dodtykały się narożnikami.

Pliki

Plik swf ze skompilowaną grą można pobrać tutaj..., projekt wraz ze wszystkimi plikami jest do pobrania tutaj...

Projekt

Starałem się zrealizować projekt tak aby oddzielić logikę od widoku, jako, że był to mój pierwszy większy projekt we flashu więc miałem po drodze troche problemów z realizacją postanowienia. Po dłuższym zastanowieniu nie wiem czy całkowicie można powiedzieć, że projekt jest napisany jako aplikacja MVC. Rzeczywiście logika (model) całkowicie jest uniezależniona od reszty kodu związanego z wyświetlaniem jednakże, w niektórych miejscach następuje zatarcie pomiędzy kontrolerem i widokiem. Pierwotnie chciałem skorzystać, z możliwości podpięcia klasy pod MovieClip lub Button, jednak po krótkich próbach (miałem niewiele czasu na realizację projektu) nie udało mi się skonstruować niczego co by mi odpowiadało funkcjonalnością, postanowiłem więc stworzyć klasy opakowujące wybrane MovieClipy, udostępniające pewne metody pozwalające na jakiś stopień ingerencji w MovieClip (np.: zmiana koloru, zmiana tekstu). Częśc kontrolerów działa tak jak to opisują w książkach czyli komunikacja wygląda następująco: Widok <=> Kontroler <=> Model, jednak w przypadku dźwieku oraz wskaźnika myszy mamy: MovieClip <=> Kontroler <=> Model.

Mam nadzieję, że analiza kodu mojej gry pozwoli wam na szybszą realizację waszych projektów. Jakie ciekawostki więc znajdziecie tutaj w kodzie? (w kolejności jakiej mi się nasuwały ;P)
- zmiana koloru i tekstu w Dynamic Text w wybranym MovieClip.
- tworzenie wskaźnika myszy i odpowiednie odrysowywanie go na ekranie.
- ładowanie i odtwarzanie zewnętrznego pliku mp3 (nie znalazłem jak odtworzyć wav).
- chwytanie elementów, przeciąganie ich i puszczanie.
- dynamiczne tworzenie MovieClip-ów na podstawie istniejących lub znajdujących się w bibliotece.
- podmienianie wyświetlanych klatek MovieClip-u.
- dziedziczenie i polimorfizm (flash go posiada ;P)

Model
Block.as - reprezentacja bloku, tutaj zapisany jest jego kształt oraz ile gracz dostanie punktów za jego ustawienie na planszy. Za pomocą metod tej klasy możliwe jest obracanie, odbijanie w poziomie i pionie.
BlockType.as - klasa przechowująca ilość i rodzaje bloków, we Flashu nie ma enum, więc stworzyłem pseudo-enum.
BlockFactory.as - klasa pozwalająca na tworzenie bloków.
Debug.as - klasa pomagająca w szukaniu błędów związanych z przeliczaniem położenia wskaźnika myszy.
FieldType.as - klasa przechowująca ilość i rodzaje pól, pol jest 9 rodzajów: puste (empty), czerwone (red), zielone (green), niebieskie (blue), żółte (yellow), czerwony start (rstart), zielony start (gstart), niebieski start (bstart), żółty start (ystart).
Game.as - klasa abstrakcyjna gry, aby stworzyć nowy rodzaj rozgrywki należy utworzyć klasę dziedziczącą po Game.
HardGame.as - klasa dziedzicząca po Game, trudny rodzaj rozgrywki.
Map.as - klasa przechowująca aktualny stan planszy.
MediumGame.as - klasa dziedzicząca po Game
Player.as - klasa przechowująca informacje o graczu
SimpleGame.as - klasa dziedzicząca po Game

Widok
BlockMC.as - klasa opakowująca MovieClip związany z wyświetlaniem bloku.
EndMC.as - klasa opakowująca MovieClip wyświetlany po zakończeniu rozgrywki.
MapMC.as - klasa opakowująca tablicę MovieClip-ów związanych z wyświetlaniem planszy.
PlayerMC.as - klasa opakowująca MovieClip związany z wyświetlaniem wyniku danego gracza.
View.as - klasa posiadająca statyczne metody związane z tworzeniem planszy oraz pól z wynikami graczy.

Kontroler
BlockController - klasa kontrolera bloczków ustawianych na planszy, ma za zadanie na podstawie ruchów wykonywanych przez graczy odzwierciedlać wszelkie zmiany w logice, i na odwrót.
ButtonsController - interfejs gry tworzy szereg przycisków, ten kontroler służy do reakcji na zdarzenia zachodzące po wybraniu poszczególnych przycisków.
GameController.as - klasa odpowiedzialna za kontrolowanie przebiegu rozgrywki i natychmiastowego odzwierciedlania jej na planszy.
PlayerController.as - klasa na podstawie zmieniających się wyników aktualizuje MovieClipy przypisane do poszczególnych graczy.
PointerController.as - jak wiadomo, w takich małych grach wiele pomysłów przychodzi w trakcie pisania, gdy już większość kodu była gotowa, zabrakło sposobu informowania, który gracz ma aktualnie turę, stąd pomysł na wskaźnik myszy zmieniający kolor (na kolor aktualnego gracza). Kontroler ten służy do odrysowywania wskaźnika i zarządzania jego położeniem.
SoundController.as - kontroler odpowiedzialny za zarządzanie dźwiękami wykorzystywanymi podczas gry, a tak szczerze i między nami to tylko jednym ;)

Wiedza tylko wtedy jest wiedzą, kiedy zdobyta została wysiłkiem własnej myśli, a nie wyłącznie dzięki pamięci.

Poprawny XHTML 1.0! Poprawny styl CSS!hacker emblem open source emblem