![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка столкновений прямоугольников в 2D игре [Delphi, Windows]
Ландграф Павел © (2003-09-19 19:31:00)Столкновение в 2D.
Вопрос не так прост, я уже саму проверку сделал, и сторону с которой столкнулись... но вот если сделать много прямоугольников в ряд (забор) и жать идти в сторону забора(влево/вправо)+вверх то герой начинает цеплятся, и его приходится выталкивать не только по x, но и по y - сами понимаете он начинает как по рельсам дергаться.
Может кто видел такой алгоритм или сам реализовывал - подскажите плиз!
Ландграф Павел (2003-09-22 12:09:00) [1]Все сделал... только немного по своему:) ВСЕМ ПАСИБО!
Darthman (2003-09-22 09:57:00) [2]Mihey:
дело говоришь. :) Жаль меня не было в выходные, сам бы сказал.
Ландграф Павел:
Пробуйте, эксперементируйте.. :)
Ландграф Павел (2003-09-21 10:47:00) [3]Хм.. вот оно что... я то понял что он возвращает прямоугольник образуемый пересечением - но как эти данные использовать не понял - спасибо! попробую так...
Mihey (2003-09-20 23:42:00) [4]> IntersectRect?
А как с помощью него узнать с какой стороны произошло столкновение...
IntersectRect возвращает так же координаты прямоугольника, образуемого пересечением. По его месторасположению относительно объекта можно определить и сторону, с которой произошло столкновение.
Ландграф Павел (2003-09-20 21:05:00) [5]IntersectRect?
А как с помощью него узнать с какой стороны произошло столкновение...
если ты заметил в примере что я привел используется IntersectRect...
Darthman (2003-09-20 17:48:00) [6]Ландграф Павел: А чем не нравится использование IntersectRect?
Ландграф Павел (2003-09-20 12:58:00) [7]Нет, все не то...
Вот пример, но при движении вверх он цепляется, в остальных случаях гладко...
if OnScreen(PosX,PosY,MassiveRect[fRect].pos.x,MassiveRect[fRect].pos.y) then
if IntersectRect(temp, bounds(MassiveRect[fRect].pos.x-PosX,MassiveRect[fRect].pos.y-PosY,MassiveRect[fRect].size.x,MassiveRect[fRect].size.y), bounds(trunc(self.x),trunc(self.y)+27,self.width,self.height-27)) then
begin
if ((MassiveRect[fRect].pos.y-PosY+MassiveRect[fRect].size.y)-(trunc(self.y)+27)<=2) and (FMoveY = Up) then
y:=y+2;
if ((trunc(self.x)+self.width)-(MassiveRect[fRect].pos.x-PosX)<=2) and (FMoveX = Right) then
x:=x-2;
if ((MassiveRect[fRect].pos.x-PosX+MassiveRect[fRect].size.x)-(trunc(self.x))<=2) and (FMoveX = Left) then
x:=x+2;
if ((trunc(self.y)+self.Height)-(MassiveRect[fRect].pos.y-PosY)<=2) and (FMoveY = Down) then
y:=y-2;
end;
miek (2003-09-20 09:42:00) [8]При выталкивании нужно воздействовать (типа player.x:= player.oldx-player.dx) только на одну координату Y, тогда по X будет двигаться гладко.
Mihey (2003-09-19 20:53:00) [9]А зачем выталкивать? Можно же заранее чувака просчитывать и уже решать, перемещать туда или нет.
Ландграф Павел (2003-09-19 19:51:00) [10]http://cmail.info.kuzbass.net/~freeart/collision.jpg- вот посмотрите, кто не понял что я имею ввиду (при столкновении зеленого прямоугольника с красными зеленый выталкивается за границу красного в противоположную сторону от стороны с которой произошло столкновение)