Главная » 2011»Июль»28 » Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
19:51
Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
Используемые компоненты:
TImage (Графический холст) находится на вкладке Additional. TTimer (Таймер) находится на вкладке System.
Сегодня я расскажу как создать несложную анимацию, по дороге будут ездить на встречу друг другу автомобиль и мотоцикл.
1) И так находим изображение дороги или рисуем в программе Paint сами. Задаем размер картинки в пикселях 640*480. Для этого можем использовать программу Фотошоп или тот же Paint. Задаем имя картинке fon.bmp
2) Находим изображение или рисуем в программе Paint небольшой автомобиль установив размер картинки 110*140 пикселей задаем имя картинке avto.bmp
3) Аналогично находим изображение или рисуем в программе Paint небольшой мотоцикл установив размер картинки 110*140 пикселей задаем имя картинке moto.bmp
Теперь немного теории. Существует несколько способов сделать анимацию на экране, мы рассмотрим два наиболее простых.
Первый способ заключается в том что мы помещаем на форму несколько компонентов TImage в нашем случае 3. Один в один из них загружаем фон, а в два других изображение мотоцикла и автомобиля соответственно и в режиме таймера будем изменять положения компонетов TImage с изображением автомобиля и мотоцикла относительно фона.
Второй способ заключается в том, что мы создаем для нашего случая 4 объекта типа TBitMap, в первый загружаем фон, во второй - автомобиль, в третий - мотоцикл, а четвертый будет буфером обмена в котором мы вначале будем формировать картинку, а потом выводить ее на экран. Это необходимо делать для того чтобы избежать мерцания картинки на экране во время движения в результате ее перерисовки. Если эффект мерцания для вас не существенен, то можно выводить изображение сразу на экран.
Рассмотрим первый способ.
Запускаем Delphi и создаем новое приложение: File->New->VCL Forms Application – Delphi.
Кидаем на форму три компонента TImage из вкладки Additional и компонент TTimer из вкладки System.
В компонент Image1 в свойство Picture загружаем подготовленный нами файл fon.bmp, свойство Align устанавливаем alClient. А форму растянем до размеров фона. В компонент Image2 в свойство Picture загружаем подготовленный нами файл avto.bmp и перемещаем его на дорогу. В компонент Image3 в свойство Picture загружаем подготовленный нами файл moto.bmp и перемещаем его на дорогу.
Должно получиться следующее:
Переходим к написанию кода:
Перед разделом type добавим раздел const и объявим две константы
const scr_width = 640; // ширина формы scr_height = 480; // высота формы
В разделе var объявим переменные x,y,x1,y1 типа integer.
var Form1: TForm1; x,y,x1,y1:integer;
Далее дваждыщелкаем на компоненте таймер и пишем следующий код процедуры:
procedure TForm1.Timer1Timer(Sender: TObject); begin x:=x+2;//текущая координата + шаг для автомобиля x1:=x1-2;//текущая координата + шаг для мотоцикла if x>scr_width+image2.Width then x:=-image2.Width;// ограничение справа if x1<-image3.Width then x1:=scr_width;// ограничение слева //рисуем image2.Left:=x; image3.Left:=x1; end;
Думаю здесь все понятно.
В свойствах таймера свойство интервал устанавливаем в пределах от 1 до 100, в зависимости от того какую скорость анимации вы хотите получить.
const scr_width = 640; // ширина формы scr_height = 480; // высота формы
type TForm1 = class(TForm) Timer1: TTimer; Image1: TImage; Image2: TImage; Image3: TImage; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
x,y,x1,y1:integer; implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); begin x:=x+2;//текущая координата + шаг для автомобиля x1:=x1-2;//текущая координата + шаг для мотоцикла if x>scr_width+image2.Width then x:=-image2.Width;// ограничение справа if x1<-image3.Width then x1:=scr_width;// ограничение слева //рисуем image2.Left:=x; image3.Left:=x1; end;
end.
Второй способ:
Помещаем на форму компонент TImage и компонент TTimer. Для компонента Image1 свойство Align устанавливаем alClient. А для формы свойство AutoSize устанавливаем True.
Объявляем константы
const scr_width = 640; // ширина экрана scr_height = 480; // высота экрана
В описании переменных var объявляем четыре переменных для хранения графических картинок, тип tbitmap var fon:tbitmap;//Графический образ Фона avto:tbitmap;//Графический образ автомобиля moto:tbitmap;//Графический образ мотоцикла scr_buffer:tbitmap;//Графический образ автомобиля x,y,x1,y1:integer;//координаты автомобиля и мотоцикла
Для того чтобы вывести на экран изображения нужно : 1) Активировать созданные переменные //создаем объекты fon:=TBitmap.Create; // фон moto:=TBitmap.Create;// мотоцикл avto:=TBitmap.Create; // машина scr_buffer:=TBitmap.Create; // буфер обмена scr_buffer.Width:=scr_width; // ширина буфера scr_buffer.Height:=scr_height; // высота буфера
2) Загрузить изображения в эти переменные // загружаем объекты moto.LoadFromFile('moto.bmp'); // мотоцикл avto.LoadFromFile('avto.bmp'); // машина fon.LoadFromFile('fon.bmp');// фон x:=0; //начальные координаты машины y:=430; x1:=500;// начальные координаты мотоцикла y1:=380;
3) Установить прозрачный фон вокруг машины и мотоцикла avto.transparent:=true;//задаем прозрачность moto.transparent:=true;
4) И наконец вывести эти изображения на графический холст Image //ление координат x:=x+2;//текущая координата + шаг для автомобиля x1:=x1-2;//текущая координата + шаг для мотоцикла if x>scr_width+avto.Width then x:=-avto.Width;// ограничение справа if x1<-moto.Width then x1:=scr_width;// ограничение слева //рисуем scr_buffer.Canvas.Draw(0,0,fon);//возобновление фона scr_buffer.Canvas.Draw(x1,y1,moto);//движение мотоцикла scr_buffer.Canvas.Draw(x,y,avto);//движение машины form1.Canvas.Draw(0,0,scr_buffer); //копируем содержимое буфера на экран
При этом первая цифра в скобках, это координата x, а вторая цифра соответственно координата y 5) Для того , чтобы изображения стали двигаться, необходимо динамически менять координаты изображений на холсте, желательно стирая старое изображение. Эту задачу выполняет компонент Timer
Полный код программы:
unit anim;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; const scr_width = 640; // ширина экрана scr_height = 480; // высота экрана type TForm1 = class(TForm) Timer1: TTimer; Image1: TImage; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; fon:TBitmap; moto:TBitmap; scr_buffer:TBitmap; avto:TBitmap; x,y,x1,y1:integer; implementation
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin scr_buffer.Free; fon.Free; moto.Free; avto.Free; end;
procedure TForm1.FormCreate(Sender: TObject); begin //создаем объекты fon:=TBitmap.Create; // фон moto:=TBitmap.Create;// мотоцикл avto:=TBitmap.Create; // машина scr_buffer:=TBitmap.Create; // буфер обмена scr_buffer.Width:=scr_width; // ширина буфера scr_buffer.Height:=scr_height; // высота буфера // загружаем объекты moto.LoadFromFile('moto.bmp'); // мотоцикл avto.LoadFromFile('avto.bmp'); // машина fon.LoadFromFile('fon.bmp');// фон x:=0; //начальные координаты машины y:=430; x1:=500;// начальные координаты мотоцикла y1:=380; avto.transparent:=true;//задаем прозрачность moto.transparent:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin x:=x+2;//текущая координата + шаг для автомобиля x1:=x1-2;//текущая координата + шаг для мотоцикла if x>scr_width+avto.Width then x:=-avto.Width;// ограничение справа if x1<-moto.Width then x1:=scr_width;// ограничение слева //рисуем scr_buffer.Canvas.Draw(0,0,fon);//возобновление фона scr_buffer.Canvas.Draw(x1,y1,moto);//движение мотоцикла scr_buffer.Canvas.Draw(x,y,avto);//движение машины form1.Canvas.Draw(0,0,scr_buffer); //копируем содеримое буфера на экран end;
Не знаю, что у вас там не работает.((( Но я специально скачал сейчас оба примера с сайта и все запустилось без всяких проблем, причем запускал на разных компьютерах под Windows Vista и 7. Вы когда спрашиваете или говорите, что что - то не работает, то приводите код ошибки с описанием и строку кода в которой она происходит. А так слово не работает, например мне ничего не говорит.)))
Простые 2D анимации можно делать впринципе в Пивоте. Ну это ток дляч начинающих. С пивотом познакомьтесь тут http://www.pivot-school.ru/ , довольно прикольная прога. Имхо
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]