Создаем Анимацию на Delphi. Построение анимированных сцен на Delphi.
Заготовки для создания
динамических игр на Delphi
Используемые компоненты
Image1 (Графический холст) находится на вкладке Additional
Timer1 (Таймер)
Цель работы.
Создадим
несложную анимацию, по морю будет плавать нарисованный нами в Paint е
кораблик, которым мы можем управлять с помощью стрелок курсора
клавиатуры
1)
И так находим изображение моря.
Задаем размер картинки в пикселях
600*400. Для этого можем использовать программу Фотошоп
или тот же Paint.
Задаем имя картинке fon.bmp
2) Рисуем в программе Paint небольшой кораблик установив размер картинки 110*140 пикселей Задаем имя картинке korb.bmp
Существенно, что вокруг кораблика белый фон.
Используя команду korb.transparent:=true;//Прозрачность вокруг контура корабля
Белый фон преобразуется в прозрачный фон.
Теперь немного теории
В описании переменных объявляем
две переменных для хранения графических картинок, тип tbitmap
fon:tbitmap;//Графический образ Фона
korb: :tbitmap;//Графический образ корабля
Для того чтобы вывести на экран изображения нужно
1)
Активировать созданные переменные
fon:=tbitmap.Create;//
korb:=tbitmap.Create;//
2) Загрузить изображения в эти переменные
fon.LoadFromFile('fon.bmp');//Загрузить в переменную 'fon' файл 'fon.bmp'
korb.LoadFromFile('korb.bmp');//Загрузить в переменную 'korb' файл 'korb.bmp'
3) Установить прозрачный фон вокруг корабля
korb.transparent:=true;//Прозрачность вокруг контура корабля
4) И наконец вывести эти изображения на графический холст Image
image1.Canvas.Draw(0,0,fon);//
image1.Canvas.Draw(x,60,korb);//
При этом первая цифра в скобках,
это координата x,
а вторая цифра соответственно координата y
5) Для того , чтобы изображения стали двигаться, необходимо динамически менять координаты изображений на холсте , желательно стирая старое изображение.
Эту задачу выполняет компонент Timer
procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+shx;//текущая координата + шаг
if x>500 then shx:=shx*-1;// ограничение справа
if x<0 then shx:=shx*-1;//ограничение слева
image1.Canvas.Draw(0,0,fon);//возобновление фона
image1.Canvas.Draw(x,60,korb);//движение корабля
end;
Один раз за одну сотую секунды он пересчитывает координату x корабля
x:=x+shx;//текущая координата , при этом переменная shx (шаг движения)
может принимать как, положительные так и отрицательные значения
С помощью двух условий создаем ограничения для движения слева и справа.
6) Чтобы, управлять кораблем стрелками клавиатуры, используем событие в evens на форме rmKeyDown
procedure TForm1.rmKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=37
then shx:=-15;//движение влево
if key=39 then shx:=15;//движение вправо
Привожу полный
исходный код программы
unit pav;
interface
uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure
Timer1Timer(Sender: TObject);
procedure rmKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private
declarations }
public
{ Public
declarations }
end;
//Описание типов переменных
var
Form1: TForm1;
fon:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ Фона
KORB:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ корабля
x:integer;//координаты X корабля
shx:integer;//Шаг движения корабля по X
implementation
{$R *.DFM}
//Старт главной формы
procedure
TForm1.FormCreate(Sender: TObject);
begin
shx:=6;
//
fon:=tbitmap.Create;//
korb:=tbitmap.Create;//
//
fon.LoadFromFile('fon.bmp');//Загрузить в
переменную 'fon' файл 'fon.bmp'
//
korb.LoadFromFile('korb.bmp');//Загрузить в
переменную 'korb' файл 'korb.bmp'
korb.transparent:=true;//Прозрачность вокруг контура корабля
//
image1.Canvas.Draw(0,0,fon);//
image1.Canvas.Draw(x,60,korb);//
end;
//Работа таймера движение корабля
procedure
TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+shx;//текущая координата + шаг
if x>500 then shx:=shx*-1;// ограничение справа
if x<0 then shx:=shx*-1;//ограничение слева
image1.Canvas.Draw(0,0,fon);//возобновление фона
image1.Canvas.Draw(x,60,korb);//движение корабля
//
end;
//Изменения
направления движения корабля с клавиатуры
procedure
TForm1.rmKeyDown(Sender: TObject; var
Key: Word;
Shift: TShiftState);
begin
if key=37
then shx:=-15;//движение влево
if key=39
then shx:=15;//движение вправо
end;
end.