Spis treści. Część I Programowanie w języku C++... 21. O Autorze...17 Wstęp...19



Podobne dokumenty
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

5.4. Tworzymy formularze

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

CZĘŚĆ A PIERWSZE KROKI Z KOMPUTEREM

1 Podstawy c++ w pigułce.

Wykład 8: klasy cz. 4

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

1 Podstawy c++ w pigułce.

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Kopiowanie, przenoszenie plików i folderów

Programowanie na poziomie sprzętu. Programowanie w Windows API

Dodawanie grafiki i obiektów

Automatyzowanie zadan przy uz yciu makr języka Visual Basic

Informatyka II. Laboratorium Aplikacja okienkowa

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie w języku Python. Grażyna Koba

Programowanie obiektowe

Podstawy programowania skrót z wykładów:

Programowanie obiektowe

Rozdział 5. Administracja kontami użytkowników

Język programowania. Andrzej Bobyk

Rozdział II. Praca z systemem operacyjnym

Stawiamy pierwsze kroki

Wprowadzenie do programowania

Zakład Systemów Rozproszonych

CEMEX Go. Katalog zamówień i produktów. Wersja 2.1

Programowanie obiektowe

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Podręcznik użytkownika programu. Ceremonia 3.1

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej.

Instrukcja użytkownika

Podstawy Programowania

Programowanie w języku C++ Grażyna Koba

Rozdział 4 KLASY, OBIEKTY, METODY

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Uruchamianie bazy PostgreSQL

Temat 5. Programowanie w języku Logo

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wykład 5: Klasy cz. 3

1. Dockbar, CMS + wyszukiwarka aplikacji Dodawanie portletów Widok zawartości stron... 3

Tworzenie prezentacji w MS PowerPoint

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

Gdy z poziomu programu Delphi otworzysz folder pierwszy program, zauważysz tylko dwa pliki [rys.1]:

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Przewodnik Szybki start

Zasady programowania Dokumentacja

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

FINCH PONG. Realizator: Partner: Patronat:

I. WSTĘP. Przykład 1. Przykład 2. Programowanie czyli tworzenie programów komputerowych (aplikacji komputerowych)

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Utworzenie pliku. Dowiesz się:

Celem tego projektu jest stworzenie

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

UMOWY INSTRUKCJA STANOWISKOWA

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows 7

Systemy operacyjne i sieci komputerowe Szymon Wilk Konsola MMC 1

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

UNIFON podręcznik użytkownika

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Temat: Organizacja skoroszytów i arkuszy

Wprowadzenie (17) Część I. Makra w Excelu - podstawy (23)

Czym są właściwości. Poprawne projektowanie klas

Programowanie i techniki algorytmiczne

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Kancelaria instalacja programu

Laboratorium - Podgląd informacji kart sieciowych bezprzewodowych i przewodowych

2.5 Dzielenie się wiedzą

Podstawy technologii cyfrowej i komputerów

OBIEKTY TECHNICZNE OBIEKTY TECHNICZNE

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

5. Administracja kontami uŝytkowników

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Makropolecenia w Excelu

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Komputery I (2) Panel sterowania:

DesignCAD 3D Max 24.0 PL

Wprowadzenie do projektu QualitySpy

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

Dodanie nowej formy do projektu polega na:

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Advance CAD 2016 SP2. W tym dokumencie opisano ulepszenia w Advance CAD Service Pack 2. Co nowego w Advance CAD 2016 SP2

BAZY DANYCH Panel sterujący

Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt

Transkrypt:

Spis treści O Autorze...17 Wstęp...19 Część I Programowanie w języku C++... 21 Rozdział 1. Wprowadzenie do programowania w C++...23 Dlaczego akurat C++?...k...k......23 Praca z edytorem Visual C++...k...24 Tworzenie obszaru roboczego...k...24 Tworzenie projektów...k...k...25 Tworzenie i dodawanie plików...k...26 Pierwszy program: Witajcie, dobrzy ludzie...k...27 Struktura programu w C++...k...k. 30 Język projektowania programów (PDL)...k...31 Kod źródłowy i jego kompilacja...k...32 Obiekty i konsolidacja...k...k..3 2 Plik wykonywalny...k...k...3 3 Komentarze...k...k...33 Szukanie błędów...k...k...34 Ostrzeżenia...k...k......36 Podsumowanie...k...k...37 Pytania i odpowiedzi...k...k......38 Ćwiczenia...k...k......39 Rozdział 2. Zmienne i operatory...41 Zmienne i pamięć...k...k......41 Typy zmiennych...k...k......42 Używanie zmiennych w programach...k...44 Deklarowanie zmiennej...k...k44 Używanie zmiennych...k...k...45 Inicjowanie zmiennych...k...k.46 Modyfikatory zmiennych...k...k....47 Stałe (const)...k...k...47 Zmienna typu register...k...k...4 8 Nazewnictwo zmiennych...k...k... 49 Redefinicja nazw typów...k...k......49 Co to jest operator?...k...k...50 Operator przyporządkowania...k...50 Operatory matematyczne...k...50

6 Programowanie gier. Kompendium Operatory jednoargumentowe...k...51 Operatory dwuargumentowe...k...52 Złożone operatory przyporządkowania...k...53 Operatory przesunięcia bitowego...k...54 Operatory porównania...k...k......54 Operator warunkowy...k...k......55 Operatory logiczne...k...k......56 Kolejność operatorów...k...k...57 Podsumowanie...k...k...58 Pytania i odpowiedzi...k...k......59 Ćwiczenia...k...k......59 Rozdział 3. Funkcje i przebieg programu...61 Funkcje: czym są i do czego się przydają?...k...61 Tworzenie i korzystanie z funkcji...k...63 Deklarowanie prototypu...k...63 Parametry domyślne...k...k......66 Zakres zmiennej...k...k...67 Zmienne lokalne...k...k....68 Zmienne globalne...k...k... 68 Zmienne statyczne...k...k... 69 Rekurencja...k...k...70 O czym warto pamiętać, korzystając z funkcji?...k...72 Przebieg programu...k...k...73 Bloki kodu i pojedyncze instrukcje...k...73 Instrukcje if, else if i else...k...73 if74 else...k...k...75 Pętle while, do... while i for...k...76 while...k...k...76 do... while...k...k...77 for...k...k......78 Przerywanie i kontynuacja pętli...k...80 break...k...k...80 continue...k...k......80 Instrukcja switch...k...k...82 Liczby losowe...k...k...84 Pierwsza gra Craps...k...k.....87 Cel...k...k......87 Zasady...k...k......87 Projekt...k...k......87 Implementacja...k...k......88 Podsumowanie...k...k...94 Pytania i odpowiedzi...k...k......94 Ćwiczenia...k...k......94 Rozdział 4. Projekty wieloplikowe i preprocesor...97 Pliki źródłowe a pliki nagłówków...k...97 Korzystanie z wielu plików...k...k.....98 Co to jest preprocesor?...k...k.....100 Unikanie podwójnych załączeń...k...101 Użycie dyrektywy #pragma...k...102 Użycie #ifdef, #define i #endif...k...102 Makra...k...k...104 Inne dyrektywy preprocesora...k...105

