Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.11.2006, 17:18
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию Столкновение

//Кто нибудь знает более рациональный способ проверки столкновения
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  
Старый 16.11.2006, 22:11
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Может я чего не понял, но у меня твоя процедура не работает. Я бросил на форму несколько компонентов Image, причем Image1 пересекается с несколькими другими. Вызываю Collision( Image1 ), и получаю 'None'. Что я делаю не так?

В свою очередь предлагаю такой вариант (если я конечно правильно понял твою мысль):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<b>function</b> TForm1.Collision(Image: TImage): <b>string</b>;
<b>var</b>
  i, j, k: integer;
  _left, _top, _w, _h: integer;
  f: boolean;
<b>begin</b>
   Result := <font color="royalblue">''</font>;
   <b>for</b> i := <font color="royalblue">0</font> <b>to</b> ComponentCount-<font color="royalblue">1</font> <b>do</b>
   <b>begin</b>
      <b>if</b> ( Components[i] <b>is</b> TImage ) <b>and</b> ( Components[i].Name <> Image.Name ) <b>then</b>
      <b>begin</b>
         _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;
         <b>for</b> j := _left <b>to</b> _w <b>do</b>
         <b>begin</b>
            <b>if</b> f <b>then</b> Break;
            <b>for</b> k := _top <b>to</b> _h <b>do</b>
               <b>if</b> PtInRect( Image.BoundsRect, Point( j, k ) ) <b>then</b>
               <b>begin</b>
                  Result := Result + Components[i].Name + <font color="royalblue">#13</font>;
                  f := true;
                  Break;
               <b>end</b>;
         <b>end</b>;
      <b>end</b>;
   <b>end</b>;
<b>end</b>;
  
<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>begin</b>
   ShowMessage( Collision( Image1 ) );
<b>end</b>;
Ответить с цитированием
  #3  
Старый 17.11.2006, 09:22
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Ошибка потому, что там в коде есть Image1 надо исправить на image (уж извиняйте) и она работает только при наличии Direction.
Ответить с цитированием
  #4  
Старый 17.11.2006, 09:45
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Вот пример
Вложения
Тип файла: zip Collision.zip (7.9 Кбайт, 27 просмотров)
Ответить с цитированием
  #5  
Старый 17.11.2006, 14:23
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Погляди сейчас - Collision_new.zip

P.S.
Отсутствует эффект "подергивания" при столкновении.
Ответить с цитированием
  #6  
Старый 17.11.2006, 15:30
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Круто, а можешь обснить PtInRect и BoundsRect
Ответить с цитированием
  #7  
Старый 17.11.2006, 16:48
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

BoundsRect - позиция и размер компонента относительно предка.
PtInRect - проверка, принадлежит ли точка указанной прямоугольной области. TRUE если да, FALSE если нет.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025