.
Перемещение многоугольника по координатной плоскости  (TCanvas, TImage, Polygon, TTimer)
Автор megabax   
22.10.2009 г.
New Page 2

Перемещение многоугольника по координатной плоскости  (TCanvas, TImage, Polygon, TTimer)

Прежде чем начать урок, сделаю небольшое сообщение. Я начал писать библиотеку для управления объектами компьютерных игр. Подробнее здесь.

А теперь, собственно, урок. Сегодня мы научимся программирование движение объекта по экрану. Для начала вспомним предыдущий урок. Нам понадобятся исходники этого урока. Если у вас их нет, то можете скачать их здесь.

И так, открываем исходники предыдущего урока, и, первое, что мы делаем, это в разделе Private класса TfrmGameSample добавляем новые поля, а так же процедуру DrawFigure (добавленное выделено красным).

TfrmGameSample = class(TForm)
     btnShow: TButton;
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     Label4: TLabel;
     edRatioX: TEdit;
     edRatioY: TEdit;
     imImage: TImage;
     seX: TSpinEdit;
     seY: TSpinEdit;
     Timer: TTimer;
     seDelay: TSpinEdit;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure TimerTimer(Sender: TObject);
     procedure btnShowClick(Sender: TObject);
     procedure seDelayChange(Sender: TObject);
private
    { Private declarations }
    Points:array[1..5] of TPoint;
    Axes:TAxesSystem;
    IsStarted:boolean;
    procedure DrawFigure;

public
   { Public declarations }
end;

Если у вас класса TAxesSystem объявлен после TfrmGameSample то перенесите его вперед. Теперь реализуем процедуру DrawFigure:

procedure TfrmGameSample.DrawFigure;
var Rect:TRect;
begin
     //очистим поле для рисования
    Rect.Left:=0;
    Rect.Top:=0;
    Rect.Right:=imImage.Width;
    Rect.Bottom:=imImage.Height;
    imImage.Canvas.FillRect(Rect);

   //нарисуем
   imImage.Canvas.Polygon(Points);
end;

Напишем обработчик события FormCreate нашей формы:

procedure TfrmGameSample.FormCreate(Sender: TObject);
var i:integer;
      Trian:array[1..5,1..2] of double;
begin
      IsStarted:=false;

     Trian[1,1]:=1;
     Trian[1,2]:=2;

     Trian[2,1]:=5;
     Trian[2,2]:=4;

     Trian[3,1]:=4;
     Trian[3,2]:=2;

     Trian[4,1]:=4;
     Trian[4,2]:=-1;

     Trian[5,1]:=3;
     Trian[5,2]:=-1;

     Axes:=TAxesSystem.Create;

    //заполним параметры координатной системы
    Axes.X:=seX.Value;
    Axes.Y:=seY.Value;
    Axes.RatioX:=StrToFloat(edRatioX.Text);
    Axes.RatioY:=StrToFloat(edRatioY.Text);

    for i:=1 to 5 do Points[i]:=Axes.GetPoint(Trian[i,1],Trian[i,2]);
end;

так как мы создали объект класса TAxesSystem, то нам его и удалять. поэтому реализуем событие FormDestroy:

procedure TfrmGameSample.FormDestroy(Sender: TObject);
begin
     FreeAndNil(Axes);
end;

Проведя вышеуказанные действия, мы разделили процедуру рисования многоугольника на процедуру его создания и процедуру отрисовки.

Наконец, дошли до кнопочки. Заменим у нее заголовок на "Старт" и пропишем обработчик OnClick:

procedure TfrmGameSample.btnShowClick(Sender: TObject);
begin
     IsStarted:=true;
     DrawFigure;
end;

Тем самым мы включили флаг, что картинка у нас нарисована и нарисовали ее.

А еще нам понадобиться класс TTimer. Его можно найти на закладке System*:

Перемещение многоугольника по координатной плоскости  (TCanvas, TImage, Polygonб TTimer)

Кладем этот объект на форму и прописываем у него обработчик события OnTimer:

procedure TfrmGameSample.TimerTimer(Sender: TObject);
var i:integer;
begin
    if IsStarted then
    begin
        for i:=1 to 5 do Points[i].X:=Points[i].X+1;
        DrawFigure;
    end;
end;

в данном обработчике мы проверяем флаг (нажимали ли мы до этого на кнопку).  Если процесс у нас запущен, то просто меняем координаты точек прямоугольника, сдвигая его влево. Затем рисуем. Напомню, что процедура очистки поля для рисования у нас есть в DrawFigure.

Теперь еще положим на форму объект TSpinEdit*:

Перемещение многоугольника по координатной плоскости

И напишем его обработчик:

procedure TfrmGameSample.seDelayChange(Sender: TObject);
begin
     Timer.Interval:=seDelay.Value;
end;

Если вы запустите программа и нажмете кнопку "Старт", то по экрану станет очень медленно ползти фигура. Изменим интервал таймера:

Перемещение многоугольника по координатной плоскости  (TCanvas, TImage, Polygonб TTimer)


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит Borland Delphi.. 


Последнее обновление ( 06.11.2011 г. )