Страница: 1 |
Страница: 1 |
Вопрос: Пересечение объектов
Добавлено: 08.10.04 21:17
Автор вопроса: Alexey333 | ICQ: 127708322
Извиняюсь за простой вопрос, но что-то где читал ответа на него не видел, а вопрос принципиально важный.
Как зафиксировать пересечение 2 объектов?
Например, во флэше для этого есть специальная функция: если хотя бы часть объекта А затрагивает площадь объекта В, то это событие можно зафиксировать и произвести определенные действия. Я делал игру про танчики и, например, если танк (управляется стрелками клавиатуры как обычно) касается мины, то ты проигрываешь.
Есть ли в VB что-либо подобное?
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #1
Добавлено: 08.10.04 21:19
По координатам, наверное
Номер ответа: 2
Автор ответа:
Alexey333
ICQ: 127708322
Вопросов: 4
Ответов: 29
Профиль | | #2
Добавлено: 08.10.04 21:37
Во флэше просто указываешь имена объектов. Никакие координаты не надо высчитывать. Здесь мне хочется тоже самое.
Номер ответа: 3
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #3
Добавлено: 09.10.04 00:32
Не думал насчёт API-функций IntersectRect и IsRectEmpty? я не знаю, конечно, как ты там сделал свои танчики и мины, но если они прямоугольные - то эти функции подходят.
Хотя... если они у тебя прямогульные, то и без всяких АПИ можно )
Можно также покопать в сторону PtInRect и/или PtInRegion.
Номер ответа: 4
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #4
Добавлено: 09.10.04 01:27
Того что ты хочешь нет.
Я советую (если объекты прямоугольные) сравнивать пересечение их RECT'ов
Номер ответа: 5
Автор ответа:
Alexey333
ICQ: 127708322
Вопросов: 4
Ответов: 29
Профиль | | #5
Добавлено: 09.10.04 06:11
Comanche, я еще далеко не большой знаток как большинство здесь и многие функции (особенно API) вообще слышу в первый раз. Поэтому то и спрашиваю, так как перебирать все функции методом тыка и проб займет очень много времени.
ZagZag, а какой функцией сравнивается пересечение прямоугольников?
Номер ответа: 6
Автор ответа:
⊗WaX⊗
Вопросов: 26
Ответов: 325
Web-сайт:
Профиль | | #6
Добавлено: 09.10.04 19:12
Почитай про bound box если не найдешь напишу подробнее. Вкратце пересечение объектов. прямоугольной формы легко вычисляется по их координатам(примоугольников)
Номер ответа: 7
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #7
Добавлено: 09.10.04 23:41
Да... я имел в виду самостоятельное сравнивание двух RECT
Вот выкидываю модуль... скажите что не так? Не принимает эта функция RECT
переменные - засел... :)
'Дата создания: 09.10.2004 23:38
'Автор: ZagZag (zagzag@xaker.ru)
[CODE]
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Function IsIntersection(ByRef rct1 As RECT, ByRef rct2 As RECT) As
Boolean
IsIntersection = False
rct1.Bottom = rct1.Bottom - rct1.Top
rct1.Right = rct1.Right - rct1.Left
rct2.Bottom = rct2.Bottom - rct2.Top
rct2.Right = rct2.Right - rct2.Left
' 12
' 34
'1
If (rct1.Left > rct2.Left And rct1.Left < rct2.Right) And (rct1.Top >
rct2.Top And rct1.Top < rct2.Bottom) Then
IsIntersection = True
Exit Function
End If
'2
If (rct1.Right > rct2.Left And rct1.Right < rct2.Right) And (rct1.Top >
rct2.Top And rct1.Top < rct2.Bottom) Then
IsIntersection = True
Exit Function
End If
'3
If (rct1.Left > rct2.Left And rct1.Left < rct2.Right) And (rct1.Bottom >
rct2.Top And rct1.Bottom < rct2.Bottom) Then
IsIntersection = True
Exit Function
End If
'4
If (rct1.Right > rct2.Left And rct1.Right < rct2.Right) And (rct1.Bottom >
rct2.Top And rct1.Bottom < rct2.Bottom) Then
IsIntersection = True
Exit Function
End If
End Function
[/CODE]
Номер ответа: 8
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #8
Добавлено: 10.10.04 16:38
Зачем изобретать велосипед, когда есть АПИ IntersectRect?
Номер ответа: 9
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #9
Добавлено: 11.10.04 13:39
[CODE]Declare Function IntersectRect Lib "user32.dll" (lpDestRect As RECT,
lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long[/CODE]
А как ей правильно пользоваться
Например я не понял что есть первый параметр
PS: Свой "велосипед" по-своему уникален :)
Номер ответа: 10
Автор ответа:
Alexey333
ICQ: 127708322
Вопросов: 4
Ответов: 29
Профиль | | #10
Добавлено: 13.10.04 11:32
Тоже не знаю как ей пользоваться, поэтому написал свой скрипт. Все вроде работает нормально.
Dim pic1k1y As Long, pic1k2y As Long, vertper As Boolean
Dim pic1k1x As Long, pic1k2x As Long, horizper As Boolean
pic1k1y = Picture1.Top
pic1k2y = Picture1.Top + Picture1.Height
If Picture2.Top <= pic1k2y And Picture2.Top >= (pic1k1y - Picture2.Height) Then
vertper = True
Else
vertper = False
End If
pic1k1x = Picture1.Left
pic1k2x = Picture1.Left + Picture1.Width
If (Picture2.Left + Picture2.Width) >= pic1k1x And Picture2.Left <= pic1k2x Then
horizper = True
Else
horizper = False
End If
If vertper = True And horizper = True Then
MsgBox "Объекты пересекаются!"
End If
Номер ответа: 11
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #11
Добавлено: 13.10.04 11:39
SetRect rct1, 0, 0, 100, 100
SetRect rct2, 50, 50, 80, 120
IntersectRect rctDest, rct1, rct2
If IsRectEmpty(rctDest) = 0 Then MsgBox "Пересекаются"
Номер ответа: 12
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #12
Добавлено: 13.10.04 14:36
+OK
Понял тоесть
Спасибо
Номер ответа: 13
Автор ответа:
Alexey333
ICQ: 127708322
Вопросов: 4
Ответов: 29
Профиль | | #13
Добавлено: 13.10.04 14:59
Понял тоесть
А я нет
Но меня и свой вариант устраивает
Номер ответа: 14
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #14
Добавлено: 14.10.04 11:48
Какой такой "свой"? Поделись?