Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
FAQC++.doc
Скачиваний:
13
Добавлен:
10.02.2015
Размер:
1.55 Mб
Скачать

Как сделать анимацию?

Анимация представляет собой смену изображений окна через определенный промежуток времени. Каждый кадр представляет собой набор графических объектов в определенном состоянии и положении. Через некоторое время состояние и/или положение объекта должно измениться, и новый кадр должен быть нарисован заново. Таким образом, при формировании анимации требуется:

  • Создать переменные класса, которые будут хранить состояние объектов на кадре;

  • В зависимости от значений этих переменных рисовать кадр в функции-обработчике события Paint формы;

  • Создать таймер, который будет генерировать событие Tick через определенный интервал времени (интервал смены кадров);

  • В обработчике события Tick таймера предусмотреть изменение переменных, описывающих состояние объектов кадра, и вызвать перерисовку формы, чтобы отобразить новый кадр.

Например, пусть прямоугольник передвигается по диагонали из левого верхнего угла в правый нижний. При достижении края окна, он должен остановиться. Код обработчиков событий в классе Form1 может быть следующим:

public ref class Form1 : public System::Windows::Forms::Form

{

// переменные для хранения координат фигуры

int x, y;

Timer^ MyTimer;

public:

Form1(void)

{

InitializeComponent();

// начальные значения координат фигуры

x=0; y=0;

// запускаем таймер

MyTimer->Start();

}

protected:

~Form1()

{

if (components)

delete components;

}

private: System::ComponentModel::IContainer^ components;

#pragma region Windows Form Designer generated code

void InitializeComponent(void)

{

this->components = (gcnew System::ComponentModel::Container());

this->MyTimer = (gcnew System::Windows::Forms::Timer(this->

components));

this->SuspendLayout();

//

// MyTimer

//

// задаем интервал времени, через который будет срабатывать таймер

// (в миллисекундах)

this->MyTimer->Interval = 50;

// определяем обработчик события Tick

this->MyTimer->Tick += gcnew System::EventHandler(this,

&Form1::MyTimer_Tick);

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(292, 266);

this->Name = L"Form1";

this->Text = L"Form1";

this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this,

&Form1::Form1_Paint);

this->ResumeLayout(false);

}

#pragma endregion

// обработчик события Paint

private: System::Void Form1_Paint(System::Object^ sender,

System::Windows::Forms::PaintEventArgs^ e) {

(e->Graphics)->FillRectangle(Brushes::MediumTurquoise,x,y,100,100);

}

// обработчик события таймера – изменение положения прямоугольника и

// вызов перерисовки окна

private: System::Void MyTimer_Tick(System::Object^ sender,

System::EventArgs^ e) {

// запоминаем текущие координаты прямоугольника

int prev_x = x, prev_y = y;

// изменение координаты x, если прямоугольник остается в окне

if (x + 50 < ClientSize.Width)

x += 5;

// изменение координаты y, если прямоугольник остается в окне

if (y + 50 < ClientSize.Height)

y += 5;

// если координаты прямоугольника не изменились, он достиг правого нижнего

// угла окна, поэтому можно остановить таймер

if (x == prev_x && y == prev_y)

MyTimer->Stop(); // остановка таймера

// вызов перерисовки окна

Refresh();

}

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]