Показать сообщение отдельно
  #1  
Старый 17.06.2014, 13:31
Alexandr_17_10 Alexandr_17_10 вне форума
Прохожий
 
Регистрация: 17.06.2014
Сообщения: 27
Версия Delphi: Delphi 7, XE6
Репутация: 10
По умолчанию Проблемы со столкновением

Вот функция столкновения
Код:
Function CollisionpnlStena(var Pers:TImage; var brImage2:TPanel):Boolean;
var val:boolean;
begin
  With pers do begin
    if  brImage2 <> nil then begin
      val:=((brImage2.Left >= Left) and (brImage2.Top >= Top) and
               (brImage2.Left <= Left+Width) and (brImage2.Top <= Top+Height))
              or (( brImage2.Left+brImage2.Width >= Left) and (brImage2.Top+brImage2.Height >= Top) and
                  ( brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height))
              or ((brImage2.Left >= Left) and (brImage2.Top+brImage2.Height >= Top) and
                  (brImage2.Left <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height))
              or ((brImage2.Left+brImage2.Width >= Left) and (brImage2.Top >= Top) and
                  (brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top <= Top+Height));
      if PPLRUD = 1 then
        Pers.Left:=brImage2.Left+brImage2.Width
      else if PPLRUD = 2 then
        Pers.Left:=brImage2.Left-Pers.Width
      else if PPLRUD = 3 then
        Pers.Top:=brImage2.Top+brImage2.Height
      else if PPLRUD = 4 then
        Pers.Top:=brImage2.Top-Pers.Height;
    end;
    result:=val;
  end;
end;
Где
PPLRUD Содержит в какую сторону движется персонаж или какие действия с ним происходят.
Вот создания панелей в качестве стен
Код:
setlength(Stens, 2);
stens[0]:=TPanel.Create(ScrollBox1);
  stens[0].Parent:=ScrollBox1;
  stens[0].Left:=190;
  stens[0].Width:=26;
  stens[0].Top:=0;
  stens[0].Height:=241;
  stens[0].Name:='pnlstens_0';

  stens[1]:=TPanel.Create(ScrollBox1);
  stens[1].Parent:=ScrollBox1;
  stens[1].Left:=405;
  stens[1].Width:=26;
  stens[1].Top:=0;
  stens[1].Height:=241;
  stens[1].Name:='pnlstens_1';
Вот собственно таймер для движения и отловли столконовения
Код:
procedure TFormMain.ZEPEMEWEHNE_PERSONAGESTimer(Sender: TObject);
var i:integer;
begin
  ZEPEMEWEHNE_PERSONAGES.Enabled:=FALSE;
  if PPLRUD=1 then begin
    Personages.Left:=Personages.Left-1;
  end else if PPLRUD=2 then begin
    Personages.Left:=Personages.Left+1;
  end else if PPLRUD=3 then begin
    Personages.Top:=Personages.Top-1;
  end else if PPLRUD=4 then begin
    Personages.Top:=Personages.Top+1;
  end;
  if Length(stens) > 0 then
    for i:= 0 to length(stens)-1 do
      if CollisionpnlStena(Personages, stens[i]) then
        PPLRUD:=0;
  ZEPEMEWEHNE_PERSONAGES.Enabled:=True;
end;
Но столкновение с панелями возникает раньше чем персонаж столкнулся с панелью. Оно возникает как только запускается таймер. При этом i в таймере = 0 это означает что начиная с 1 панели. Как исправить.
Ответить с цитированием