Spis treści 7 Podsumowanie...k...k...105 Ćwiczenia...k...k......105 Rozdział 5. Tablice, wskaźniki i łańcuchy...107 Czym jest tablica?...k...k...107 Deklarowanie i używanie tablicy...k...107 Deklaracja...k...k......108 Używanie tablic...k...k... 108 Inicjowanie tablicy...k...k... 110 Tablice wielowymiarowe...k...k..1 11 Co wskazują wskaźniki?...k...k... 113 Wskaźniki a zmienne...k...k.....114 Deklaracja i inicjowanie...k...114 Używanie wskaźników...k...114 Wskaźniki a tablice...k...k...116 Związek wskaźników z tablicami...k...116 Przesyłanie tablic do funkcji...k...116 Deklaracja i rezerwacja pamięci dla wskaźnika...k...118 Rezerwacja pamięci...k...k...118 Uwalnianie pamięci...k...k...119 Operatory wskaźnikowe...k...k... 121 Manipulowanie pamięcią...k...k..1 24 memcpy...k...k......124 memset...k...k......125 Łańcuchy...k...k......125 Łańcuchy a tablice...k...k...1 25 Korzystanie z łańcuchów...k...125 Operacje na łańcuchach...k...126 Podsumowanie...k...k...141 Pytania i odpowiedzi...k...k......141 Ćwiczenia...k...k......142 Rozdział 6. Klasy...143 Czym jest klasa?...k...k......143 Nowe typy...k...k......144 Tworzenie klas...k...k...144 Projektowanie...k...k....144 Definiowanie...k...k.....145 Implementacja...k...k....146 Korzystanie z klas...k...k...146 Składowe prywatne, publiczne i chronione...k...146 Tryb prywatny (private)...k...147 Tryb publiczny (public)...k...147 Tryb chroniony (protected)...k...148 Który tryb jest najlepszy?...k...148 Konstruktory i destruktory...k....149 Konstruktor domyślny...k...k149 Konstruktory ogólne...k...k...150 Konstruktor kopiujący i wskazania...k...150 Destruktor...k...k...151 Przeładowywanie operatorów...k...152 Przykład zastosowania klas klasa String...k...153 Podstawy dziedziczenia i polimorfizmu...k...158 Dziedziczenie...k...k.....158 Polimorfizm...k...k.....163

8 Programowanie gier. Kompendium Wyliczenia...k...k...166 Unie...k...k......167 Składowe statyczne...k...k......168 Przydatne techniki korzystania z klas...k...169 Klasa singleton...k...k.....169 Fabryka obiektów...k...k...17 2 Podsumowanie...k...k...176 Pytania i odpowiedzi...k...k......177 Ćwiczenia...k...k......177 Rozdział 7. Potwór pierwsza prawdziwa gra...179 ConLib...k...k...179 Projektowanie...k...k....180 Implementacja...k...k....182 Tworzenie Potwora...k...k.....192 Cel gry...k...k...192 Reguły gry...k...k......193 Projektowanie gry...k...k...1 93 Implementacja...k...k....197 Podsumowanie...k...k...215 Rozdział 8. Strumienie...217 Co to jest strumień?...k...k......217 Strumienie binarne i tekstowe...k...217 Wejście i wyjście...k...k...218 istream...k...k......218 ostream...k...k......221 Strumienie plików...k...k......223 Otwieranie i zamykanie strumieni...k...223 Tekst...k...k...227 Tryb binarny...k...k.....232 Modyfikacja gry Potwór zapisywanie i odczyt gry...k...236 Podsumowanie...k...k...242 Pytania i odpowiedzi...k...k......242 Ćwiczenia...k...k......243 Rozdział 9. Architektura oprogramowania...245 Rola projektowania w tworzeniu programów...k...245 Strategie projektowe...k...k...246 Strategia odgórna...k...k... 246 Strategia oddolna...k...k... 246 Strategia odgórna kontra oddolna...k...247 Kilka podstawowych technik...k...247 Przykład 1. Operator przyporządkowania zamiast równości...247 Przykład 2. Instrukcje kontra bloki...k...248 Przykład 3. Makra kontra funkcje inline...k...248 Przykład 4. Prywatne kontra publiczne, przypadek pierwszy...249 Przykład 5. Prywatne kontra publiczne, przypadek drugi...250 Moduły i stosowanie wielu plików...k...251 Tworzenie modułów w C++...k...251 Dlaczego warto tworzyć moduły?...k...252 Konwencje nazewnicze...k...k... 252 Nazywanie funkcji...k...k...25 Nazwy zmiennych...k...k...253 Identyfikacja...k...k......253

Spis treści 9 Gdzie zdrowy rozsądek wygrywa z projektem...k...254 Metoda projektowania używana w tej książce...k...254 Podsumowanie...k...k...256 Pytania i odpowiedzi...k...k......256 Ćwiczenia...k...k......257 Część II Programowanie w środowisku Windows... 259 Rozdział 10. Projektowanie biblioteki gier: Mirus...261 Opis ogólny...k...k......261 Komponenty biblioteki Mirus...k...262 Komponent pomocniczy...k...k...26 Komponent Windows...k...k...2 63 Komponent graficzny...k...k.....263 mrscreen...k...k......264 mrrgbaimage...k...k...264 mrsurface...k...k......264 mrtexture...k...k......265 mrtemplateset...k...k... 265 mranimation...k...k....265 mrabo...k...k......265 Komponent dźwiękowy...k...k...26 6 mrsoundplayer...k...k...2 66 mrcdplayer...k...k....266 Komponent komunikacji z użytkownikiem...k...267 mrkeyboard...k...k....267 mrmouse...k...k......267 mrjoystick...k...k......268 Tworzenie komponentu pomocniczego...k...268 Deklarowanie typów...k...k...268 mrtimer...k...k...269 Jak utworzyć plik błędów...k...274 Jak korzystać z biblioteki Mirus...k...275 Podsumowanie...k...k...275 Pytania i odpowiedzi...k...k......275 Rozdział 11. Wprowadzenie do programowania w Windows...277 Historia Windows...k...k...277 Wstęp do programowania w Windows...k...278 Okna...k...k......278 Wielozadaniowość...k...k...279 Windows ma swój własny API...k...280 Kolejki komunikatów...k...k.280 Visual C++ a aplikacje Windows...k...280 Tworzenie aplikacji Windows...k...281 WinMain kontra Main...k...k283 Tworzenie okna...k...k...2 84 Pętla komunikatów...k...k...288 Obsługa komunikatów...k...k289 Tworzenie pętli komunikatów działającej w czasie rzeczywistym...291 Tworzenie ogólnej klasy okna...k...294 Wykorzystanie szkieletu okna z biblioteki Mirus...k...301 Funkcje okien...k...k......302 SetPosition...k...k...302 GetPosition...k...k......303

10 Programowanie gier. Kompendium SetSize...k...k...304 GetSize...k...k......304 Show...k...k...305 Podsumowanie...k...k...305 Pytania i odpowiedzi...k...k......305 Ćwiczenia...k...k......306 Rozdział 12. Wprowadzenie do DirectX...307 Co to jest DirectX?...k...k......307 Krótka historia DirectX...k...k.....307 Dlaczego akurat DirectX?...k...k. 308 Komponenty DirectX...k...k....309 Jak działa DirectX?...k...k...310 Warstwa abstrakcji sprzętowej...k...310 Model COM...k...k... 311 COM i DirectX...k...k...3 12 Jak używać DirectX w Visual C++?...k...313 Podsumowanie...k...k...314 Pytania i odpowiedzi...k...k......314 Ćwiczenia...k...k......314 Rozdział 13. Grafika DirectX...315 Używane interfejsy...k...k...315 Korzystanie z Direct3D: podstawy...k...317 Powierzchnie, bufory i łańcuchy zamiany...k...329 Powierzchnie...k...k.....329 Bufory...k...k......329 Łańcuchy zamiany...k...k...330 Renderowanie powierzchni...k...330 Wierzchołki, wielokąty i tekstury...k...336 Wierzchołki i wielokąty...k...337 Tekstury...k...k...337 Z trzech wymiarów na dwa...k...340 Mapy bitowe Windows...k...k...3 47 Struktura mapy bitowej...k...348 Ładowanie mapy bitowej...k...349 Tryb pełnoekranowy i inne tryby kolorów...k...350 Teoria kolorów i kluczowanie kolorów...k...351 Teoria kolorów...k...k....351 Kluczowanie kolorów...k...k.353 Pliki Targa...k...k......354 Struktura pliku Targa...k...k..35 4 Ładowanie pliku Targa...k...355 Animacja i zestawy szablonów...k...356 Animacja...k...k......356 Zestawy szablonów...k...k...356 Wykrywanie kolizji...k...k......357 Figury opisujące...k...k....357 Okręgi opisujące...k...k... 357 Prostokąty opisujące...k...k...35 8 Manipulacja obrazem dwuwymiarowym...k...360 Przesunięcie...k...k......360 Skalowanie...k...k......361 Obrót...k...k......361

