|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.01.2008, 15:48 | #1 |
Пользователь
Регистрация: 16.01.2008
Сообщений: 21
|
коллизия
есть два Timage-объекта.. Как можно определить, пересеклись ли они?
Если выписывать все возможные варианты типа if Image1.Left >= Image2.Left and... это будет слишком долго и муторно. К тому же, нужно чтобы было как можно проще - это будет типа цикла от 1 до четырех ( нужно сравнить один image1 с image2[1], с image2[2], с image2[3], с image2[4]). К тому же сравнение идет в таймере с интервалом 15 мс... Может, сумбурно выразился.. хм.. |
26.01.2008, 15:51 | #2 |
Владимир М.
Участник клуба
Регистрация: 30.10.2006
Сообщений: 1,289
|
> Если выписывать все возможные варианты типа
> if Image1.Left >= Image2.Left and... а для прямоугольных объектов так и делается. конечно ничего не делать - проще. хм.
Берегите друг друга!
|
26.01.2008, 15:56 | #3 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Интересно... Я бы сделал проверки как вы и описали, незнаю что еще Вы можете придумать.
|
26.01.2008, 17:47 | #4 |
Пользователь
Регистрация: 16.01.2008
Сообщений: 21
|
хм.. я думал, может есть какой-то лучше способ
где-то слышал, про PivotPoint - опорные точки.. Только принцип проверки не могу сформулировать.. |
26.01.2008, 19:00 | #5 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
В Windows API для этого есть специальные функции, например IntersectRect. В сумме с GetWindowRect или GetClientRect я полагаю они дадут то, что нужно..
|
27.01.2008, 01:33 | #6 |
Пользователь
Регистрация: 16.01.2008
Сообщений: 21
|
Спасибо ) Сейчас попробую разобраться, что за функции такие )
|
27.01.2008, 11:07 | #7 |
Пользователь
Регистрация: 16.01.2008
Сообщений: 21
|
код:
var lpRect: TRect; res, RectGrreen, RectBlue: TRect; collis: boolean; ... for i:=1 to 4 do begin GetWindowRect(osnova.Handle,lpRect) ; GetClientRect(); RectGrreen:=imgGreen.ClientRect; RectBlue:=imgBlue[i].ClientRect; collis:= IntersectRect(res,RectGrreen,RectBl ue); if collis = false Then begin Collision:=true; exit; end else Collision:=false; end; И все равно не получается... в свое оправдание скажу, что с WinAPI работаю второй раз в жизни Последний раз редактировалось Fruit; 27.01.2008 в 11:10. |
27.01.2008, 11:20 | #8 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Ну а зачем Вы все в кучу-то?
Если Вы уже берете прямоугольники как делфьийские property, то зачем в начале кода зовете GetClientRect и GetWindowRect? Я их написал, чтобы Вы выбрали, кто из них нужен. Кстати, может быть в TRect есть метод IntersectRect, негде глянуть. И еще, API не в курсе, что существуют такие штуки, как TRect, туда надо передавать адрес стандартного апишного RECT, иначе в зависимости от внутреннего устройства TRect, все будет непредсказуемо. |
27.01.2008, 11:54 | #9 |
Пользователь
Регистрация: 16.01.2008
Сообщений: 21
|
"Кстати, может быть в TRect есть метод IntersectRect, негде глянуть"
не... нету. ) По крайней мере я не нашел.. хмм.. не понял... я создаю переменную Trect, присваиваю ей этот imgGreen.ClientRect к примеру, передаю эту запись в APIшную функцию... в перем. res по идее, они должны показать 0 или что-нить др.? В смысле - 0 - не пересекаются.... |
27.01.2008, 12:07 | #10 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
IntersectRect ожидает указатель на RECT
Код:
|