Глава 1. Исследование предметной области
1.1.Назначение программы и обоснование разработки
1 Используемые компоненты: tImage tTimer
Создаем Анимацию на Delphi, по дороге будут ездить на встречу друг другу автомобиль и мотоцикл. 1) И так находим изображение дороги или рисуем в программе Paint сами. Задаем размер картинки в пикселях 640*480. Для этого можем использовать программу Фотошоп или тот же Paint. Задаем имя картинке fon.bmp 2) Находим изображение или рисуем в программе Paint небольшой автомобиль установив размер картинки 110*140 пикселей задаем имя картинке avto.bmp 3) Аналогично находим изображение или рисуем в программе Paint небольшой мотоцикл установив размер картинки 110*140 пикселей задаем имя картинке moto.bmp Запускаем 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, в зависимости от того какую скорость анимации я хочу получить. 2 Полный код программы. 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; 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. Для того чтобы вывести на экран изображения нужно : 2.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.2 Загрузить изображения в эти переменные // загружаем объекты moto.LoadFromFile('moto.bmp'); // мотоцикл avto.LoadFromFile('avto.bmp'); // машина fon.LoadFromFile('fon.bmp');// фон x:=0; //начальные координаты машины y:=430; x1:=500;// начальные координаты мотоцикла y1:=380; 2.3 Установить прозрачный фон вокруг машины и мотоцикла avto.transparent:=true;//задаем прозрачность moto.transparent:=true; 2.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 3 Полный код программы: 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; end.