Spis treści 11 Kreślenie figur płaskich...k...k....364 Linie...k...k......364 Prostokąty i inne wielokąty...k...367 Okręgi...k...k...368 Tworzenie biblioteki Mirus...k...368 mrscreen...k...k......368 mrrgbaimage...k...k...384 mrsurface...k...k......395 mrtexture...k...k......402 mrtemplateset...k...k... 409 mranimation...k...k....413 mrabo...k...k......419 Podsumowanie...k...k...434 Pytania i odpowiedzi...k...k......435 Ćwiczenia...k...k......435 Rozdział 14. DirectInput...437 Wprowadzenie do DirectInput...k...437 Dane niebuforowane...k...k...438 Dane buforowane...k...k...43 8 Klasa mrinputmanager...k...k... 439 Klasa mrkeyboard...k...k......441 Klasa mrmouse...k...k...453 Klasa mrjoystick...k...k......464 Podsumowanie...k...k...473 Pytania i odpowiedzi...k...k......474 Ćwiczenia...k...k......474 Rozdział 15. DirectSound...475 Teoria dźwięku...k...k......475 Podstawy interfejsu DirectSound...k...476 Klasa mrsoundplayer...k...k.....477 Klasa mrsound...k...k......480 Interfejs MCI...k...k......490 Klasa mrcdplayer...k...k......491 Podsumowanie...k...k...496 Pytania i Odpowiedzi...k...k......497 Ćwiczenia...k...k......497 Część III Właściwe programowanie gry... 499 Rozdział 16. Wprowadzenie do projektowania gry...501 Na czym polega projektowanie gier?...k...501 Ta straszna dokumentacja projektu...k...502 Dlaczego technika mam to wszystko w mojej głowie nie jest dobra?...503 Dwa rodzaje projektów...k...k....504 Miniprojekt...k...k......504 Kompletny projekt...k...k...50 4 Wypełnianie tworzonej dokumentacji projektu...k...505 Ogólny opis gry...k...k... 505 Docelowy system operacyjny oraz wymagania gry...k...505 Opowieść tworząca fabułę gry...k...506 Ogólne założenia grafiki i dźwięku...k...506 Menu...k...k......506

12 Programowanie gier. Kompendium Przebieg gry...k...k......506 Opis postaci i bohaterów niezależnych...k...506 Schemat sztucznej inteligencji gry...k...506 Podsumowanie...k...k...5 07 Przykładowy projekt gry: Najeźdźcy z kosmosu...k...507 Ogólny opis gry...k...k... 507 Docelowy system operacyjny i wymagania gry...k...507 Fabuła gry...k...k...508 Ogólne założenia grafiki i dźwięku...k...508 Menu...k...k......508 Przebieg gry...k...k......509 Opis postaci i bohaterów niezależnych...k...509 Schemat sztucznej inteligencji gry...k...510 Podsumowanie gry...k...k...510 Podsumowanie...k...k...510 Pytania i Odpowiedzi...k...k......511 Ćwiczenia...k...k......511 Rozdział 17. Algorytmy i struktury danych...513 Znaczenie doboru właściwych struktur danych i algorytmów...513 Listy...k...k...515 Prosta struktura listy...k...k... 516 Listy dwustronnie powiązane...k...524 Listy zapętlone...k...k.....524 Zalety list...k...k...525 Wady list...k...k......526 Drzewa...k...k...526 Drzewa uniwersalne...k...k......527 Konstruowanie drzewa uniwersalnego...k...530 Trawersowanie drzewa uniwersalnego...k...531 Destruktor drzewa uniwersalnego...k...533 Zastosowania drzew uniwersalnych...k...533 Drzewa przeszukiwania binarnego...k...534 Krótki wykład na temat drzew binarnych...k...534 Czym jest drzewo przeszukiwania binarnego?...k...535 Przeszukiwanie drzewa przeszukiwania binarnego...k...536 Wstawianie elementów do drzewa przeszukiwania binarnego...538 Usuwanie wartości z drzewa przeszukiwania binarnego...539 Uwarunkowania związane z wydajnością...k...546 Zastosowania drzew przeszukiwania binarnego...k...547 Sortowanie danych...k...k......547 Algorytm bubblesort...k...k...548 Algorytm quicksort...k...k...55 0 Porównanie sposobów sortowania...k...554 Kompresja danych...k...k......555 Pakowanie z użyciem kodowania grupowego...k...555 Kod źródłowy algorytmu kodowania grupowego...k...556 Podsumowanie...k...k...557 Pytania i odpowiedzi...k...k......558 Ćwiczenia...k...k......558 Rozdział 18. Matematyczne aspekty programowania gier...559 Trygonometria...k...k......559 Reprezentacja graficzna oraz wzory...k...559 Zależności między kątami...k...562

Spis treści 13 Wektory...k...k......563 Dodawanie i odejmowanie wektorów...k...566 Iloczyn i iloraz skalarny...k...567 Długość wektora...k...k...5 68 Wektor jednostkowy...k...k...569 Wektor prostopadły...k...k...569 Iloczyn skalarny...k...k....570 Iloczyn skalarny z wektorem prostopadłym...k...571 Macierze...k...k......571 Dodawanie i odejmowanie macierzy...k...574 Skalarne mnożenie i dzielenie macierzy...k...575 Macierz zerowa i jednostkowa...k...577 Macierz transponowana...k...578 Mnożenie macierzy...k...k...578 Transformacja wektora...k...580 Prawdopodobieństwo...k...k....580 Zbiory...k...k...581 Suma zbiorów...k...k... 581 Iloczyn (część wspólna) zbiorów...k...582 Funkcje...k...k......582 Rachunek różniczkowy...k...583 Pochodne...k...k......584 Podsumowanie...k...k...584 Pytania i odpowiedzi...k...k......585 Ćwiczenia...k...k......585 Rozdział 19. Sztuczna inteligencja w pigułce...587 Obszary i zastosowania sztucznej inteligencji...k...587 Systemy eksperckie...k...k...587 Logika rozmyta...k...k... 589 Algorytmy genetyczne...k...k590 Sieci neuronowe...k...k... 592 Algorytmy deterministyczne...k...593 Ruch losowy...k...k....594 Śledzenie...k...k......595 Wzorce...k...k......596 Automat skończony...k...k......598 Logika rozmyta...k...k...599 Podstawy logiki rozmytej...k...599 Macierze rozmyte...k...k...60 1 Metody zapamiętywania...k...k...6 02 Sztuczna inteligencja i gry...k...602 Podsumowanie...k...k...603 Pytania i odpowiedzi...k...k......603 Ćwiczenia...k...k......604 Rozdział 20. Wstęp do modelowania fizycznego...605 Czym jest fizyka...k...k......605 Budujemy moduł modelowania fizycznego...k...606 Do czego służy moduł fizyczny...k...606 Założenia modułu...k...k...60 mrentity...k...k...606 Podstawowe pojęcia fizyczne...k...608 Masa...k...k......608 Czas...k...k......609

