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

Введение в анимацию



Анимация - движущаяся графика - представляет собой воспроизведение последовательности картинок, создающее эффект движущегося изображения. При этом мозг человека воспринимает группу слегка отличающихся друг от друга изображений как непрерывно изменяющееся единое целое. Смена изображений может осуществляться как последовательная прорисовка - стирание картинки или как смена готовых кадров.

Начнем знакомство с первым способом создания динамичных графических объектов.

4.1 Timer: принцип работы

При воспроизведении фильма проектор показывает кадры с определённой частотой. Аналогично выполняется анимация на компьютере: в программе создаётся объект Timer, который используется для вызова события через определённые пользователем интервалы времени. Очевидно, в рассматриваемом нами случае через определённые интервалы времени будут выводиться кадры «мультфильма».

Следующий код выполняет вывод на форму цифр от 0 до 9 в порядке возрастания.

private: System::Windows::Forms::Timer^ timer_1;

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

int i;

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

System::EventArgs^ e)

{

g= my_example_form::CreateGraphics();

i=0;

timer_1->Start();

}

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

System::EventArgs^ e)

{

//установка шрифта для вывода текста

String^ drawString;

System::Drawing::SolidBrush^ drawBrush = gcnew

System::Drawing::SolidBrush(System::Drawing::Color::Black);

System::Drawing::Font^ drawFont =

gcnew System::Drawing::Font("Arial", 12);

if(i<=9)

{

//вывод очередной цифры на экран

drawString=i.ToString();

g->DrawString(drawString, drawFont,drawBrush, 20+10*i, 10);

i++;

}

else

my_second_timer->Enabled=false;

}

Обратите внимание на то, что итерационная переменная инициализируется не в теле функции, вызываемой объектом Timer, а в теле функции, которая запускает сам таймер. Дело в том, что Timer вызывает событие Tick через определённые интервалы времени, и значение локальной переменной в этом случае, очевидно, не сохраняется от одного вызова функции до другого. Иными словами, совершенно закономерным будет то, что выполнение кода, казалось бы, аналогичной функции, написанного ниже, приведет к следующему: кроме цифры 0 на экране мы ничего не увидим.

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

System::EventArgs^ e)

{

int i=0;

//установка шрифта для вывода текста

String^ drawString;

System::Drawing::SolidBrush^ drawBrush = gcnew

System::Drawing::SolidBrush(System::Drawing::Color::Black);

System::Drawing::Font^ drawFont =

gcnew System::Drawing::Font("Arial", 12);

if(i<=9)

{

//вывод очередной цифры на экран

drawString=i.ToString();

g->DrawString(drawString, drawFont,drawBrush, 20+10*i, 10);

i++;

}

else

my_second_timer->Enabled=false;

}

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

//указатель на объект timer, управляющий анимацией

private: System::Windows::Forms::Timer^ my_timer;

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

int i;

Point cursor_pos;

//Обработчик щелчка левой кнопки мыши.

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

System::Windows::Forms::MouseEventArgs^ e)

{

/*Получение координат точки, в которой был произведён щелчок. Свойство Position позволяет получить координаты курсора в системе отсчета, связанной с экраном (точка (0,0) находится в его левом верхнем углу). Функция PointToClient() выполняет перевод полученных координат курсора в систему отсчета, связанную с формой.*/

cursor_pos=this->PointToClient(Cursor->Position);

g=my_example_form::CreateGraphics();

i=0;

//Запуск таймера.

my_timer->Start();

}

//Обработчик таймера.

private:

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

{

int j, colors[]={255, 255,0,0,255,0},t;

/*Инициализация кисти. Цвет и прозрачность изменяются при последовательных вызовах функции в зависимости от значения итерационной переменной.*/

System::Drawing::SolidBrush^ fill_brush = gcnewSystem::Drawing::SolidBrush(System::Drawing::Color::FromArgb\

(10*i%256,colors[(i/2)%6], colors[(i/2+1)%6],colors[(i/2+2)%6]));

if(i<=12) //Условие продолжения рисования кадров анимации.

{

i+=2; //Изменение итерационной переменной.

g->Clear(Color::White); //Очистка экрана (затирание изображения).

for(t=1; t<=i/2; t++)

for(j=1; j<=8; j++)

/*Рисование и вывод на экран очередного кадра. Кадр представляет собой несколько концентрических окружностей, вдоль каждой из которых расположены 8 кругов.*/

{

g->FillEllipse(fill_brush,(cursor_pos.X)+(2.7*cos(pi/8+j*pi/4)\

+0.25)*t*i,(cursor_pos.Y)+2.7*t*i*sin(pi/8+j*pi/4)+0.25*t*i,\

(float)t*i/2, (float)t*i/2);

g->FillEllipse(fill_brush, (cursor_pos.X)+3.5*t*i*cos(j*pi/4),\

(cursor_pos.Y)+3.5*t*i*sin(j*pi/4), (float)t*i, (float)t*i);

}

}

else //Остановка таймера (завершение анимации).

{

g->Clear(Color::White);

my_timer->Stop();

}

}





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



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