progs.biz  
Начало>WinAPI>API>Урок 16
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

М. Фленов. Программирование на C++ глазами хакера
М. Фленов. Программирование на C++ глазами хакера
Заказать на Озоне



Яндекс-цитирования

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))
    {
    ...

Все! Можно запускать и играть.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев