Piszę grę planszową opartą na szachownicy w czystym WinAPI i GDI. Założenia:
- Ilość pionków jest zmienna i zależy od ustawień
- Tło pól szachownicy może zmieniać się w czasie gry (podpowiedzi)
- Rysujemy w GDI, nie korzystamy z gotowych bitmap
Kod generujący szachownicę w zdarzeniu WM_PAINT może wyglądać tak:
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
Rectangle(hdc, i*20, j*20, i*20+20, j*20+20);
}
}
System wydaje komendę WM_PAINT, jeżeli choć część trzeba odrysować, czyli po zmianie rozmiaru, przywróceniu, maksymalizacji, wyświetleniu go na pierwszy plan. Rysowanie wszystkiego od nowa (całej planszy i interfejsu) nie ma sensu. Pierwsze pytanie - czy da się na stałe przykleić zawartość do okna, aby komenda WM_PAINT nie wymazywała wszystkiego i nie trzeba było rysować ponownie?
Wykonujemy ruch. Przesuwamy pionek z pozycji (1,1) na (2,2). Najprościej wywołać UpdateWindow, żeby wywołać WM_PAINT, a tam narysować planszę i pionki zgodnie ze stanem gry. Tylko po co?
GDI ma struktury zwane Rectangles oraz Regions. Jakie są główne różnice między nimi? Chodzi o zastosowania w praktyce. Funkcje i ich opisy znajdę na MSDN. Oba mechanizmy mają podobne możliwości.
Na MSDN jest przykład, gdzie funkcja RectVisible() sprawdza, czy prostokąt znajduje się w obszarze przycięcia (do odrysowania) (clipping region). Jest lepsze wyjście?
Tak, mają funkcje do przesuwania i wypełniania regionów/prostokątów. Czy to sprawi, że pionek cudowie zmieni pozycję na planszy, a kolory pól się zmienią? Raczej nie. Znów WM_PAINT całego okna bądź wybranego obszaru? To strata czasu procesora. Jakie operacje są niezbędne do tak prostych czynności: przesunięcie pionka, zmiana koloru pola, animacje?
Ostatnia rzecz - wykrywanie zdarzeń. Aktualnie znam 2 sposoby:
- Obliczyć matematycznie, które pole zostało kliknięte na podstawie (X,Y) kursora
- Użyć PtInRect() i przejechać pętelką po polach
Jakie rady dalibyście osobom, które zaczynają przygodę z WinAPI i GDI?