14 Programowanie gier. Kompendium Położenie...k...k......609 Prędkość...k...k......610 Przyspieszenie...k...k.....611 Środek ciężkości...k...k... 612 Siła...k...k...613 Siła liniowa...k...k...613 Moment obrotowy...k...k...615 Siła wypadkowa...k...k...6 16 Grawitacja...k...k...617 Prawo powszechnej grawitacji...k...617 Grawitacja na Ziemi i innych planetach...k...618 Symulacja lotu pocisku...k...619 Tarcie...k...k...621 Pojęcie tarcia...k...k......621 Rodzaje tarcia...k...k.....621 Obsługa kolizji...k...k...626 Moment pędu...k...k... 626 Metoda impulsowa...k...k...627 Symulacja...k...k......630 Odstęp czasowy rysowania ramek...k...632 Zespoły cząstek...k...k......637 Projekt zespołu cząstek...k...637 Program demonstracyjny...k...647 Podsumowanie...k...k...649 Pytania i odpowiedzi...k...k......650 Ćwiczenia...k...k......651 Rozdział 21. Przykładowa gra Breaking Through...653 Projekt Breaking Through...k...653 Ogólne zasady...k...k....653 Wymagania sprzętowe...k...k653 Scenariusz...k...k......654 Reguły...k...k......654 Grafika...k...k...654 Menu...k...k......655 Przebieg gry...k...k......656 Składniki aplikacji...k...k... 657 Implementacja gry Breaking Through...k...659 btblock...k...k......659 btpaddle...k...k...663 btball...k...k......667 btgame...k...k......673 Okno główne...k...k....699 Podsumowanie...k...k...701 Rozdział 22. Publikacja gry...703 Czy Twoja gra warta jest opublikowania?...k...703 Gdzie powinieneś zapukać?...k...704 Naucz się pukać właściwie...k...704 Kontrakt...k...k...705 List intencyjny...k...k.....705 Kontrakt...k...k...706 Kamienie milowe...k...k...706 Lista błędów...k...k......707 Dzień wydania...k...k... 707

Spis treści 15 Gdy nie znajdziesz wydawcy...k...707 Wywiady...k...k...707 Niels Bauer: Niels Bauer Software Design...k...707 André LaMothe: Xtreme Games LLC...k...709 Podsumowanie...k...k...711 Przydatne adresy...k...k...711 Kilka słów na koniec...k...k......711 Dodatki...o... 713 Dodatek A Zawartość płyty CD-ROM...715 Kody źródłowe...k...k......715 Microsoft DirectX 8.0 SDK...k...715 Aplikacje...k...k...715 Jasc Paint Shop Pro 7...k...k..71 6 Syntrillium Cool Edit 2000...k...716 Caligari TrueSpace 5...k...k..716 Gry...k...k...716 Gamedrop...k...k.....716 Smiley...k...k......717 Smugglers 2...k...k.....717 Dodatek B Wykrywanie błędów za pomocą Microsoft Visual C++...719 Pułapki i praca krokowa...k...k....719 Pułapki...k...k...719 Praca krokowa...k...k... 720 Zmiana wartości zmiennych podczas działania programu...k..720 Podglądanie zmiennych...k...k... 721 Dodatek C System dwójkowy, dziesiętny i szesnastkowy...723 System binarny...k...k......723 System heksadecymalny...k...k...7 23 System dziesiętny...k...k......724 Dodatek D Kompendium języka C...725 Standardowa biblioteka wejścia-wyjścia...k...725 Obsługa plików...k...k...726 Struktury...k...k......728 Dynamiczna alokacja pamięci...k...728 Dodatek E Odpowiedzi do ćwiczeń...731 Rozdział 1....k...k...731 Rozdział 2....k...k...731 Rozdział 3....k...k...732 Rozdział 4....k...k...732 Rozdział 5....k...k...732 Rozdział 6....k...k...733 Rozdział 8....k...k...733 Rozdział 9....k...k...733 Rozdział 11....k...k...734 Rozdział 12....k...k...734 Rozdział 13....k...k...734 Rozdział 14....k...k...735 Rozdział 15....k...k...735 Rozdział 17....k...k...735

16 Programowanie gier. Kompendium Rozdział 18....k...k...735 Rozdział 19....k...k...736 Rozdział 20....k...k...736 Dodatek F Słowa kluczowe C++...737 Dodatek G Przydatne tabele...739 Tabela znaków ASCII...k...k....739 Tablica całek nieoznaczonych...k...741 Tablica pochodnych...k...k......741 Moment bezwładności...k...k... 742 Dodatek H Dodatkowe źródła informacji...743 Tworzenie gier i programowanie...k...743 Nowości, recenzje, pobieranie plików...k...744 Biblioteki...k...k......744 Niezależni twórcy gier...k...k......744 Przemysł...k...k......745 Humor...k...k...745 Książki...k...k...745 Skorowidz...747

Rozdział 11. Wprowadzenie do programowania w Windows System Windows był, jest i będzie. Umiejętność tworzenia i wyświetlania okien oraz znajomość podstaw ich używania jest kluczowa dla kanżdego programisty DirectX. W rozdziale tym wyjaśnię podstawowe zagadnienia, związane z tworzeniem i manipulacją oknami oraz omówię kilka często używanych funkcji, związanych z programowaniem w Windows. Na koniec stworzymy schemat budowy okien, przeznaczony do wielokrotnego zastosowania w naszych grach. Historia Windows System Windows przebył długą drogę od czasu pojawienia się jego pierwszej wersji. Od Windows 1.0 do Windows XP rozrósł się on od prostego interfejsu użytkownika z oknami i menu do najbardziej złożonego systemu operacyjnnego wszech czasów. Programowanie i praca z pierwszymi wcieleniami Windows była trudna. Struktura programistyczna została w całości zmodyfikowana w Windows 3.1, który był wybawieniem dla wszystkich programistów Windows. W 1995 roku Microsoft wprowadził 32-bitowy system Windows 95. Były to czasy, kiedy Microsoft podbił cały rynek (a w zasadzie cały świat), tworząc system przyjazny użytkownikowi, przyjazny programiście, o dużych możliwościach i atrakcyjnym wyglądzie. Wówczas system Microsoftu nadawał się do tworzenia większości aplikacji, ale nie było łatwo tworzyć w nim gry. Około roku później Microsoft stworzył Game SDK (później przemianowany na DirectX), aby spróbować zachęcić programistów do tworzenia gier w ich nowym systemie. Wraz z pojawieniem się Windows 98 (a także o wiele lepszej wersji DirectX) Microsoft stworzył idealne rozwiązanie zarówno dla aplikacji, jak i gier. Prawdziwie 32-bitowy

278 Część II Programowanie w środowisku Windows system gwarantował szybkie i stabilne środowisko dla gier. Wyglądał co prawda tak samo i z pozoru niewiele różnił się od Windows 95, jednak wewnątrz był zupełnie inny od swego poprzednika. Wraz z Windows 95 i 98 Microsoft stworzył też Windows NT (obecnie w swoim piątym wcieleniu zwany Windows 2000), który był stabilnym systemem dla sieci i aplikacji, ale bardzo mało wydajnym dla gier. Dopiero w Windows NT 5 Microsoft przyłożył się, aby uczynić go przyjaznym graczom. Windows Millennium Edition (ME) bardzo dobrze współpracuje z grami i zwykłymi aplikacjami. Jest przyjazny użytkownikowi i kompatybilny z większością istniejącego sprzętu. Ostatnio Microsoft stworzył Windows XP, który łączy stabilność Windows 2000 z prostotą obsługi Windows 98. Ogólnie rzecz biorąc, Windows na początku był prostym interfejsem użytkownika. Wkrótce stał się pełnowartościowym systemem operacyjnym, uważanym za najbardziej złożony system, jaki kiedykolwiek stworzono. Wstęp do programowania w Windows Okna Ograniczymy się tu do zachowania kompatybilności z Windows 98 i nowszymi wersjami, głównie z uwagi na ich 32-bitową architekturę co nie znaczy, że pisany przez nas kod nie będzie działał w Windows 95. Windows 95 zawiera dużo kodu 16-bitowego, który przyczynia się do jego niestabilności i powoduje błędy w Windows 98 nie ma już tych problemów. Poza tym kod, który działa w Windows 98, powinien działać idealnie także w nowszych wersjach systemu. Microsoft stara się zachować kompatybilność z programami stworzonymi dla poprzednich systemów. Tworząc gry (lub inne programy) w Windows, należy wziąć pod uwagę parę spraw. Niektórymi nie trzeba się specjalnie przejmować, a innnymi wręcz przeciwnie. Aplikacje Windows zwykle działają w oknach. Okna składają się z kilku komponentów. Przedstawia je rysunek 11.1. Rysunek 11.1 przedstawia typowe okno, wykorzystujące najbardziej typowe komponenty. Nie oznacza to, że wszystkie z nich są potrzebne.n Oto krótki opis każdego z nich: a. po kliknięciu tej ikony wyświetlane jest menu systenmowe z podstawowymi funkcjami okna, takimi jak Przenieś, Rozmiar, Minimalizuj itp.; b. ten pasek zawiera nazwę okna; c. kliknięcie tej ikony minimalizuje okno do paska zadnań; d. kliknięcie tej ikony maksymalizuje okno do rozmiarów ekranu (o ile to możliwe); e. kliknięcie tej ikony zamyka (kończy) aplikację;

