Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Программная реализация



Пожалуй, самой трудоёмкой частью работы является подготовка «киноленты» - рисование последовательности кадров мультфильма. На этом этапе хорошим помощником будет любой графический редактор, который позволяет использовать работу со слоями. Изображение может храниться в любом из форматов, поддерживаемых классом GDI++: bmp, gif, exig, jpg, png, tiff. Предположим, последовательность кадров, которую мы хотели бы «оживить», выглядит следующим образом.

Показ реализуется достаточно легко: подтверждением тому служит приведенный ниже пример кода. Результат его выполнения вы увидите под кнопкой «;-)» в окне «примеры». Частота вывода кадров определяется интервалом таймера и подбирается опытным путём.

System::Drawing::Graphics ^g;//указатель на объект Graphics

System::Drawing::Bitmap ^canvas;//указатель на битовое изображение

System::Drawing::Image^ tape; //указатель на объект Image - «кинолента»

int c, cw, ch, f;

private: System::Void smile_click

(System::Object^sender,System::EventArgs^e)

{

/*«Кинолента» - изображение, содержащее последовательность кадров для анимации. Изображение может храниться в любом из следующих форматов: BMP, GIF, EXIG, JPG, PNG и TIFF.*/

tape=Image::FromFile("smile.jpg");

c=8; //Количество кадров в «киноленте».

cw=tape->Width/c; /*Ширина одного кадра - общая длина ленты, делённая на количество кадров в ней.*/

ch=tape->Height; /*Высота одного кадра совпадает с высотой «киноленты».*/

canvas=gcnew Drawing::Bitmap(cw,ch); /*Битовое изображение, которое будет использоваться для получения отдельного кадра.*/

g=System::Drawing::Graphics::FromImage(small_canvas);

f=-1; //Счетчик количества итераций.

timer_smile->Enabled=true; //Запуск обработчика таймера.

}

/*Управление анимацией с помощью таймера.*/

private: System::Void timer_smile(System::Object^ sender,\

System::EventArgs^e)

{

if(++f>=с) /*Если все кадры уже показаны, воспроизведение мультфильма прекращается.*/

{

f=-1;

timer_smile->Enabled=false;

}

/*Получение очередного кадра: копирование части изображения, содержащего все кадры мультфильма (об использовании метода DrawImage подробнее смотрите в уроке «Использование графических примитивов»). Положение верхнего левого угла копируемой области определяется сдвигом вдоль оси Х на общую ширину уже показанных кадров.*/

g->DrawImage(tape, Rectangle(0,0,cw,ch),\

Rectangle(f*cw,0,cw,ch),GraphicsUnit::Pixel);

/*Вывод полученного кадра на экран с помощью свойства Image компонента PictureBox.*/

animation_screen->Image=canvas;

}

Закончились кадры ленты - закончился и сам мультфильм? Совсем не обязательно. Несколько изменив обработчик таймера, получим эффект циклической прокрутки ленты. Следующий код демонстрирует один из вариантов его реализации (инициализация анимационного процесса опущена).

/*Переменные инициализируются так же, как и в предыдущем примере; flag1 - переменная типа int, счетчик количества прокруток ленты. Её начальное значение равно 0.*/

private: System::Void timer_1

(System::Object^ sender, System::EventArgs^ e)

{

if((++f)>c&&flag1<6)

//Кадры закончились, но показ мультфильма не завершён.

{

f=1;//Перемещение ко второму кадру последовательности.

flag1++;//Счетчик количества прокруток ленты (полных циклов).

}

else if(flag1>=6) //Окончание показа после пяти полных циклов.

{

f=4; //На экран будет выведен пятый кадр ленты.

flag1=0;

timer_1->Enabled=false;

}

/*Вывод очередного кадра на экран. Ширина, высота кадра - cw,ch соответственно.*/

g->DrawImage(tape,Rectangle(0,0,cw,ch),Rectangle(f*cw,0,cw,ch),\

GraphicsUnit::Pixel);

animation_screen->Image=small_canvas;

}

Пример использования циклической прокрутки кадров мультфильма вы увидите, нажав на кнопку «летнее утро»в окне «примеры».

Возможна ситуация, когда сюжет предполагает многократное повторение не всей «киноленты», а отдельных её участков. Одно из решений этой проблемы - удлиннение ленты путём вставки в неё соответствующих последовательностей кадров в местах, предусмотренных сюжетом. Другое - манипулирование направлением прокрутки мультфильма: несложно догадаться, как, например, добиться смены кадров ленты в обратном направлении или «пропустить» некоторые из них, чтобы продолжить показ с нужного кадра. Подобные приёмы использованы в мультфильме «клоун-жонглёр», который вы увидите под соответствующей кнопкой в окне «примеры».

Задание на лабораторную работу №7

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





Дата публикования: 2015-04-10; Прочитано: 262 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...