Среда, 22.11.2017, 01:46
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

Меню сайта
Категории раздела
Delphi [12]
Материалы, связанные с программирование на Delphi
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » 2011 » Июль » 28 » Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
19:51
Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
Создаем Анимацию на 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 и перемещаем его на дорогу.

Должно получиться следующее:

Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.

Переходим к написанию кода:

Перед разделом 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, в зависимости от того какую скорость анимации вы хотите получить.

Полный код программы.

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.


Второй способ:

Помещаем на форму компонент 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;

end.


Нравится


Скачать исходники к примеру один можно здесь.
Скачать исходники к примеру два можно здесь.

Автор Xaramamburu. Сайт автора basicsprog.ucoz.ru
Категория: Delphi | Просмотров: 27153 | Добавил: xaramamburu | Рейтинг: 5.0/5
Всего комментариев: 5
2  
Попытался повторить ваш первый пример... Теперь у меня убегает форма в конец экрана, что делать?

0
3  
В каком способе? Да и неплохо бы было увидеть часть вашего кода.))))

4  
В первом,но я уже разобрался! Теперь ваш второй способ,сделанный вами же что-то не работает....
Спасибо!

0
5  
Не знаю, что у вас там не работает.((( Но я специально скачал сейчас оба примера с сайта и все запустилось без всяких проблем, причем запускал на разных компьютерах под Windows Vista и 7. Вы когда спрашиваете или говорите, что что - то не работает, то приводите код ошибки с описанием и строку кода в которой она происходит. А так слово не работает, например мне ничего не говорит.)))

1  
Простые 2D анимации можно делать впринципе в Пивоте. Ну это ток дляч начинающих. С пивотом познакомьтесь тут http://www.pivot-school.ru/ , довольно прикольная прога. Имхо

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Календарь
«  Июль 2011  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031
Архив записей
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 532
Уголок общения



Copyright MyCorp © 2017Конструктор сайтов - uCoz