|
#1
|
|||
|
|||
Столкновение
//Кто нибудь знает более рациональный способ проверки столкновения
Image'ов? Var Direction:integer; //Здесь есть глобальная переменная Direction, отвечающая за направление движения (8-вверх, 2-вниз, 4-влево, 6-вправо) function TForm1.Collision(Image:TImage):string; var i:integer; begin for i:=0 to ComponentCount-1 do begin if (Components[i] is TImage) and (TImage(Components[i]).Name<>image.Name) then begin if (Image.Left+image.Width>TImage(Components[i]).Left) and (Image.Left<TImage(Components[i]).Left+TImage(Components[i]).Width) and (Image.Top+image.Height>TImage(Components[i]).Top) and (Image.Top<TImage(Components[i]).Top+TImage(Components[i]).Height) and (Direction=6) then begin image.Left:=TImage(Components[i]).Left-image.Width; result:=TImage(Components[i]).Name; exit; end; if (Image.Left<TImage(Components[i]).Left+TImage(Components[i]).Width) and (Image.Left+image1.Width>TImage(Components[i]).Left) and (Image.Top+image.Height>TImage(Components[i]).Top) and (Image.Top<TImage(Components[i]).Top+TImage(Components[i]).Height) and (Direction=4) then begin image.Left:=TImage(Components[i]).Left+TImage(Components[i]).Width; result:=TImage(Components[i]).Name; exit; end; if (Image.top+image.Height>TImage(Components[i]).Top) and (Image.top<TImage(Components[i]).top+TImage(Components[i]).Height) and (Image.left+image.Width>TImage(Components[i]).left) and (Image.left<TImage(Components[i]).Left+TImage(Components[i]).Width) and (Direction=2) then begin image.Top:=TImage(Components[i]).top-image.Height; result:=TImage(Components[i]).Name; exit; end; if (Image.top<TImage(Components[i]).top+TImage(Components[i]).Height) and (Image.top+image1.Height>TImage(Components[i]).top) and (Image.left+image.Width>TImage(Components[i]).left) and (Image.left<TImage(Components[i]).left+TImage(Components[i]).Width) and (Direction=8) then begin image.top:=TImage(Components[i]).top+TImage(Components[i]).Height; result:=TImage(Components[i]).Name; exit; end; result:='None'; end; end; end; |
#2
|
||||
|
||||
Может я чего не понял, но у меня твоя процедура не работает. Я бросил на форму несколько компонентов Image, причем Image1 пересекается с несколькими другими. Вызываю Collision( Image1 ), и получаю 'None'. Что я делаю не так?
В свою очередь предлагаю такой вариант (если я конечно правильно понял твою мысль): Код:
function TForm1.Collision(Image: TImage): string; var i, j, k: integer; _left, _top, _w, _h: integer; f: boolean; begin Result := ''; for i := 0 to ComponentCount-1 do begin if ( Components[i] is TImage ) and ( Components[i].Name <> Image.Name ) then begin _left := ( Components[i] as TImage ).Left; _top := ( Components[i] as TImage ).Top; _w := _left + ( Components[i] as TImage ).Width; _h := _top + ( Components[i] as TImage ).Height; f := false; for j := _left to _w do begin if f then Break; for k := _top to _h do if PtInRect( Image.BoundsRect, Point( j, k ) ) then begin Result := Result + Components[i].Name + #13; f := true; Break; end; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage( Collision( Image1 ) ); end; |
#3
|
|||
|
|||
Ошибка потому, что там в коде есть Image1 надо исправить на image (уж извиняйте) и она работает только при наличии Direction.
|
#4
|
|||
|
|||
Вот пример
|
#5
|
||||
|
||||
|
#6
|
|||
|
|||
Круто, а можешь обснить PtInRect и BoundsRect
|
#7
|
||||
|
||||
BoundsRect - позиция и размер компонента относительно предка.
PtInRect - проверка, принадлежит ли точка указанной прямоугольной области. TRUE если да, FALSE если нет. |