ta nie jest przypadkowa, gdyż dokładnie w takiej kolejności komputer wykonuje poszczególne czynności.
Rola wszystkich funkcji, które występują w naszym programie, została przedstawiona w Tabeli 1. Znajdują się tam nazwy funkcji i krótki opis ich zastosowania.
Jedną z pierwszych ważnych czynności, oprócz inicjaliza-cji poszczególnych podsystemów, jest wczytanie zasobów, z których korzysta nasza gra. Należą do nich pliki z grafiką oraz czcionka TrueType. Poszczególne pliki graficzne wczytuje się bardzo łatwo dzięki bibliotece SDL_Image, a wygląda to następująco:
SDL_Surface *sl=NULL; sl=IMG_Load("./data/l.png");
Funkcja IMG_Load rozpoznaje kilka formatów graficznych (m.in. jpeg, png, lbm, tif) i robi to samoczynnie bez naszego udziału - my podajemy tylko nazwę pliku.
Wszystkie czynności ładowania danych realizuje funkcja DataLoad. Wczytuje ona także czcionkę TTF, w identyczny sposób, jaki podałem na samym początku artykułu.
Wszystkie komunikaty, które są wyświetlane, np. o braku połączenia, korzystają z czcionki TTF. Kod źródłowy funkcji DisplayMesg zawiera Listing 2. Technika wyświetlania komunikatów jest identyczna z tą, którą zastosowaliśmy w naszym pierwszym programie „Hello World!”.
Funkcja DrawFieldlnGame potrafi wyświetlić planszę pod dowolnymi współrzędnymi, z czego korzysta kolejna funkcja DeployFleet, omówiona krótko w następnym akapicie. Bardzo ważne są wartości, które zawierają poszczególne pola planszy. Zawartość tablicy o typie TArea decyduje o tym, co zostanie wyświetlone na ekranie. Wartość zero oznacza puste pole, a wartość „-1” kod dla oznaczenia pudła. Wartości od jedności do czwórki to kody statków. Wartości od jedenastu do czternastu oznaczają, że statek bądź jego fragment został trafiony. Sama procedura rysowania jest raczej trywialna. Przy pomocy dwóch pętli przeglądamy zmienne area albo opp_area, reprezentujące plansze do gry naszą bądź przeciwnika. Odpowiednie fragmenty grafiki o wymiarach 30x30 są kopiowane za pomocą SDL_B1itSurface. Oczywiście wymiary poszczególnych kafli nie zmieniają się, lecz ich współrzędne, które wyznaczamy w następujący sposób:
dst_rect.x=_off_x+x*30; dst_rect.y=_off_y+y*30;
Rysunek 3. Diagram przepływu sterowania w grze
Zmienne x i y przyjmują kolejne wartości współrzędnych. Mnożenie tych wartości przez wielkość kafla powoduje, że przesuwamy się w prawo wzdłuż osi X oraz w dół wzdłuż osi Y. Podobne obliczenia będziemy przeprowadzać, gdy na podstawie współrzędnych kursora myszy będziemy chcieli odszukać wskazaną komórkę na planszy.
W naszej grze najważniejsza jest plansza, na której toczy się gra. Z jej obsługą związane są dwie funkcje: DeployFleet oraz GameLoop. Na samym początku gracz rozmieszcza poszczególne statki na planszy. Obsługa tego procesu znajduje się w funkcji DeployFleet. Statki są rozmieszczane za pomocą myszki. Dodatkowo spacją określamy, czy statek ma być umieszczony pionowo, czy poziomo. Proces może wydawać się dość skomplikowany, choć podstawą jest dość prosty wzór konwersji współrzędnych kursora myszy na współrzędne planszy:
61