Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

2.3.3. Проект «Движение компонента tImage

по окружности»

Постановка задачи. Реализовать движение картинки, загруженной в TImage, по окружности.

Реализация. Нарисуйте в редакторе Paint небольшую картинку, например, шарик и сохраните ее. Положите на форму две кнопки «Старт» и «Выход», таймер и один TImage. Найдите свойство Picture у компонента TImage и загрузите туда нарисованную картинку. Вид формы приведен на рис. 15.

Рис. 15. Форма для проекта

Для удобства рассмотрения напишем процедуру krug, рисующую окружность, или можем использовать готовый метод ellipse. Введём следующие глобальные переменные:

u0, v0, mx, my, rad : integer;

dfi, fi : real;

procedure xytouv(x,y:real; var u,v:integer);

begin

u:=u0+round(x*mx);

v:=v0-round(y*my);

end;

procedure krug(u0,v0,rad:integer);

var x,y:real;

u,v:integer;

begin

Form1.Canvas.Pen.Color:=ClRed;

fi:=0;

dfi:=0.01;

x:=rad;

y:=0;

xytouv(x,y,u,v);

while fi<=2*pi do

begin

Form1.Canvas.MoveTo(u,v);

x:=rad*cos(fi);

y:=rad*sin(fi);

xytouv(x,y,u,v);

Form1.Canvas.LineTo(u,v);

fi:=fi+dfi;

end;

end;

Далее дан код остальных процедур, а момент движения нарисован на рис. 16.

procedure TForm1.FormCreate(Sender: TObject);

begin

randomize;

mx:=1;

my:=1;

u0:=130;

v0:=130;

rad:=100;

Image1.Transparent:=true;

Image1.Left:=u0+rad+20;

Image1.Top:=v0-20;

Timer1.Enabled:=false;

fi:=0;

dfi:=0.01;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

// Меняем координаты компонента TImage

Image1.Left:=u0+round((rad+20)*cos(fi));

Image1.Top:=v0-20-round((rad+20)*sin(fi));

fi:=fi+dfi;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Timer1.Enabled:=true;

krug( u0,v0,rad);

end;

Рис. 16. Движение шарика по окружности

Задание. Создайте проект «Движение компонента TImage по фоновому рисунку». Пусть на форме лежит картинка, например, пейзаж, а вторая небольшая картинка, например птичка, будет летать слева направо и обратно. Используйте свойство Picture компонентов TImage для загрузки в него картинок.

Глава 3

Реакция на события от мыши и клавиатуры

3.1. События от мыши

3.1.1. Проект «Попади в мишень»

Постановка задачи. В случайном месте формы рисуется небольшой кружок заданного радиуса и произвольного цвета. Одновременно запускается таймер, и играющий должен успеть щелкнуть по кружку. Число попаданий и число щелчков подсчитываются. Игра продолжается до 10 щелчков.

Реализация. Положите на форму таймер, установите подходящий интервал. Положите одну кнопку «Старт». Кнопка сначала видна, по ее нажатию обнуляются счетчики, и запускается таймер, а также свойству Button1.Visible присваивается значение false. Во время игры кнопка уже не видна. После 10 выстрелов форма очищается, и кнопка вновь видна. Число попаданий и выстрелов будем выводить в строке Form1.Caption (рис. 17).

Рис. 17. Форма проекта «Попади в мишень»

Потребуется написать процедуру mishen рисования кружка заданного цвета с использованием стандартного метода Ellipse. Используем следующие глобальные переменные

var cw,ch,rad, a,b:integer;

vist, popal:integer;

c:TColor;

procedure mishen(x,y:integer;rad:integer;c:TColor);

begin

with Form1.Canvas do

begin

Pen.Color:=c;

Brush.Color:=c;

Ellipse(x,y,x+2*rad,y+2*rad);

end;

end;

Ниже приведен код FormCreate, Timer1Timer, FormMouseDown и Button1Click.

procedure TForm1.FormCreate(Sender: TObject);

begin

randomize;

cw:=ClientWidth; // Ширина формы

ch:=ClientHeight; // Высота формы

rad:=10;

Timer1.Enabled:=false;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

c:=Form1.Color; // Закрашиваем мишень цветом формы

mishen(a,b,rad,c);

c:=RGB(random(256),random(256),random(256));

a:=1+random(cw-2*rad);

b:=1+random(ch-2*rad);

mishen(a,b,rad,c); // Рисуем мишень в новом месте

end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var x1,y1:integer;

begin

vist:=vist+1;

{Переменные х, у – «экранные» координаты точки щелчка, поэтому пересчитаем их так, чтобы значения х1, у1 «были» внутри мишени }

x1:=abs(x-a)-rad div 2;

y1:=abs(y-b)-rad div 2;

if (x1*x1+y1*y1<=rad*rad) then

// Указатель мыши внутри мишени

begin

popal:=popal+1;

end;

Form1.Caption:='Выстрелов: '+IntToStr(vist)+

' Попаданий: '+IntToStr(popal);

if vist = 10 then

Begin

Timer1.Enabled:=false;

with Canvas do

begin

Font.Size:=24;

Font.Color:=ClTeal;

Brush.Color:=Form1.Color;

TextOut(70,80,'Игра окончена');

end;

Button1.Visible:=true; // Можем начать сначала

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

vist:=0;

popal:=0;

// Очистим форму

with Canvas do

begin

Pen.Color:=Form1.Color;

Brush.Color:=Form1.Color;

Rectangle(0,0,cw,ch);

end;

Timer1.Enabled:=true;

Button1.Visible:=false; // Кнопка невидима

end;

На рис. 18 нарисован «один миг» из игры.

Рис. 18. Игра «Попади в мишень»

Задание. Вместо кружка нарисуйте симпатичную картинку, создайте переменную класса TBitMap и загрузите картинку в эту переменную с помощью метода LoadFromFile. «Стирать» картинку можно рисованием прямоугольника цветом формы.