8. Движение героев. Циклы

Занятие 8


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

Возвратно-поступательное движение

Изменение размера глаз

Как сделать, чтобы комар в нашем мультфильме открывал и закрывал глаза?

Описание функции, которая рисует комара, выглядит следующим образом:

void mosquito (int x, int y,  double sizeX,  double sizeY,  double  zoomEye,  
                          int Dwings,   int turn,  COLORREF color); 

Операторы, которые рисуют глаза комара:

    txSetFillColor (TX_WHITE);
    txCircle (x -  5 * sizeX*turn,  y - 10 * sizeY,  5 * sizeX * zoomEye);
    txCircle (x + 5 * sizeX*turn,  y - 10 * sizeY,  5 * sizeX * zoomEye);

    txSetFillColor (TX_BLACK);
    txCircle (x -  5 * sizeX*turn,  y - 10 * sizeY,  2 * sizeX * zoomEye);
    txCircle (x + 5 * sizeX*turn,  y - 10 * sizeY,  2 * sizeX * zoomEye);

Рассмотрим  5 * sizeX * zoomEye,  если zoomEye = 1, то глаз будет нарисован с заданным радиусом, если  zoomEye = 0, то при умножении на 0, мы получим радиус 0, и глаз не будет нарисован.

Команда рисования комара:

   mosquito (750 - 11*t,  480 - 6*t,  1,  1,  1,  0,  -1,  RGB (190, 190, 190));

За перемещение комара отвечает переменная t, которая изменяется от 0 до 100, т.е.
                                                   t = 0  1  2  3  4  5  6  7  ...
мы должны получать числа          0  1  0  1  0  1  0  1  ... а это - остатки от деления t на число 2.

Функция остатка от  деления t на 2 записывается так:  t%2

Команда рисования комара будет выглядеть следующим образом:

   mosquito (750 - 11*t,  480 - 6*t,  1,  1,   t%2,  0,  -1,  RGB (190, 190, 190));

Движение крыльев комара

За движение крыльев вверх-вниз отвечает параметр Dwings. 

Если параметр равен 0, то крылья не перемещаются: рисуются в указанных координатах с заданными размерами. Если мы хотим крылья перемещать, то необходимо задать расстояние, на которое крылья будут опускаться.

Пусть максимально вверх крылья могут  опуститься на 14 точек, тогда нам необходимо получать числа:
 0 1 2 3 4 ...14, а это остатки от деления числа на 15:   t%15
Если вычесть из этого выражения 5, то движение станет более плавным:    t%15 - 5

Команда рисования комара, который машет крыльями, будет выглядеть следующим образом:
   mosquito (100 + 5*t,  250,  1,  1,  t%2,  t%15 - 5,  1,  RGB (190, 190, 190));



Лягушка машет руками

В функции 
void frog     (int x, int y, double sizeX, double sizeY, double zoomEye, int leftHand, int rightHand, COLORREF color);

за поднятие и опускание рук отвечают параметры: leftHand, rightHand. Если руки поднимаются на 99 точек, то можно записать t%100, но для того, чтобы левая и правая рука поднимались не одновременно и более плавно, можно записать: t%20 * 5 для правой руки, t%10 * 10 для левой руки. Изменим размер глаз лягушки: t%3.

frog (10 + 10*t,  485 - 3*t,   0.6,   0.6,   t%3,   t%20 * 5,   t%10 * 10,   RGB ( 30, 190, 50));

Лягушка прыгает

Прыжок - это возвратно-поступательное движение вверх-вниз, т.е. необходимо изменить координату у. Для плавного изменения координаты воспользуемся функцией sin(t). Для изменения амплитуды прыжка, умножим sin(t) на 10.
frog    (10 + 10*t,  485 - 2*t + 10*sin(t),   0.6,  0.6,  t%3,  t%20 * 5,  t%10 * 10,  RGB ( 30, 190, 50));

Глаза елок

Для рисования нескольких елок мы используем функцию void forest (int x, int step, int t)
параметр t мы будем предавать при вызове функции:
forest (50, 150, t);

Функция, которая рисует елку:
void tree     (int x, int y, double sizeX, double sizeY, int leftEye, int rightEye, COLORREF color);

Вызов функции рисования одной елки запишем так:
tree (x, 50, 1, 1, t%7, t%7, RGB (145, 210, 80)); в этом случае параметры leftEye и rightEye будут изменяться от 0 до 6, что нам даст движение зрачков левого и правого глаз елок.


Пример

Внесем изменения  в наш мультфильм.

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

Результат выполнения программы


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

Внести изменения в ваш мультфильм, чтобы герои изменяли размер глаз, поднимали, опускали руки и ноги и т.д. в зависимости от переменной t.