Rozdział 11. Wprowadzenie do programowania w Windows 279 Rysunek 11.1. Typowe okno składa się z kilku komponentów f. ramka jest używana do zmiany rozmiaru i przedstawiennia granicy pomiędzy obszarem okna a innymi aplikacjami na pulpicie; g. menu zwykle udostępnia użytkownikowi dodatkowe polencenia w formie grup menu i podmenu; h. to obszar, który nas interesuje, czyli obszar apliknacji. Jego zawartość zależy wyłącznie od nas. Wielozadaniowość Rysunek 11.2. Wielozadaniowość w jednym programie Windows to system wielozadaniowy. Można w nim uruchomić jednocześnie kilka aplikacji. Windows obsługuje dwa rodzaje wielozadaniowości: opartą na procesach i opartą na wątkach. Rysunek 11.2 przedstawia przykład wielozadnaniowości. Jeżeli komputer nie jest systemem wieloprocesorowym, to tak naprawdę nie jest w stanie wykonywać dwóch zadań naraz. Windows emuluje jednak wielozadaniowość, wykonując na zmianę część zadania każdej aplikacji i dzięki szybkości komputera tworząc iluzję, że różne zadania są wykonywane w tym samym czasie. Jeżeli na przykład mamy jeden program, który wykonuje 10 obliczeń w każdym cyklu, oraz drugi, który też wykonuje 10 obliczeń w cyklu, Windows jest w stanie wykonać jedno obliczenie w pierwszej aplikacji, potem jedno w drugiej, następnie znowu jedno w pierwszej aplikacji i tak dale, aż do ukończenia obliczpeń przez obie aplikacje.

280 Część II Programowanie w środowisku Windows Nawet jeśli sami nie musimy zajmować się tym problemem, powinniśmy zapewnić, by nasze gry nie miały wyłącznego dostępu do procesora. Nigdy nie możemy zakładać posiadania 100% mocy obliczeniowej systemu i tego samego nie możemy wymagać również od systemu użytkownika. Windows ma swój własny API W odróżnieniu do tworzonych wcześniej aplikacji konsoli nie ma tu bezpośredniej kontroli nad działaniem aplikacji Windows. Posługujesz się interfejsem programowania aplikacji (API), który umożliwia Ci sterowanie widokiem i mannipulację oknami. Będziemy korzystali z Win32 API, czyli 32-bitowej wersji interfejsu programistycznego Windows API. Starszy interfejs, służący do tworzenia aplikacji 16-bitowych, to Win16 API. W nowym API znajdują się setki funkcji, za pomocą których można sterować tworzonymi aplikacjami. Do końca tego rozdziału i w paru następnych kod będziemy tworzyć wyłącznie za pomocą Win32 API. Kolejki komunikatów Inną ogromną różnicą między aplikacjami konsoli a aplikacjami Windows są komunikaty lub kolejki wejściowe. Wszystko, co dzieje się w naszych programach (np. ruch myszy, naciśnięcie klawisza, lądowanie obcych), jest zgłaszane do aplikacji w formie komunikatu. Kolejka to lista zdarzeń, danych i wszystkich innych elementów, które działają zgodnie z regułą pierwszy wchodzi, pierwszy wychodzi (FIFO). Pierwsze dane, jakie wchodzą na listę, opuszczają ją w pierwszej kolejności. W każdym cyklu poświęconym Twojej aplikacji zobaczysz, czy w kolejce nie ma oczekujących komunikatów. Przejdziesz wówczas do ich obsługi lub je zignorujesz więcej na ten temat przy okazji programu obsługi komuninkatów. Visual C++ a aplikacje Windows Przy tworzeniu aplikacji Windows nie będziemy korzystali już z projektu Win32 Console. Zastąpimy go projektem Win32 Application. Nauczyliśmy się już tworzyć nowe projekty, ale na wszelki wypadek przypomnę: musisz kliknąć File, New i wybrać zakładkę Projects. Następnie wybierz Win32 Application i podaj nazwę projektu. Jeżeli pamiętasz jeszcze aplikacje konsoli, wiesz, że w chwili tworzenia nowego projektu mogłeś zdefiniować kilka wstępnych opcji, pomocnych w jego utworzeniu. Aplikacja Win32 również ma kilka takich opcji. Eksperymentowanie z nimi pozostawiam jednak Tobie.

Rozdział 11. Wprowadzenie do programowania w Windows 281 Teraz dodaj plik źródłowy C++ i możesz zaczynać. Tworzenie aplikacji Windows Rysunek 11.3. Tworzenie aplikacji Windows Aplikacje Windows tworzymy w czterech głównych krokacnh. Ilustruje je rysunek 11.3. Najlepiej zacząć od spojrzenia na pełny kod aplikacji Windows, a następnie szczegółowo przeanalizować istotne jego fragmenty. Oto kod: Listing 11.1. Aplikacja Windows

282 Część II Programowanie w środowisku Windows Jeżeli wszystko się powiodło, powinieneś po uruchomieniu zobaczyć okno takie, jak na rysunku 11.4.

Rozdział 11. Wprowadzenie do programowania w Windows 283 Rysunek 11.4. Okno aplikacji Windows Na początku dołączamy plik nagłówka windows.h (wiersz 2.). Nagłówek ten zawiera prawie wszystkie funkcje, struktury, stałe itp. interfejsu Win32 API, potrzebne do tworzenia aplikacji Windows. Potem deklarujemy prototyp procedury obsługi komunikatu (wiersze 5. i 6.). Nie przejmuj się na razie tą funkcjąn omówimy ją później. WinMain kontra Main (wiersz 9.) to odpowiednik funkcji aplikacji konsoli w Windows. Używa ona innej struktury niż. Po pierwsze zwracany typ to. Nie oznacza to, że jesteś zmuszony używać w tej sytuacji, ale powinieneś. Drugą sprawą, jaką zauważyłeś, jest to, że wygląda tak, jakby zwracała dwa typy, co nie jest prawdą. to konwencja wywołania specyficzna dla aplikacji Windows taka, jak lub, z którymi spotkałeś się wcześniej. Dalej umieszczone są parametry. Pierwszy parametr to egzemplarz programu. Można go traktować jako identyfikator naszej aplikacji dla systemu operacyjnego. Drugi parametr nie jest używany w 32-bitowych wersjach Windows i ma zawsze wartość. Uchwyt to wskaźnik do wskaźnika, co oznacza, że wskazuje on adres z listy. Uchwyty są potrzebne, ponieważ menedżer pamięci Windows przemieszcza obiekty według swojego uznania i nie mamy normalnego dostępu do pamięci bez pomocy z zewnątrz. Trzeci parametr, to łańcuch z argumentami wiersza poleceń. Działa on trochę inaczej niż w przypadku konsoli. Jeżeli spróbujnemy uruchomić taki program: będzie takim łańcuchem: Jeżeli więc chcemy zinterpretować argumenty z wiersza poleceń, robimy to tak, jakbyśmy interpretowali normalny łańcuch. Ostatni parametr wskazuje, jak należy wyświetlić okno. Może on przyjąć dowolną wartość z tych pokazanych w tabeli 11.1 będziemy z nich później korzystać.

