Implementacja gry Arkanoid na mikrokontrolerze STM32
Artykuł prezentuje implementację gry Arkanoid na mikrokontrolerze z rodziny STM32
Cel projektu
Celem projektu było stworzenie prostej gry dedykowanej na mikrokontroler STM32F103 z rdzeniem Cortex-M3. Do realizacji projektu wykorzystano zestawy wyprodukowane przez firmę Kamami: ZL31ARM oraz moduł z kolorowym wyświetlaczem KAmodTFT2.
Moduły zostały połączone w następujący sposób:
Oprogramowanie zostało napisane przy pomocy środowiska Atollic TrueStudio w języku C.
Struktura projektu
Cała implementacja została podzielona na 3 odrębne moduły:
Moduł obsługi wyświetlacza
Odpowiada za obsługę wyświetlacza graficznego znajdującego się na płytce KAmodTFT2. Moduł ten zawiera definicje określające poszczególne piny złącza komunikacyjnego oraz definiujące słowa kodowe wykorzystywane w czasie komunikacji ze sterownikiem wyświetlacza. Dodatkowo w module zawarte zostały funkcje rysujące obiekty na planszy oraz inicjujące te obiekty. Są to:
- void lcdInit() – inicjalizuje wyświetlacz,
- void LCDContrastSet(char a) – ustawia kontrast wyświetlacza; parametr należy dobrać doświadczalnie,
- void drawBox (uint8 x, uint8 y, uint8 sizex, uint8 sizey, uint8 color) – rysuje prostokąt na wyświetlaczu. Pierwsze 2 parametry wskazują lewy górny róg prostokąta, kolejne to jego długość, szerokość oraz kolor wypełnienia,
- void drawBall (uint8 x, uint8 y, uint8 color, uint8 background) – rysuje piłkę do gry. Jej wymiary to 5 na 5 pikseli, a parametrami są współrzędne punktu określającego prawy róg kwadratu, w którym wpisany jest okrąg piłki oraz jej kolor i tło,
- void LCDClear (char color) – zmienia kolor w całej przestrzeni wyświetlacza na zdefiniowany w parametrze.
Moduł z grą
Moduł z grą zawiera także struktury określające klocki wraz z platformą oraz piłkę do gry. Wśród funkcji znajdują się między innymi:
- uint8 colision () – sprawdza czy nastąpiła jakakolwiek kolizja piłki,
- void Iteration () – określa kolejny krok symulacji gry,
- void reDraw () – rysuje na nowo klocki,
- void platformMove (short int direction) – porusza platformą,
- void InitializeScreen () – inicjuje ekran,
- void InitializeGame () – inicjalizuje nową grę
- void StartNewPlay () – inicjalizuje poziom,
- void playStart() – wprawia piłkę w ruch,
- void restart() – przenosi platformę oraz piłkę w położenie początkowe z zachowaniem pozycji kloców,
- void reDrawBall (int8 speedX, int8 speedY) – przerysowuje położenie piłki na nowe.
Moduł główny
Jest to nieskończona pętla w której z ustalonym interwałem czasowym wykonywany jest krok symulacji. Wszystko to działa na zdarzeniu od timera systemowego, w przerwaniu którego następuje ustawienie flagi wykonania kroku symulacji. Poruszanie platformą jest niezależne od symulacji, co pozwala nam szybciej poruszać platformą niż piłeczką. Interwał czasowy pomiędzy kolejnymi wystąpieniami przerwania zależny jest od pozycji potencjometru znajdującego się na płycie, a także od numeru poziomu, na którym gracz obecnie się znajduje.
Pełen kod gry znajduje się w sekcji „Do pobrania”.