Функция касания
Вот в чем вопрос: как лучше задать алгоритм касания о сторону квадрата (то есть одну из линий). Ест ли в Паскале такая функция? Или можно как-нибудь по-другому?
Ну, если рассуждать логически, то если координаты шарика больше(меньше) координат края квадрата плюс(минус) радиус шара, то он вышел.
Shar_X, Shar_Y - координаты центра шарика (0...A).
Mouse_X, Mouse_Y - координаты указателя мыши (0...A).
Dyra_X, Dyra_Y - координаты центра дыры.
Пусть дыра - в середине одной из сторон квадрата.
Номер стороны с дырой - Storona
(Storona=1 - дыра вверху, Storona=2 - дыра внизу,
Storona=3 - дыра слева, Storona=4 - дыра справа).
Ширина дыры - RazmerDyry (RazmerDyry<A).
Шарик считается попавшим в дыру,
если расстояние от центра шарика до центра дыры
(D_Shar_Dyra)
не больше, чем R
(при том, что указатель мыши не находится в дыре).
Указатель мыши считается находящемся в дыре,
если расстояние от указателя мыши до центра дыры
(D_Mouse_Dyra)
не больше, чем Dyra.
Function IsGameOver:Boolean;
{A, R, Shar_X, Shar_Y, Mouse_X, Mouse_Y,}
{RazmerDyry, Storona определены вне функции.}
Var Dyra_X,Dyra_Y,D_Shar_Dyra,D_Mouse_Dyra:Integer;
Begin
{Определение Dyra_X,Dyra_Y}
Case Storona Of
1:Begin Dyra_X:=A Div 2; Dyra_Y=0 End;
2:Begin Dyra_X:=A Div 2; Dyra_Y=A End;
3:Begin Dyra_X:=0; Dyra_Y=A Div 2 End;
4:Begin Dyra_X:=A; Dyra_Y=A Div 2 End
End;
{Определение D_Shar_Dyra}
D_Shar_Dyra:=
Sqrt (Sqr(Shar_X-Dyra_X)+Sqr(Shar_Y-Dyra_Y);
{Определение D_Mouse_Dyra}
D_Mouse_Dyra:=
Sqrt (Sqr(Mouse_X-Dyra_X)+Sqr(Mouse_Y-Dyra_Y);
{Результат функции}
IsGameOver:=
(D_Shar_Dyra<=R) And (D_Mouse_Dyra>RazmerDyry);
End;