284 Część II Programowanie w środowisku Windows Tabela 11.1. Stany okna przekazywane do WinMain Wartość Opis Ukrywa okno Minimalizuje okno Aktywuje i wyświetla okno w pierwotnym rozmiarze, jmeżeli wcześniej było zmaksymalizowane lub zminimalizowane Aktywuje i wyświetla okno Aktywuje i wyświetla zminimalizowane okno Aktywuje i wyświetla okno zmaksymalizowane Aktywuje i wyświetla okno zminimalizowane i jako akmtywne Aktywuje i wyświetla okno jako aktywne Aktywuje i wyświetla okno Aktywuje i wyświetla okno w jego oryginalnych rozmimarach i pozycji, jeżeli było zminimalizowane lub zmaksymalizowane Tworzenie okna Klasa okna Tworzenie okna można również podzielić na dwa etapy: definicję klasy okna i utworzenie samego okna. Pierwszym krokiem w definiowaniu klasy okna jest nasntępująca deklaracja zmiennej: Zmienna ta służyć będzie do określenia atrybutów okna. Struktura posiada kilka składników, z których skorzystamy. Zdefiniowana jest tnak: Oto objaśnienia kolejnych pól struktury. określa rodzaj klasy okna. Tym razem nie skorzystamy z tego składnika i ustawimy go na. Następny jest wskaźnik procedury obsługi komunikatów, wywoływanej przez okno. Wcześniej zadeklarowaliśmy prototyp funkcji i tam właśnie będziemy go używać przypisujemy go więc do tego polan.

Rozdział 11. Wprowadzenie do programowania w Windows 285 Po procedurze obsługi okna umieszczone są dwa pola, i, które służą do określenia ilości dodatkowych bajtów przeznaczonych do zarezerwowania odpowiednio dla struktury okna i struktury klasy okna. Nie będziemy ich używać, więc nadamy im wartość zero. Następne pole to pole egzemplarza. Jest to egzemplarz aplikacji, w której tworzymy okno. Skorzystamy w tym celu z parametru z. Następne pole to uchwyt ikony. Pole to określa ikonę, jaka ma być wyświetlana na pasku tytułowym. Aby załadować ikonę, używamy funkcji API, która zadeklarowana jest w poniższy sposób: Funkcja ta, o ile jej wywołanie się powiedzie, zwraca uchwyt do ikony, którego używamy w polu klasy okna. Jej pierwszy parametr to egzemplarz, z którego chcemy załadować ikonę. Tutaj użyjemy, ponieważ w naszej aplikacji nie będziemy używać ikon. Jeżeli użyjemy jako egzemplarza, możemy skorzystać z predefiniowanej ikony. Drugi parametr to łańcuch zakończony znakiem pustym, określający nazwę ikony do załadowania. W tym przypadku używamy predefiniowanej ikony. Tabela 11.2 wymienia kilka innych ikon, z których możemy knorzystać. Tabela 11.2. Predefiniowane ikony Wartość Opis Domyślna ikona aplikacji Ikona komunikatu o błędzie Ikona informacji Ikona ostrzeżenia Ikona pytania Ikona z logo Windows Następna jest informacja o kursorze, będąca uchwytem do kursora, którego chcemy używać z naszym oknem. Funkcji używamy podobnie do. Pierwszy parametr to ponownie egzemplarz naszego programu lub jeżeli chcemy użyć któregoś z predefiniowanych kursorów. Tak jest właśnie w tym przypadku. Drugi parametr to nazwa kursora lub nazwa predefiniowanej ikony. Użyjemy tu standardowej strzałki, jaką widzimy zwykle w Windows. Tabela 11.3 zawiera listę predefiniowanych kursorów, z jakich można korzystać. Zostały jeszcze tylko trzy parametry. Kolejny to styl tła. Tutaj określamy rodzaj pędzla, którym pomalowane jest tło naszego okna. Używając, korzystamy z predefiniowanego zbioru obiektów lub pędnzli. Oto składnia tej funkcji: Funkcja zwraca uchwyt do obiektu i pobiera typ obiektu jako parametr. Tabela 11.4 zawiera pełną listę pędzli, z jakich możemy wybierać.

286 Część II Programowanie w środowisku Windows Tabela 11.3. Predefiniowane kursory Wartość Opis Standardowa strzałka z małą klepsydrą Standardowa strzałka Krzyżyk Strzałka i znak zapytania Belka I Przekreślone kółko (zakaz) Strzałka w czterech kierunkach Strzałka dwukierunkowa, wskazująca na północny wschód im południowy zachód Strzałka dwukierunkowa, wskazująca na północ i południme Strzałka dwukierunkowa, wskazująca na północny zachód im południowy wschód Strzałka dwukierunkowa, wskazująca na wschód i na zachmód Strzałka pionowa Klepsydra Tabela 11.4. Predefiniowane pędzle Wartość Opis Czarny pędzel Ciemnoszary pędzel Szary pędzel Pędzel przezroczysty Biały pędzel Następne pole to nazwa menu. W tym oknie nie będziemy korzystali z menu, dlatego ustawimy jego wartość na. Ostatnia, lecz niemniej istotna, jest nazwa klasy. Ta nazwa będzie używana przez system Windows w odniesieniu do klasy. Podczas tworzenia okna musimy nadać mu nazwę w naszym przykładzie będzie to. W tym momencie przygotowaliśmy naszą klasę do rejestnracji. Co teraz? Rejestrujemy! W wierszu 33. próbujemy zarejestrować klasę za pomocą funkcji, której definicja wygląda tak: W przypadku powodzenia funkcja zwraca, który identyfikuje klasę okna, lub zero, jeżeli wywołanie się nie powiedzie. Poza sprawdzeniem efektu wywołania nie będziemy używać zwracanego typu, dlatego nie będziemy się tu nim zajmować. Jedynym parametrem funkcji jest wskaźnik klasy okna, w tym przypadku. Funkcja ta zarejestruje naszą klasę do dalszego użytku.

Rozdział 11. Wprowadzenie do programowania w Windows 287 Sprawdzamy tu również, czy poprawnie zarejestrowaliśmy klasę okna; jeżeli nie, następuje wyjście z programu i zwrócenie wartości 1. Na tym kończymy fazę deklaracji i rejestracji w procesie tworzenia okna. Jeżeli przebiegła ona pomyślnie, możemy przejść do konstruowanina samego okna. Tworzenie okna Dotarliśmy do punktu, w którym zaczynamy tworzenie samego okna. Pierwszym krokiem (może nie do końca krokiem) w tworzeniu okna jestn deklaracja uchwytu okna: Następnie możemy, jak pokazano w wierszach od 41. do 44., utworzyć okno za pomocą następującego kodu: ma wiele parametrów, przyjrzyjmy się więc definicji tej funkcji i kolejno je przeanalizujmy. zwraca uchwyt do utworzonego okna, o ile wywołanie się powiodło lub w innym wypadku. Zwrócony uchwyt okna może być używany praktycznie w każdej operacji dokonywanej na oknie. Omówmy teraz parametry. Pierwszy to nazwa klasy tu zawarte będą właściwości okna. Nazwa ta musi być nazwą klasy zarejestrowanej w naszym programie. Używamy więc, ponieważ tak nazywa się klasa, którą zarejestrowaliśmy. Drugi parametr to nazwa okna. Jest to tekst, który będzie domyślnie widoczny na pasku tytułowym (w naszym przypadku.) Następny jest styl okna. Parametr ten określa sposób wyświetlania okna. Stosujemy tu parameter, tworzący zwykłe okno z wszystkimi typowymi składnikami (poza menu) spójrz na rysunek 11.1). Używamy tu też do wymuszenia widoczności okna po uruchomieniu. Oba style łączymy za pomocą operatora OR. W tabeli 11.5 przedstawiono kilka typowych nstylów okien.

