Windows API Урок 16. Практика - небольшая игрушка
На этом уроке мы напишем небольшую игрушку. Представлять она из себя будет следующее - в случайном месте окна будет появляться круг. Появляться он будет сначала раз в 2 секунды. Игрок будет стремиться попасть в круг мышкой. После попадания круг будет менять свое положение в два раза чаще. Кроме того, в заголовке окна будет появляться число раз, которое игрок попал по кругу.
Вот код из оконной процедуры:
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
// Статические переменные для центра рисуемого круга.
static int x, y;
// Статические переменные для размера окна.
static int size_x, size_y;
// Переменные для координат щелчка мыши.
int click_x, click_y;
// Статическая переменная для интервала таймера.
static int interval = 2000;
// Число попаданий.
static int k;
HDC hdc;
PAINTSTRUCT ps;
switch (Message){
case WM_SIZE:
//Запоминаем текущие размеры окна.
size_x = LOWORD(lparam);
size_y = HIWORD(lparam);
break;
case WM_TIMER:
// Получаем случайным образом центр круга.
x = rand()%size_x;
y = rand()%size_y;
// Перерисовываем.
InvalidateRect(hwnd, NULL, TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// Рисуем круг.
Ellipse(hdc, x-15, y-15, x+15, y+15);
EndPaint(hwnd, &ps);
break;
case WM_LBUTTONUP:
// Получаем место, в котором щелкнули мышкой.
click_x = LOWORD(lparam);
click_y = HIWORD(lparam);
// Если попали.
if (x-15<click_x && click_x<x+15 && y-15<click_y && click_y<y+15) {
// Увеличиваем счетчик.
k++;
// Изменяем заголовок окна.
char s[3];
SetWindowText(hwnd, itoa(k, s, 10));
// Уменьшаем интервал для таймера.
interval/=2;
KillTimer(hwnd, 1);
SetTimer(hwnd, 1, interval, NULL);
}
break;
...
В этом фрагменте мы по таймеру получаем случайные координаты для центра круга (причем центр круга может оказаться в любой точке нашего окна) и перерисовываем. Затем мы сравниваем место, в котором игрок щелкает мышкой с расположением круга. Ели попали, то уменьшаем интервал у таймера (путем убивания старого таймера и создания нового с таким же идентификатором) и увеличиваем число в заголовке окна на 1. Обратите внимание, что часть переменных мы объявили как static - для того, чтобы они сохраняли свое значение между вызывами оконной процедуры.
Разумеется, в программе должен быть задан таймер. Например, вот так:
int WINAPI WinMain(
...
UpdateWindow(hwnd);
SetTimer(hwnd, 1, 2000, NULL);
while(GetMessage(&msg,NULL,0,0))
{
...
Все! Можно запускать и играть.
|