![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Епрст.... [Delphi, Windows]
Hex0DesiMaL © (2004-01-20 09:08:00)Короче, как сделать событие на соприкасновение N объектов сторонами (границами),где N -- кол-во объектов. Допустим, у меня есть Shape1 и Shape2... Shape1 управляется с клавы (стрелки вверх, вниз, вправо, влево). Как сделать так, чтобы, когда Shape1 соприкасалось с Shape2, оно в него упиралось и не шло дальше?
Пробовал описать "столкновение" фигур сверху, снизу и т.п, но больно уж дофига кода получаецца... И это только для двух фигур, а если их будет больше, то и предположить боюсь....
nexxiss (2004-01-20 14:07:00) [1]type
TIsColl = record
Cl: boolean; // признак столкновения
Rt: TRect; // область пересечения
end;
.........
.........
.........
function Max(A,B: Integer): Integer;
begin
if A>B then Result:=A
else Result:=B;
end;
function Min(A,B: Integer): Integer;
begin
if A<B then Result:=A
else Result:=B;
end;
function IsColl( Rect1, Rect2: TRect): TIsColl;
var
x1,x2,y1,y2: Integer; // координаты верхней левой и нижней правой точки первого прямоугольника
xx1,xx2,yy1,yy2 : Integer; // координаты верхней левой и нижней правой точки второго прямоугольника
L,R,T,B: Integer; // границы области пересечения двух прямоугольников
begin
x1:=Rect1.Left;
x2:=Rect1.Right;
y1:=Rect1.Top;
y2:=Rect1.Bottom;
xx1:=Rect2.Left;
xx2:=Rect2.Right;
yy1:=Rect2.Top;
yy2:=Rect2.Bottom;
Result.Cl:=false;
Result.Rt:=Rect(0,0,0,0);
L:=Max(x1,xx1);
R:=Min(x2,xx2);
T:=Max(y1,yy1);
B:=Min(y2,yy2);
if (L<R) and (T<B) then
begin
Result.Cl:=true;
Result.Rt:=Rect(L,T,R,B);
end;
end;
Что-то вроде этого. Функция выдает как признак столкновения, так и область пересечения двух прямоугольников.
Hex0DesiMaL (2004-01-20 09:29:00) [2]Блин! Я спрашиваю не что сделать, а как описать само столкновение?!
ZAROLF (2004-01-20 09:23:00) [3]Иклмн.... просто останови Shape1 при столкновении.