.
Вращение многоугольника в координатной плоскости  (TImage, фигура, Delphi, графика)
Автор megabax   
29.04.2010 г.
New Page 2

Вращение многоугольника в координатной плоскости  (TImage, фигура, Delphi, графика)

Исходники к уроку можно скачать здесь (Delphi, графика)

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

А теперь перейдем к нашим урокам. Я уже писал, как заставить фигуру двигаться по экрану. Сегодня мы заставим ее вращаться. Для начала возьмем пример, который мы делали на уроке 2, если у вас его нет, то вы можете скачать его здесь (Delphi, графика). Добавим к нему новые элементы диалога*:

Вращение многоугольника в координатной плоскости  (TImage, фигура, Delphi, графика)

Кнопочку "Стоп" назовем (свойство Name) btnStop, поля для ввода координат центра оси вращения seXX и seYY.

Теперь нам потребуется добавить кое какие поля в раздел privete класса основной формы программы (выделено красным)

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;
      Label5: TLabel;
      btnStop: TButton;
      GroupBox1: TGroupBox;
      seXX: TSpinEdit;
      seYY: TSpinEdit;
      Label6: TLabel;
      Label7: TLabel;
      procedure FormCreate(Sender: TObject);
      procedure FormDestroy(Sender: TObject);
      procedure TimerTimer(Sender: TObject);
      procedure btnShowClick(Sender: TObject);
      procedure seDelayChange(Sender: TObject);
      procedure btnStopClick(Sender: TObject);
      procedure seXXChange(Sender: TObject);
      procedure seYYChange(Sender: TObject);
      procedure imImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
     { Private declarations }
     Points:array[1..5] of TPoint;
     Alpha:array[1..5] of Real;
     Gip:array[1..5] of Real;

     XX,YY:integer;
     Axes:TAxesSystem;
     IsStarted:boolean;
     procedure DrawFigure;
public
     { Public declarations }
end;

изменим обработчик таймера:

procedure TfrmGameSample.TimerTimer(Sender: TObject);
var i:integer;
begin
    if IsStarted then
    begin
       for i:=1 to 5 do
       begin
           Alpha[i]:=Alpha[i]-PI/60;
           Points[i].X:=trunc(Sin(Alpha[i])*gip[i])+XX;
           Points[i].Y:=trunc(Cos(Alpha[i])*gip[i])+YY;
       end;
      DrawFigure;
  end;
end;

и перепишем обработчик нажатия на кнопку "Старт"

procedure TfrmGameSample.btnShowClick(Sender: TObject);
var i:integer;
begin
    IsStarted:=true;
    XX:=seXX.Value;
    YY:=seYY.Value;
    for i:=1 to 5 do
    begin
        Alpha[i]:=arcTan((YY-Points[i].Y)/(XX-Points[i].X));
        gip[i]:=sqrt(sqr(XX-Points[i].X)+sqr(YY-Points[i].Y))
    end;
    DrawFigure;
end;

Так как мы добавили новые объекты, то пропишем и у них обработкичик событий, для кнопки "Стоп" обработчик нажатия btnStopClick, для компонетов SpinEdit seXXChange и seXXChange соответсвенно:

procedure TfrmGameSample.btnStopClick(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;

procedure TfrmGameSample.seXXChange(Sender: TObject);
begin
   XX:=seXX.Value;
end;

procedure TfrmGameSample.seYYChange(Sender: TObject);
begin
   YY:=seYY.Value;
end;

Теперь, хорошо было бы, что бы щелчке мышкой по графическому полю у нас центр вращения втсавал в точку щелчка мышки. Это можно сделать, добавив к коду обработчик события OnMouseDown графического поля (imImage, компонент TImage):

procedure TfrmGameSample.imImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    XX:=X;
    YY:=Y;
end;

Теперь испытаем нашу программу:

Вращение многоугольника в координатной плоскости  (TImage, фигура, Delphi, графика)

Исходники к уроку можно скачать здесь (Delphi, графика)


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


 

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