288 Część II Programowanie w środowisku Windows Tabela 11.5. Style okien Wartość Opis Tworzy okno potomne Tworzy okno z paskiem przewijania Tworzy okno z normalnymi komponentami okna Tworzy okno wyskakujące (pop-up) Tworzy okno widoczne od początku Tworzy okno z pionowym paskiem przewijania Większości wartości z tabeli 11.5 oraz innych styli okien można używać razem, łącząc je operatorem OR. Kolejne 2 parametry i to pozycja okna na ekranie. Używamy tu, zezwalając systemowi na wybranie pozycji. Koleje parametry są związane z poprzednimi i opisują szerokość oraz wysokość okna. Są to i. Tutaj również wybór wartości powierzamy systemowi Windows, przekazując. Następny w kolejności jest uchwyt okna nadrzędnego. Nie będziemy z niego co prawda korzystać, ale podajemy tu wartość, co stanowi informację dla systemu Windows, że oknem nadrzędnym dla naszego oknna jest pulpit. Następny parametr to uchwyt menu. Uchwyt ten działa podobnie do uchwytu klasy okna, jednak omówiony dokładniej będzie dopiero w następnym rozdziale tym razem ustawimy go na wartość. Kolejnym składnikiem jest egzemplarz aplikacji. Spotkaliśmy się z nim już wcześniej i tak jak poprzednio użyjemy tu paranmetru z. Na końcu przesyłamy do komunikatu utworzenia okna własne dane. Parametr ten będzie używany w dalszej części rozdziału, podczas budowy klasy okna ogólnego zastosowania; tam też zostanie omówiony. Skoro utworzyliśmy już okno, skorzystamy z, aby wyświetlić je zgodnie z parametrem z. Nie jest to krok konieczny, ale powinno się go wykonać, aby sprawdzić, czy Windows poprawnei manipulujne naszymi oknami. To wszystko. Utworzyliśmy okno i wyświetliliśmy je na ekranie. Teraz przejdziemy do omówienia pętli komunikatów i programu obsługi, aby ukończyć naszą pierwszą aplikację Windows. Pętla komunikatów Skoro mamy już okno, trzeba stworzyć pętlę odbierającą komunikaty. Pętla taka jest częścią prawie każdego programu w Windows (choć istnieją pewne zaawansowane techniki pozwalające na jej pominięcie). Uruchomiona aplikacja stale odbiera komunikaty wy-

Rozdział 11. Wprowadzenie do programowania w Windows 289 syłane przez system Windows. Komunikaty te przesyłane są do kolejki komunikatów naszej aplikacji. Kiedy aplikacja jest gotowa do przetworzenia następnego komunikatu, wywołuje funkcję, która zapisuje komunikat w strukturze oraz dokonuje jego translacji i przetworzenia za pośrednictwem procedury obsługi komunikatów. Jako że chcemy, aby aplikacja działała cały czas i przetwarzała wszystkie komunikaty, zastosujemy do powtarzania wszystkich tych kroków pętlę, z której wyjście następuje z chwilą zamknięcia aplikacji przez użytkownika. Krok ten jest widoczny w wierszach od 47. do 54. Na początku deklarujemy strukturę i tworzymy pętlę komunikatów w następujący sposób: Powstała pętla, która będzie stale wykonywana aż do momentu opuszczenia aplikacji. Funkcja służy do pobrania komunikatu z kolejki komunikatów aplikacji i zapisania go w strukturze. Oto jej prototyp: Funkcja ta zwraca zero, jeżeli użytkownik kończy pracę programu, a dokładniej kiedy aplikacja otrzyma komunikat. Pierwszy parametr tej funkcji to wskaźnik struktury. Tu przechowywana będzie informacja o komunikacie. Drugi parametr to uchwyt do okna, gdzie odbieramy komunikat. Użyjemy tu, ponieważ jest to uchwyt do okna, które utworzyliśmy.n Ostatnie dwa parametry to wartości filtrów, które umożliwiają filtrowanie niektórych komunikatów. Nie będziemy ich używali, dlatego obydwómn nadajemy wartość zero. W pętli trzeba teraz dokonać translacji wszystkich wirtualnych kodów klawiszy na komunikaty znakowe. Nie jest to aż taki ważny i konieczny krok, ale gwarantuje on całkowitą integrację klawiatury z naszym programem. Wykonuje się go, wywołując z adresem komunikatu jako parametrem. Potem wystarczy jedynie za pomocą przesłać komunikat do programu obsługującego wiadomości. Czynimy to, wywołując z adresem komunikatu jako parametrem. Ostatni wiersz w to po prostu zwracana wartość funkcji zero. Obsługa komunikatów Jesteśmy już na finalnym etapie tworzenia naszej pierwszej aplikacji Windows brakuje nam jedynie programu obsługującego komunikaty. Program obsługi komunikatów

290 Część II Programowanie w środowisku Windows to funkcja, która obsługuje wszystkie komunikaty przesłane do naszego okna. Zdążyliśmy już na początku pliku zdefiniować jej prototyp, a teraz skoncentrujemy się na samej funkcji. Program obsługi komunikatów bywa też zwany po prostu programem obsługi. W systemie Windows i w niektórych dokumentach jest nazywany procedurą okna. Wszystkie te nazwy oznaczają tę samą rzecz. Kiedy użytkownik naciska klawisz lub porusza myszką, do naszej aplikacji przesyłany jest komunikat. Wówczas musimy dokonać wyboru, czy obsłużymy go sami czy pozostawimy obsługę systemowi Windows. Zwykle obsługujemy jedynie kilka komunikatów z setek możliwych. W tym programie bierzemy jedynie pod uwagę komunikat, który jest przesyłany do naszej aplikacji za każdym razem, gdy użytkownik próbuje zamknąć program. Kiedy otrzymujemy taki komunikat, obsługujemy go, wysyłając komunikat zamknięcia aplikacji za pomocą funkcji. Wróćmy jednak do kodu! Nasza funkcja obsługi komunikatów ma cztery parametry. Pierwszy z nich to uchwyt okna, które odebrało komunikat. Drugi parametr to rzeczywisty kod komunikatu, który został przesłany do tego okna. Trzeci i czwarty parametr i są parametrami komunikatu. Wrócę do nich przy okazji omawiania innych komunikatów. Wewnątrz funkcji, za pomocą instrukcji, następuje sprawdzenie, jaki komunikat został przesłany oraz jego obsługa. W naszym prostym programie interesuje nas tylko komunikat, więc tylko on zostanie obsłużony. Za pomocą poniższego wiersza kodu prosimy Windows o zamknięcie naszej aplikacjin: Funkcja ta ma tylko jeden parametr kod wyjścia, który będzie przesłany do komunikatu. Teraz, kiedy obsłużyliśmy nasze komunikaty, musimy dodać jeszcze przypadek domyślny ( ) do instrukcji, aby pozwolić systemowi Windows obsłużyć te komunikaty, których sami nie obsługujemy. W przypadku domyślnym przesyłamy komunikat funkcją z powrotem do systemu Windows w celu jego przetworzenia. Używamy do tego celu takich samych parametrówn, jakie akceptuje nasz program obsługi: Jak widać, zwracamy rezultat tej funkcji, aby system Windows wiedział, co zdarzyło się, kiedy przejęliśmy komunikat. Nie musimy się przejmować, w jaki sposób to działa w systemie Windows jest to bowiem wykonywane autonmatycznie. Tym sposobem stworzyliśmy pierwszą aplikację Windows. Nie było to zbyt trudne, prawda? Teraz dopiero zacznie się zabawa: stworzymy pętlę komunikatów działającą w czasie rzeczywistym i dokonamy jej hermetyzacji, przekształcając ją w klasę.

Rozdział 11. Wprowadzenie do programowania w Windows 291 Tworzenie pętli komunikatów działającej w czasie rzeczywistym Okno, które utworzyliśmy, sprawdzi się w normalnych aplikacjach takich jak Word czy Notatnik ale może nie sprawdzić się w grach. Tutaj potrzebujemy pętli, która jest w stanie wykonywać nasz kod zawsze, kiedy nie ma akurat żadnych oczekujących komunikatów. To właśnie pętla działająca w czasie rzecznywistym. Pseudokod objaśniający działanie takiej pętli wygląda nnastępująco: Jak przekształcić to na kod? Po pierwsze, musimy usunąć starą pętlę komunikatów i przygotować miejsce dla nowej. Zrobione? Dobrze, kontynuujmy. Z powyższego pseudokodu wynika, że pętla będzie wykonywana do chwili wyjścia, więc pierwszym krokiem jest stworzenie nieskończonej pętli, takiej jak: Teraz, gdy jesteśmy już w pętli, musimy określić, czy w kolejce okna oczekują jakieś komunikaty. Realizuje to wywołanie. Funkcja ta działa podobnie do, z tym że zwraca, jeżeli znajdzie jakieś oczekujące komunikaty, lub, jeżeli kolejka jest pusta. Oto jej definicja: Wkrótce wykorzystamy wartość zwracaną przez tę funkcję, najpierw jednak zajmijmy się jej parametrami. Jak widać, pierwsze cztery parametry na liście są takie same, jak w przypadku funkcji. Ich rola jest zresztą taka sama, jak w, więc nie będziemy ich teraz omawiali. Nowością jest ostatni parametr. Określa on, w jaki sposób należy obsłużyć komunikat. Jeżeli chcemy usunąć z kolejki pobierany

