Как заставить картинку двигаться
Можно организовать движение изображения в окне. При этом изображение может двигаться либо хаотично (случайное движение), либо по закону, или может управлять клавиатурой или мышкой. Рассмотрим разные варианты движения изображений.
Случайное движение
Например, изобразить полет бабочки в случайном направлении со случайной скоростью.
Для решения этой задачи поместим в окне компонент Image1:TImage, в свойство Picture компонента загрузим картинку, например изображение бабочки, которое предварительно создадим с использованием редактора Image Editor. Для задания позрачности будем использовать свойство Transparent = true, задать свойство Autosize = true для того, чтобы размер рамки компонента был равен размеру рисунка. Также поместим компонент Timer1:TTimer в область формы. Внешний вид окна на этапе проектирования изображен на рисунке:
Для таймера зададим свойство Interval, например, равным 100. На событие OnTimer напишем обработчик, который и будет выполнять основную функцию организации хаотичного движения бабочки.
При движении бабочки случайно задается направление ее движения и скорость по X и Y, при этом отслеживается, чтобы бабочка не вылетала за границы окна. Обработчик события OnTimer может иметь следующий вид:
procedure TForm1.Timer1Timer(Sender: TObject);
var k:integer;
dx,dy:integer;
begin
k:=random(4)+1; { задает направление движения}
dx:=random(10)+1; dy:=random(10)+1; {скорости по X и Y}
case k of
1: {вверх}
if Image1.top - dy > 0 then
Image1.Top:= Image1.Top - dy;
2: {вниз}
if Image1.top + dy < ClientHeight then
Image1.Top:= Image1.Top + dy;
3: {влево}
if Image1.left - dx > 0 then
Image1.left:= Image1.left - dx;
4: {вправо}
if Image1.left + dx <ClientWidth then
Image1.Left:= Image1.Left + dx;
END;
end;
Задание для самостоятельной работы.
Модифицируйте предыдущий пример, добавив еще несколько бабочек.
Движение по закону
Например, шарик двигается по окну, как по столу, отражаясь от его стенок. Для этого поместим в форму компонент img:TImage и компонент Timer:TTimer. Внешний вид формы на этапе проектирования изображен на рисунке:
На событие OnCreate формы напишем код, который задает значения смещения шарика по X и Y:
procedure Tfrm.FormCreate(Sender: TObject);
begin
dx:=9; dy:=7;
end;
На событие OnTimer компонента Timer напишем программный код, который позволяет смещать шарик:
procedure Tfrm.Timer1Timer(Sender: TObject);
begin
if (img.Left+img.Width>=frm.ClientWidth) or (img.Left<=0) then
dx:=-dx;
if (img.Top+img.Height>=frm.ClientHeight) or (img.Top<=0) then
dy:=-dy;
img.Left:=img.Left+dx;
img.Top:=img.Top+dy;
end;
Задание для самостоятельной работы
1. Модифицируйте рассмотренный пример, добавив еще несколько шариков.
2. Промоделируйте движение снаряда, выпущенного из пушки и летящего по параболе.
Управляемое движение
Например, требуется организовать управление движением жука в окне с помощью стрелок клавиатуры вверх, вниз, влево, вправо, так, чтобы жук не выходил за границы окна. Для отслеживания нажатия клавиш в окне можно использовать событие формы: OnKeyDown.
Событие OnKeyDown - выполняется как при нажатии одной клавиши, так и при одновременном нажатии двух клавиш, включая функциональные клавиши и управляющие клавиши, такие как Shift, Alt, Ctrl.
Заголовок процедуры обработки события имеет следующий вид:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Процедуре обработки события OnKeyDown передаются три параметра:
Sender – указатель на объект источник события.
Shift – указывает какая из клавиш Shift, Alt, или Ctrl была нажата вместе с клавишей Key.
Key – задает код нажатой клавиши. Для не алфавитно-цифровых клавиш можно использовать виртуальные коды клавиш. Коды клавиш представляют собой константы. Например, в следующей таблице приведены некоторые виртуальные коды клавиш:
Код клавиши | Описание |
VK_RETURN | Enter |
VK_ESCAPE | Escape |
VK_LEFT | Стрелка влево |
VK_UP | Стрелка вверх |
VK_RIGHT | Стрелка вправо |
VK_DOWN | Стрелка вниз |
VK_DELETE | Delete |
Поместим в область формы компонент Image1:TImage. Зададим его свойства.
На событие OnKeyDown формы напишем программный код, который позволяет управлять движением жука. При нажатии стрелок вверх и вниз жук перемещается вверх и вниз на 10 пикселей. При нажатии стрелок влево и вправо жук также перемещается на 10 влево и вправо:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case key of
{вверх}
VK_UP: if Image1.top -10 > 0 then Image1.top:=Image1.Top - 10;
{вниз}
VK_Down: if Image1.top +10 < ClientHeight then Image1.top:=Image1.Top + 10;
{влево}
VK_Left: if Image1.Left - 10 >0 then Image1.Left :=Image1.Left -10;
{вправо}
VK_Right: if Image1.Left +10 <ClientWidth then Image1.Left :=Image1.Left +10;
end;
end;
Задание для самостоятельной работы
Модифицируйте предыдущее задание так, чтобы жук не выходил за пределы некоторой ограниченной прямоугольником области.