Отправляет email-рассылки с помощью сервиса Sendsay

Windows API

  Все выпуски  

Windows API


Информационный Канал Subscribe.Ru


Windows API. Уроки с сайта http://progs.biz

Рассылка № 14

Windows API. Урок 16. Практика - небольшая игрушка.

Полные версии уроков (с картинками) можно найти по адресам:
Урок 16. Практика - небольшая игрушка.

Н. Секунов. Программирование на C++ в Linux.
Н. Секунов. Программирование на C++ в Linux
Заказать на Озоне

Подробнее

Рассылки сайта progs.biz через subscribe.ru
Уроки по C# и .NET
Уроки по C# - новому языку от Microsoft для платформы .NET. Создание разных типов приложений (консольные, для Windows, веб-приложения), работа с базами данных, создание собственных компонентов. Примеры, исходники, статьи, FAQ.

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

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

Наверх

PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка .NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru
Copyright Алексеев Игорь, 2002-2004
Copyright сайт progs.biz, 2002-2004
Распространение материалов без разрешения владельцев авторских прав запрещено.


BannerDrive.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное