18. Работа с изображениями

Занятие 18


Это надо знать

Возможно ли организовать движение изображений, которые мы загружаем? На предыдущих уроках мы перемещали героев, изображения которых мы описывали при помощи функций рисования, по траектории и при помощи клавиш. Аналогично мы можем организовать и перемещение изображений.

Изображения. которые мы будем использовать в нашей программе:

backgr.bmp    - фон (размер 960 на 556);
hare.bmp        - заяц (размер 135 на 200, цвет фона RGB (3, 79, 42));
sun.bmp         - солнце (размер 100 на 100, цвет фона RGB (3, 79, 42));
ghost.bmp      - привидение (размер 50 на 50, цвет фона RGB (3, 79, 42));

Для загрузки всех изображений нам надо будет написать следующие команды:

HDC backImage = txLoadImage ("images/backgr.bmp");
if (!backImage) {txMessageBox ("Ошибка при загрузке backgr.bmp"); return 1;}


HDC hareImage = txLoadImage ("images/hare.bmp");
if (!hareImage) {txMessageBox ("Ошибка при загрузке hare.bmp"); return 1;}


HDC sunImage = txLoadImage ("images/sun.bmp");
if (!sunImage) {txMessageBox ("Ошибка при загрузкеsun.bmp"); return 1;}


HDC ghostImage = txLoadImage ("images/ghost.bmp");
if (!ghostImage) {txMessageBox ("Ошибка при загрузке ghost.bmp"); return 1;}


Функция для загрузки изображений

Как видим, мы повторяем запись одних и тех же команд, поэтому напишем функцию для загрузки изображения:

HDC LoadImage (const char name[])
    {
    char fileName[50] = "";                                       // переменная для имени файла
    sprintf (fileName, "images/%s.bmp", name);   // в переменной fileName формируем имя файла для загрузки
    HDC Image = txLoadImage (fileName);            // в переменную Image помещаем изображение
    if (!Image)                                                             // проверяем, загружено ли изображение
        {
        char str[100] = "";
        sprintf (str, "Не загружено изображение: '%s'", fileName);
        txMessageBox (str);
        }
    return Image;                                                      // возвращаем изображение
    }

Тогда команды для загрузки всех изображений будут записаны так:

    HDC backImage   = LoadImage ("backgr");
    HDC hareImage   = LoadImage ("hare");
    HDC sunImage    = LoadImage ("sun");
    HDC ghostImage = LoadImage ("ghost");


Движение по траектории

Создадим движение привидения по траектории. Для движения по траектории будем использовать уже известную нам функцию:

void MoveGhost (Character* hero, double dt)
    {
    int szX = txGetExtentX(), szY = txGetExtentY();

    hero->x = hero->x + hero->vx * dt;
    hero->y = hero->y + hero->vy * dt;
    hero->vx = hero->vx + hero->ax * dt;
    hero->vy = hero->vy + hero->ay * dt;

    if (hero->x > szX - hero->sizeX/2)
        {
        hero->vx = - hero->vx;
        hero->x = 2 * (szX - hero->sizeX/2) - hero->x;
        }

    if (hero->y > szY - hero->sizeY/2)
        {
        hero->vy = - hero->vy;
        hero->y = 2 * (szY - hero->sizeY/2) - hero->y;
        }

    if (hero->x < 0)
        {
        hero->vx = - hero->vx;
        hero->x = 5 + hero->x;
        }

    if (hero->y < 0)
        {
        hero->vy = - hero->vy;
        hero->y = 5 + hero->y;
        }
    }


Вызов функции:

MoveGhost (&Ghost, dt);


Управление клавишами

Перемещение зайца будет зависеть от клавиш Вверх, Вниз, Влево, Вправо:

void Control (Character* hero, int KeyForRight, int KeyForLeft, int KeyForUp, int KeyForDown)
    {
    double step = 2;

    if (GetAsyncKeyState (KeyForRight)) (hero->x) += step;
    if (GetAsyncKeyState (KeyForLeft)) (hero->x) -= step;
    if (GetAsyncKeyState (KeyForUp)) (hero->y) -= step;
    if (GetAsyncKeyState (KeyForDown)) (hero->y) += step;
    }


Вызов функции:

Control (&Hare, VK_RIGHT, VK_LEFT, VK_UP, VK_DOWN);


Движение по кругу

Солнце будет двигаться по окружности, для этого напишем функцию:

void MoveSun (double x0, double y0, Character* hero, double u)
    {
    int r = 100;
    hero->x = x0 + r * cos (3.14 * u/180);
    hero->y = y0 - r * sin (3.14 * u/180);
    }


x0 - координата х центра окружности;
y0 - координата у центра окружности;
r - радиус окружности;
u - угол вращения

Вызов функции:

MoveSun (x0, y0, &Sun, u);


Пример

В программе солнце перемещается по кругу, привидение перемещается по всему экрану, заяц управляется при помощи клавиш.

Файлы изображений

Посмотреть текст программы

Результат работы программы


Домашнее задание

Создать перемещение героев по траектории, по кругу и один из героев должен перемещаться при помощи клавиш.