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