New Page 2
Вращение многоугольника в
координатной плоскости (TImage, фигура,
Delphi, графика)
Исходники к уроку можно скачать здесь
(Delphi, графика)
Прежде чем начать урок, сделаю небольшое сообщение. Я уже писал о том, что начал
разрабатывать библиотеку
для управления объектами компьютерных игр. Сейчас уже вышла библиотека версии
2.1, которая содержит много полезных классов. Так же есть примеры использования
этой библиотеки, из которых можно уже составлять простейшие игры. Подробнее
здесь.
А теперь перейдем к нашим урокам. Я уже писал, как
заставить фигуру двигаться по экрану. Сегодня мы заставим ее вращаться. Для
начала возьмем пример, который мы делали на
уроке 2, если у вас его нет, то вы можете скачать его
здесь (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; |
Теперь испытаем нашу программу:
Исходники к уроку можно скачать здесь
(Delphi, графика)
Скриншоты, помеченные знаком *,
являются цитатами и иллюстрациями в
соответствии со ст. 1274 ГК РФ программного
продукта "Delphi", авторское право на
который принадлежит Borland Delphi..
|