Занятие 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;}
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);
Файлы изображений
Посмотреть текст программы
Результат работы программы
hero->y = y0 - r * sin (3.14 * u/180);
}
x0 - координата х центра окружности;
y0 - координата у центра окружности;
r - радиус окружности;
u - угол вращения
Вызов функции:
MoveSun (x0, y0, &Sun, u);
Пример
В программе солнце перемещается по кругу, привидение перемещается по всему экрану, заяц управляется при помощи клавиш.Файлы изображений
Посмотреть текст программы
Результат работы программы