Перейти к содержанию
Fire Monkey от А до Я
  • 0

Не работает код с TProgressBar


VDK

Вопрос

Собственно не работает следующий код

IF (Opponent.Position.X + PosY) <> (Hero.Position.X + PosX ) then
begin
   if (Opponent.Position.X + PosY) > (Hero.Position.X + PosX)then
      Opponent.Position.X:=Opponent.Position.X - PosY * 0.01;
   if (Opponent.Position.X + PosY) < (Hero.Position.X + PosX)then
      Opponent.Position.X:=Opponent.Position.X + PosY * 0.01;
end
else
   HPIndicator.Value:= HPIndicator.Value -  10;

Однако, если сделать вот так:

IF (Opponent.Position.X + PosY) <> (Hero.Position.X + PosX ) then
begin
   if (Opponent.Position.X + PosY) > (Hero.Position.X + PosX)then
      Opponent.Position.X:=Opponent.Position.X - PosY * 0.01;
   if (Opponent.Position.X + PosY) < (Hero.Position.X + PosX)then
      Opponent.Position.X:=Opponent.Position.X + PosY * 0.01;
   HPIndicator.Value:= HPIndicator.Value -  10;
end  

то все прекрасно работает. В чем подвох?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Что это такое, откуда это:


Opponent.Position.X + PosY

Выложите весь проект или хотя бы минимальную версию для воспроизведения.

У вас два обычных условия. Раз срабатывает второе, значит выполняется условие:


(Opponent.Position.X + PosY) <> (Hero.Position.X + PosX )
Ссылка на комментарий
  • 0
Двигаю image opponent к image hero  и проверяю касается ли край opponent середины hero  
procedure TMainForm.MoveOpponentTimerTimer(Sender: TObject);
var
    PosX,PosY:integer;
begin 
    PosX:=round(Hero.Width) div 2;
    PosY:=round(Opponent.Width )   ;
    IF (Opponent.Position.X + PosY) <> (Hero.Position.X + PosX ) then
    begin
       if (Opponent.Position.X + PosY) > (Hero.Position.X + PosX)then
          Opponent.Position.X:=Opponent.Position.X - PosY * 0.01;
       if (Opponent.Position.X + PosY) < (Hero.Position.X + PosX)then
          Opponent.Position.X:=Opponent.Position.X + PosY * 0.01;
    end
    else
       HPIndicator.Value:= HPIndicator.Value - 10;
end
Ссылка на комментарий
  • 0

Добрый день!

 

Честно сказать, не смог понять алгоритма, посему набросал простой пример, как проверять пересечение контролов стандартными средствами.

 

function TForm1.OpponentVSHero: TAttacMode;
var
  RcOpponent, RcHero : TRectF;
  Pt : TPointF;
begin
  Result := TAttacMode.None;


  // Получим абсолютные размеры оппонента
  RcOpponent := Opponent.AbsoluteRect;


  // Получим абсолютные размеры героя
  RcHero := Hero.AbsoluteRect;


  // Получим центр героя
  Pt.X := Hero.Width / 2;
  Pt.Y := Hero.Height / 2;
  // Переведем его в абсолютные координаты
  PT := Hero.LocalToAbsolute(PT);


  // Проверим, не пересекаются ли габариты героя и оппонента
  if RcOpponent.IntersectsWith(RcHero) then begin
    Result := TAttacMode.Next;
  end;


  // Проверим, попадает ли центр героя в область оппонента
  if RcOpponent.Contains(Pt) then Result := TAttacMode.Attacked;


end;

Hero.zip

Ссылка на комментарий
  • 0
  • Администраторы

Добрый вечер,

 

На сколько я понял из скудного вопроса и ответов, речь идет о факте пересечении двух контролов.

На форуме была тема (без костылей): Как определить пересекаются ли два контрола или нет?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...