292 Część II Programowanie w środowisku Windows komunikat, podajemy argument, a jeśli chcemy, by komunikat pozostał w kolejce, zastosujemy argument. Ponieważ nie chcemy pozostawiać komunikatu w kolejce, usuniemy go, stosując następujący zapnis: W ten sposób sprawdzamy, czy w kolejce znajdują się jakieś komunikaty. Jeżeli tak jest, komunikat wysłany jako pierwszy jest kopiowany do i usuwany z kolejki. Następnie sprawdzamy, czy komunikat to. Oznacza on zakończenie programu. W tym celu sprawdzamy składnik z. Spójrzmy, jak zdefiniowany jest (który jest typem ): Pierwsze cztery składniki mają takie same zastosowanie jak parametry w funkcji obsługującej komunikaty. Przechowują one odpowiednio: uchwyt do okna, do którego trafił komunikat, rzeczywisty kod komunikatu i parametry komunikatu. Piąty składnik jest czasem, w którym do aplikacji został przesłany komunikat, a ostatni składnik przechowuje pozycję kursora w chwili wysłania komunikatu. Nie będziemy bezpośrednio korzystać z tych parametrów (poza kodem komunikatu), dlatego możemy je zignorować. Zatrzymaliśmy się podczas sprawdzania, czy komunikantem był. Wykonujemy to tak: Co w takim razie, jeżeli jest równe? Wtedy opuszczamy pętlę w zwykły sposób za pomocą instrukcji : A jeżeli otrzymaliśmy komunikat, ale nie jest to? Musimy wówczas przesłać go do programu obsługi komunikatów w zwykły sposób za pomocą i : W ten sposób zrealizowaliśmy obsługę komunikatów. Teraz musimy jeszcze dodać fragment kodu umożliwiający wykonanie dowolnych zadań w sytuacji, gdy nie ma komunikatów. Jak to zrobimy? Dodamy warunek do, który będzie wykonywany, jeżeli zwróci (nie ma żadnych komunikatów).

Rozdział 11. Wprowadzenie do programowania w Windows 293 Tak powstała pętla komunikatów, działająca w czasie rzeczywistym. Nie było to trudne, prawda? Poniższy listing to pełny kod aplikacji działanjącej w czasie rzeczywistym: Listing 11.2. Aplikacja działająca w czasie rzeczywistym

294 Część II Programowanie w środowisku Windows Tworzenie ogólnej klasy okna Teraz, gdy wiemy już, jak utworzyć typowe okno i ponieważ kodu tego będziemy używać wielokrotnie w każdej tworzonej aplikacji Windows, powinniśmy stworzyć własną klasę umożliwiającą wielokrotne stosowanie tego kodu, nprawda? Święta prawda! Oto definicja nagłówka klasy:

Rozdział 11. Wprowadzenie do programowania w Windows 295 Listing 11.3. Nagłówek klasy mrwindow Projekt tej klasy jest dość prosty. Mamy tu funkcję tworzącą okno () oraz funkcję uruchamiającą pętlę czasu rzeczywistego (). Poza tym mamy statyczny program obsługi komunikatów ( ), który skieruje komunikaty do naszego własnego programu obsługi komunikatów ( ). Poza tym istnieje czysto wirtualna funkcję, która jest wywoływana w każdym kadrze, w czasie którego nie ma oczekujących komunikatów. Musi ona zostać zaimplementowana w klasnie potomnej. to klasa czysto wirtualna. Aby ją wykorzystać, należy utworzyć jej klasę potomną. Aby uprościć korzystanie z klasy, użyjemy parametrów domyślnych dla. Są to dla i oraz dla utworzą one standardowe widoczne okno.

296 Część II Programowanie w środowisku Windows Listing 11.4. Klasa mrwindow Na początku dołączamy komplementarny plik nagłówka. Następnie tworzymy pusty konstruktor i destruktor. Wszystko powinnno być jasne. Listing 11.5. Klasa mrwindow cd.

Rozdział 11. Wprowadzenie do programowania w Windows 297 Kod w jest prawie taki sam, jak w poprzednich aplikacjach Windows. Wypełniamy klasę okna wszelkimi potrzebnymi informacjami, rejestrujemy klasę i tworzymy okno. Znalazło się tu tylko parę zmian, które chcę onmówić. Tym razem przechowujemy wszystkie zmienne okna (, i ) jako składniki okna, czyli, i. Po pierwsze, nazwą klasy okna będzie zawsze. Dzięki temu nasza aplikacja będzie miała tylko jedno okno (tak, jak powinnon być). Aplikacja może mieć być uruchomiona w wielu oknach, ale dla osiągnięcia najlepszej wydajności powinieneś zawsze korzystać z jednego okna używającego Direct3D i samemu dokonać jego podziału. Druga zmiana godna uwagi znajduje się w wierszu 48., gdzie ostatni parametr przekazywany jest do zamiast. Czy pamiętasz jeszcze, do czego służył ostatni parametr? Wykorzystywaliśmy go do przesyłania własnych danych do komunikatu. Użyjesz go wkrótce w programie obsługi komunikatów. Na razie zapamiętaj jedynie, że przesłany tu znostał adres Twojego okna. to komunikat przesłany do okna tuż przed powrotem sterowania z do Twojego programu. Wysyłany jest na ułamek chwili przed rzeczywistym utworzeniem okna. Ostatnia modyfikacja polega na tym, że nie używamy już, tylko. Nie używamy, ponieważ wymuszamy, aby okno było widoczne, miało pożądany rozmiar; nie używamy już także z. to funkcja API, która nadaje nazwę oknu. Z pewnych dziwnych powodów ma problemy z ustawieniem nazwy okna, kiedy wykonywane jest to w klasach, nawet jeżeli nazwa ta jest stałą. Problem ten powinien zostać naprawiony po instalacji Service Pack 2 lub kolejnych poprawek, ale nigdy nic nie wiadomo.n Najnowszy Service Pack dla Visual C++ można za darmo pobrać ze strony Microsoftu pod adresem http://msdn.microsoft.com/visualc. Pierwszy argument to uchwyt do okna, którego nazwę chcemy zmienić, a drugi to łańcuch zawierający nazwę okna.

298 Część II Programowanie w środowisku Windows Listing 11.6. Klasa mrwindow cd. Tu mamy trochę zawiłości. Mimo że jest to program obsługi komunikatów, obsługujemy tu tylko jeden komunikat. Dlaczego? Otóż program obsługi komunikatów musi być funkcją statyczną, a jak wiesz, funkcja statyczna nie ma dostępu do składników klasy. W tym przypadku Twój program obsługi komunikatów nie ma dostępu do żadnego ze składników okna, co nie jest dobre. Z tego powodu musimy użyć małego triku z klasą okna, aby skierować wszystkie komunikaty do naszego własnego programu obsługi. Zwróćmy uwagę na komunikat. Jest on przesyłany w momencie utworzenia okna i na szczęście jeden z parametrów komunikatu zawiera nasze własne dane, które przesłaliśmy do (jak pamiętamy, był to adres naszej klasy). Co tak naprawdę dzieje się w wierszach 65. i 66.? Używamy do przechowania adresu naszej klasy okna. Oto definicja : Funkcja ta jest wykorzystywana do przechowywania naszych własnych danych związanych z oknem. Pierwszy parametr to okno, w którym chcemy przechować informację