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

Примеры движения по более сложным траекториям



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

· Pacman

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

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

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

// animation_screen - компонент PictureBox.

int i, X=animation_screen->Width, Y=animation_screen->Height;

System::Drawing::Rectangle block; /*Прямоугольник, определяющий границы затираемой области изображения.*/

float r, fi, x, y;

/*Функция, с помощью которой рисуется pacman. В качестве параметров ей передаются координаты центра круга, его радиус, величина вырезаемого углового сектора в градусах, направление движения. Листинг опущен.*/

void draw_pacman(int x,int y,int r, int fi, int side);

/*Функция, рисующая привидение. Параметры: координаты центра выводимой картинки и переменная, определяющая характер трансформации битового изображения. Листинг опущен.*/

void draw_ghost(int p, int q, int s);

//Инициализация анимации.

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

System::EventArgs^ e)

{

canvas = gcnew Drawing::Bitmap(X,Y);

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

/*Подготовка фоновой картинки - рисование стенок лабиринта и «пути перемещения» с помощью кружочков. Эта часть кода опущена.*/

//Инициализация переменных, используемых обработчиком таймера.

fi=2.7;

i=1; //Итерационная переменная.

draw_pacman(X, Y/10, 40,0, 1, 0); //Первая фигурка pacman’а.

//Определение границ затираемой области.

block=Rectangle(X-40,Y/10-40,85,85);

//Вывод первоначальной картинки на экран.

animation_screen->Image=canvas;

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

first_timer->Start();

}

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

System::EventArgs^ e)

{

int a[]={0,30,60,30};/Массив констант, определяющих величину углового сектора, которая передаётся функции drew_pacman в качестве одного из параметров.*/

SolidBrush^ br = gcnew SolidBrush(Color::Gray);

//Затирание области, в которой была выведена фигурка на прошлой итерации.

g->FillRectangle(br, block);

if(i<=68) //Анимация активна.

{

if(i<10||(i>=24&&i<33)||(i>=47&&i<56)) //Перемещение слева направо.

{

//Определение положения pacman’а на текущей итерации, рисование фигуры.

draw_pacman(X-50*((i%23)%10), Y/10*(1+(i/23)*4), 40,a[i%5], 1);

//Определение границ области, которая будет затёрта на следующем шаге.

block=Rectangle(X-50*((i%23)%10)-40, Y/10*(1+(i/23)*4)-40, 85,85);

}

else if(i<=12||(i>=33&&i<=35))//Движение сверху вниз в левой части поля.

{

draw_pacman(Y/10,Y/10*(1+(i/23)*4)+Y/10*((i%23)%10),40,a[i%5], 2);

block=Rectangle(Y/10-40, Y/10*(1+(i/23)*4)+Y/10*((i%23)%10)-40, 85,85);

}

else if(i<22||(i>35&&i<45)) //Перемещение справа налево.

{

draw_pacman(Y/10+50*(((i-2)%23)%10),Y/10*(3+(i/23)*4),40,a[i%5], 3);

block=Rectangle(Y/10+50*(((i-2)%23)%10)-40,Y/10*(3+(i/23)*4)-40,85,85);

}

else if(i<=23||(i>=45&&i<=46))//Движение сверху вниз в правой части поля.

{

draw_pacman(X-Y/10, 3*Y/10+Y/10*((i-1)%10), 40,a[i%5], 4);

block=Rectangle(X-Y/10-40, 3*Y/10+Y/10*((i-1)%10)-40, 85,85);

}

else if(i<=66)

{

//Перемещение слева направо.

g->FillRectangle(br, 0, 0,X,Y);

/*Определение положения центра картинки с привидением - параметров, передаваемых в функцию draw_ghost.*/

r=-770/fi;

x=r*cos(fi);

y=r*sin(fi);

fi+=0.09;

//Рисование привидения.

draw_ghost(X/2-100+x, Y/2+40-y, (i%2)-((i+1)%2));

//Рисование pacman’а.

draw_pacman(Y/10+20*(i%56), Y-Y/10-20*(i%56), 10*(i%55),a[i%5], 3);

}

}

else //Прекращение анимации.

first_timer->Stop();

}

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

Нарисовать отдельную геометрическую фигуру изменяющегося размера, которая передвигается вдоль прямой, не представляет большого труда. Потому для самопроверки предлагается реализовать более интересные примеры: движение по сложным траекториям (например, вдоль кривых, графики которых вы строили, выполняя задание первой лабораторной J), синхронное движение нескольких объектов (плывущий кораблик, или падающие снежинки, или летящая бабочка), получение различных эффектов с изменяющимся цветом, изменяющейся формой.





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



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