Gra MasterCortex

Transkrypt

Gra MasterCortex
MARM
Projekt: MasterCortex
Katarzyna Kelm, 236754
1
O grze MasterCortex
Gra MasterCorex jest uproszczona˛ wersja˛ gry MasterMind. W projekcie wykorzysta do komunikacji z
użytkownikiem ekran dotykowy znajdujacy
˛ si˛e na zestawie uruchomieniowym STM32F746G - Disco.
Gra polega na odgadni˛eciu kodu - kombinacji 4 ukrytych, kolorowych kul. Gra zostanie rozwiazana,
˛
jeśli w ciagu
˛ 7 tur gracz odgadnie kolejność kul. W każdej turze gracz wybiera 4 kule, po czym sprawdza
czy trafił. Każda prawidłowo odgadni˛eta kula (kula o właściwym kolorze na właściwym miejscu) sygnalizowana jest pomarańczowa˛ kropka.˛ Jeśli gracz odgadł kolor kuli, nie odgadł zaś jej lokalizacji, jest to
sygnalizowane szara˛ kropka.˛
Rysunek 1: Wyglad
˛ planszy do gry
1
2
Realizacja
Gra została napisana jako rozszerzenie (moduł) platformy demonstracyjnej STM32Cube_FW_F7_V1.4.0
znajdujacej
˛ si˛e na płytce STM32F746G - Disco. Szczegółowa instrukcja dodawania modułu znajduje si˛e
na stronie producenta w instrukcji STM32CubeF7_demonstration_platform.pdf .
Do tworzenia interfejsu użytkownika wykorzystano biblioteki STemWin. W celu wygenerowania bitmap
użyto Bitmap Converter for emWin V5.28.
Podczas realizacji projektu posłużono si˛e środowiskiem programistycznym - System Workbench for
STM32, a w celu zaprogramowania pami˛eci QSPI-Flash użyto ST-Link’a.
3
Interacje
Informacje ogólne:
Wszystkie interakcje zachodza˛ przez wiadomości typu WM_MESSAGE, przesyłane do callback’ów
przypisanych do okien, za pośrednictwem Window Managera.
Wiadomości moga˛ być generowane przez:
• akcje użytkownika
• wewn˛etrznie przez Window Manager’a
• przez kod aplikacji
Wszystkie okna (w tym przyciski) tworzone sa˛ i wiazane
˛
z procedurami okna w funkcji ’Startup’
wywoływanej przez kernel przy starcie modułu.
Scenariusz interakcji użytkownika z MasterCortex:
1. Użytkownik naciska przycisk (np. koloru lub przycisk ’exit’).
2. Window Manager wywołuje procedur˛e okna (callback) powiazan
˛ a˛ z przyciskiem:
- cbExit dla hExit
- cbBrain dla hBrain
- cbKey dla przycisków kolorów
Callback jest przypisywany do przycisku w funkcji Startup przez wywołanie WM_SetCallback
(dlatego, że dla przycisku przy jego tworzeniu nie można podać callback, można go tylko zmienić
zaraz po utworzeniu).
Callback przycisku służy tylko do odrysowania przycisku, dlatego obsługujemy w nim tylko wiadomość WM_PAINT. Inne wiadomości przekazywane sa˛ do obsługi domyślnej funkcji przycisku:
BUTTON_Callback(pMsg)
Jest to dobrze widoczne w implementacji np. ’cbKey’.
3. Po obsłużeniu odrysowania przycisku, przycisk sygnalizuje Window Managerowi, że ma powiadomić rodzica o zdarzeniu naciśni˛ecia. Window Manager wywołuje callback rodzica w tym przypadku okna hBoard, czyli funkcje cbBoard z wiadomościa˛ o id = WM_NOTIFY_PARENT. Wywoływana jest funkcja onNotifyBoard, która dalej wykonuje logik˛e w zależności od tego, który
przycisk został naciśni˛ety (zobacz kod onNotifyBoard).
Jeżeli został naciśni˛ety ’exit’, wtedy nast˛epuje wyjście z modułu przez wywołanie funkcji ’GUI_EndDialog’.
2
Jeżeli został naciśni˛ety przycisk koloru, kolor zostaje obliczony na bazie id naciśni˛etego przycisku,
wywoływana jest funkcja makeMove, do której kolor jest przekazywany jako argument.
Należy zwrócić uwag˛e, że funkcja onNotifyBoard reaguje tylko na kod WM_NOTIFICATION_RELEASED
- czyli zwolnienie przycisku po naciśni˛eciu. Bez tego warunku, kod funkcji wykonywałby si˛e wielokrotnie, bo naciśni˛ecie przycisku generuje wiele wiadomości, a wszystkie sa˛ przekazywane do
rodzica.
4. Funkcja makeMove obsługuje ruch wykonywany przez gracza. Sprawdza, czy gra trwa, wstawia
kolor w odpowiednie miejsce planszy, jeżeli ruch kończy tur˛e to oblicza punktacj˛e, obsługuje sytuacj˛e zakończenia gry - zarówno wygrana˛ jak i przegrana.˛
Jeżeli na planszy zaszły jakieś zmiany, wywołuje funkcje invalidateColor / invalidateMarkers /
invalidateCode, żeby odrysować cz˛eść planszy. W dalszym opisie posłużymy si˛e przykładem invalidateColor.
5. Funkcja invalidateColor oblicza, w jakim prostokacie
˛ okna hBoard zaszły zmiany w zwiazku
˛
z
wybraniem koloru przez użytkownika. Nast˛epnie sygnalizuje Window Manager’owi, że obszar ten
wymaga odrysowania, wywołujac
˛ funkcj˛e ’WM_InvalidateRect’, do której przekazuje okno i prostokat
˛ do odrysowania.
Window Manager oblicza, które okna maja˛ zostać odrysowane. Do każdego takiego okna wysyła
wiadomość o id=WM_PAINT, wywołujac
˛ jego callback.
Najpierw wywoływany jest callback dla hBoard, czyli funkcja cbBoard.
6. Funkcja cbBoard obsługuje wiadomość WM_PAINT, przekazujac
˛ wykonanie do funkcji onPaintBoard.
Funkcja onPaintBoard rysuje pusta˛ plansz˛e, a nast˛epnie na podstawie stanu gry - kolory i markery,
a w przypadku zakończenia gry - także kod do odgadni˛ecia, który jest generowany na poczatku
˛ gry
przez generator liczb losowych (RNG).
Po odrysowaniu planszy, odrysowywane sa˛ na niej także przyciski - to robi Window Manager,
wysyłajac
˛ WM_PAINT do callback’ów poszczególnych przycisków.
.
3