![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Пожалуй, самой трудоёмкой частью работы является подготовка «киноленты» - рисование последовательности кадров мультфильма. На этом этапе хорошим помощником будет любой графический редактор, который позволяет использовать работу со слоями. Изображение может храниться в любом из форматов, поддерживаемых классом 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; Прочитано: 273 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!