Массивы. Анимация нескольких объектов
Анимация на си нескольких объектов.
Рассмотрим программу на си, которая будет отображать движение или анимацию нескольких графических объектов. В программе мы будем отображать перемещение нескольких автомобилей, которые находятся на разных уровнях по оси y и движутся слева направо. В начале программы задается процедура рисования и стирания изображения автомобиля.
Чтобы реализовать анимацию нескольких объектов на си, удобно использовать массивы для всех параметров. Размерности этих массивов(количество элементов) равняется количеству объектов. У каждого графического объекта (автомобиля) есть следующие параметры:координата по оси x,координата по оси y, скорость.Для каждого типа параметров введем свой массив. Подробно о работе с массивами в си можно ознакомится на уроке Массивы в Си.
Например если объектов 3 то
int x[3]; // массив координат x автомобилей
int y[3];// массив координат y автомобилей
int v[3]; // массив скоростей автомобилей
int c[3]; // массив цветов автомобилей
Соответственно координата x для 1 автомобиля будет x[1].
Далее необходимо определить начальные значения для всех массивов.
// задаем начальные координаты x
x[1]=50;
x[2]=50;
x[3]=50;
// задаем начальные координаты y
y[1]=100;
y[2]=170;
y[3]=270;
// задаем скорости
v[1]=5;
v[2]=10;
v[3]=15;
// задаем цвета автомобилей
c[1]=2;
c[2]=3;
c[3]=4;
Для реализации движения нескольких объектов необходимо в цикле for выполнять следующие действия
Рисуем все объекты
Пауза
Стираем все объекты
Изменяем координаты всех объектов
Чтобы нарисовать все объекты, необходимо использовать цикл for в котором необходимо “пробежаться” по всем элементам
// рисуем автомобили с текущими координатами
for (j=1;j<=3;j++)
{
// вызываем функцию рисования объекта с номером j, используя значения массивов для данного объекта
avto(x[j],y[j], c[j]);
}
Пример полного решения:
#include <graphics.h>
#include <conio.h>
// процедура отображения автомобиля с координатами левого верхнего угла x, y и цвет cvet
void avto (int x, int y, int cvet)
{
setfillstyle (1,cvet ); // устанавливаем вид заливки 1 -полный, цвет заливки cvet
bar(x, y, x+100, y+20);// закрашенный прямоугольник нижняя часть кузова
bar(x+20, y, x+70, y-20);// закрашенный прямоугольник верхняя часть кузова
setcolor(cvet); // устанавливаем цвет колеса
circle(x+20, y+30, 10); // левое колесо окружность ниже кузова
circle(x+70, y+30, 10); // правое колесо окружность ниже кузова
setfillstyle (1,cvet); // устанавливаем вид заливки полный - 1 цвет cvet
floodfill(x+20,y+30,cvet); // закрашиваем круг левого колеса до границы круга цветом cvet
floodfill(x+70,y+30,cvet); // закрашиваем круг левого колеса до границы круга цветом cvet
}
main()
{
int i,j; // переменные счетчиков цикла
int x[3]; // массив координат x автомобилей
int y[3];// массив координат y автомобилей
int v[3]; // массив скоростей автомобилей
int c[3]; // массив цветов автомобилей
// задаем начальные координаты x
x[1]=50;
x[2]=50;
x[3]=50;
// задаем начальные координаты y
y[1]=100;
y[2]=170;
y[3]=270;
// задаем скорости
v[1]=5;
v[2]=10;
v[3]=15;
// задаем цвета автомобилей
c[1]=2;
c[2]=3;
c[3]=4;
initwindow(500, 500);// инициализируем графическое окно
// основной цикл движения
for (i=1; i<20; i++)
{
// изменяем координаты x автомобилей
for (j=1;j<=3;j++)
{
x[j]=x[j]+v[j];
}
// рисуем автомобили с текущими координатами
for (j=1;j<=3;j++)
{
avto(x[j],y[j], c[j]);
}
//пауза
delay(100);
// стираем автомобили
for (j=1;j<=3;j++)
{
avto(x[j],y[j], 0);
}
}
// рисуем автомобили с текущими координатами
for (j=1;j<=3;j++)
{
avto(x[j],y[j], c[j]);
}
getch();
closegraph();
}
На заметку:
1. Чтобы нарисовать все объекты необходимо использовать цикл for, переменная цикла и будет номером объекта. Параметры текущего объекта (координаты, скорость, цвет) это элементы массивов с индексом равным номеру объекта.
Задания для самостоятельной работы:
1. Задайте свою процедуру рисования объекта(например корабль или человек). Измените количество объектов, сделайте движение объектов ускоренное или замедленное.
Полезно почитать по теме массивы в си
Массивы в Си
Сортировка массива на Си
Поделиться
Нет комментариев. Ваш будет первым!