Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2014, 05:38   #1
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию столкновение объектов

Код:
Function Collision(var Pers:TImage; Const brImage2:TImage=nil; Const pnlStenaDveri:TPanel=nil):Boolean;
begin
  if brImage2 <> nil then
    If (Pers.Left >= brImage2.Left - Pers.Width)and(Pers.Top >= brImage2.Top - Pers.Height)and(Pers.Top <= brImage2.Top + brImage2.Height)and(Pers.Left <= brImage2.Left + brImage2.Width) then begin
      if PPLRUD = 1 then
        Pers.Left:=brImage2.Left+brImage2.Width+1
      else if PPLRUD = 2 then
        Pers.Left:=brImage2.Left-Pers.Width-1
      else if PPLRUD = 3 then
        Pers.Top:=brImage2.Top+brImage2.Height+1
      else if PPLRUD = 4 then
        Pers.Top:=brImage2.Top-Pers.Height-1;
      Result:=true;
    end else
      Result:=false;
  if pnlStenaDveri <> nil then
    If (Pers.Left >= pnlStenaDveri.Left - Pers.Width)and(Pers.Top >= pnlStenaDveri.Top - Pers.Height)and(Pers.Top <= pnlStenaDveri.Top + pnlStenaDveri.Height)and(Pers.Left <= pnlStenaDveri.Left + pnlStenaDveri.Width) then begin
      if PPLRUD = 1 then
        Pers.Left:=pnlStenaDveri.Left+pnlStenaDveri.Width
      else if PPLRUD = 2 then
        Pers.Left:=pnlStenaDveri.Left-Pers.Width
      else if PPLRUD = 3 then
        Pers.Top:=pnlStenaDveri.Top+pnlStenaDveri.Height
      else if PPLRUD = 4 then
        Pers.Top:=pnlStenaDveri.Top-Pers.Height;
      Result:=true;
    end else
      Result:=false;
end;
почемута не работает как надо.
Как решить проблему. Вродебы столкновение написал верно ах да
Код:
//Переменная для движение персонажа
  {0 - стоит
   1 - Влево
   2 - Вправо
   3 - Вверх
   4 - Вниз
  }
  PPLRUD:Integer;
Alexandr17 вне форума Ответить с цитированием
Старый 06.06.2014, 15:29   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

давай посмотрим
Цитата:
If (Pers.Left >= brImage2.Left - Pers.Width) //персонаж УЖЕ наткнулся справа
and (Pers.Top >= brImage2.Top - Pers.Height) //персонаж УЖЕ наткнулся сверху
and (Pers.Top <= brImage2.Top + brImage2.Height)//персонаж УЖЕ наткнулся снизу
and (Pers.Left <= brImage2.Left + brImage2.Width) //персонаж УЖЕ наткнулся слева
then begin
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.06.2014, 16:35   #3
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Я лишь проверяю находиться ли персонаж на панели (равносильно что и столкновение) на факт что не работает для панелей.
Alexandr17 вне форума Ответить с цитированием
Старый 08.06.2014, 10:34   #4
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Может кто поможет мне разобраться с функцией столкновения.
Alexandr17 вне форума Ответить с цитированием
Старый 08.06.2014, 11:07   #5
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Переделал функцию столкновения.
Код:
function IsCrossImages(var Pers:TImage; Const brImage2:TImage=nil; Const pnlStenaDveri:TPanel=nil):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;
    if pnlStenaDveri <> nil then begin
      val:=((pnlStenaDveri.Left >= Left) and (pnlStenaDveri.Top >= Top) and
               (pnlStenaDveri.Left <= Left+Width) and (pnlStenaDveri.Top <= Top+Height))
              or ((pnlStenaDveri.Left+pnlStenaDveri.Width >= Left) and (pnlStenaDveri.Top+pnlStenaDveri.Height >= Top) and
                  (pnlStenaDveri.Left+pnlStenaDveri.Width <= Left+Width) and (pnlStenaDveri.Top+pnlStenaDveri.Height <= Top+Height))
              or ((pnlStenaDveri.Left >= Left) and (pnlStenaDveri.Top+pnlStenaDveri.Height >= Top) and
                  (pnlStenaDveri.Left <= Left+Width) and (pnlStenaDveri.Top+pnlStenaDveri.Height <= Top+Height))
              or ((pnlStenaDveri.Left+pnlStenaDveri.Width >= Left) and (pnlStenaDveri.Top >= Top) and
                  (pnlStenaDveri.Left+pnlStenaDveri.Width <= Left+Width) and (pnlStenaDveri.Top <= Top+Height));
      if PPLRUD = 1 then
        Left:=pnlStenaDveri.Left+pnlStenaDveri.Width
      else if PPLRUD = 2 then
        Left:=pnlStenaDveri.Left-Width
      else if PPLRUD = 3 then
        Top:=pnlStenaDveri.Top+pnlStenaDveri.Height
      else if PPLRUD = 4 then
        Top:=pnlStenaDveri.Top-Height;
    end;
    result:=val;
  end;
end;
вот ее вызов и собственно перемещение персонажа
Код:
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 IsCrossImages(Personages, nil, stens[i]) then
        PPLRUD:=0;
  if Length(dveri) > 0 then
    for i:= 0 to length(dveri)-1 do
      if IsCrossImages(Personages, nil, dveri[i]) then
        PPLRUD:=0;
  ZEPEMEWEHNE_PERSONAGES.Enabled:=True;
end;
Для имаджей вродебы работает а вот для панелей черти что получается
Я бы использовал имаджи вместо панелей еслибы были картинки такиеже как панели. Рисовать немогу. А персонажей взял в инете картинки в гугл поиске.
Alexandr17 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Столкновение объектов в 3D Максим139 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 29.09.2012 15:27
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Определить столкновение объектов TImage (Delphi) misher Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 23.03.2011 21:01
Столкновение GaLiof Помощь студентам 5 25.11.2009 09:42
Столкновение объектов [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 27.09.2008 16:54