Вниз
Скачать: CL | DM;

Проверка столкновений прямоугольников в 2D игре   Найти похожие ветки 

← →
Ландграф Павел ©   (2003-09-19 19:31) [0]

Столкновение в 2D.
Вопрос не так прост, я уже саму проверку сделал, и сторону с которой столкнулись... но вот если сделать много прямоугольников в ряд (забор) и жать идти в сторону забора(влево/вправо)+вверх то герой начинает цеплятся, и его приходится выталкивать не только по x, но и по y - сами понимаете он начинает как по рельсам дергаться.
Может кто видел такой алгоритм или сам реализовывал - подскажите плиз!


← →
Ландграф Павел ©   (2003-09-19 19:51) [1]

http://cmail.info.kuzbass.net/~freeart/collision.jpg - вот посмотрите, кто не понял что я имею ввиду (при столкновении зеленого прямоугольника с красными зеленый выталкивается за границу красного в противоположную сторону от стороны с которой произошло столкновение)


← →
Mihey ©   (2003-09-19 20:53) [2]

А зачем выталкивать? Можно же заранее чувака просчитывать и уже решать, перемещать туда или нет.


← →
miek ©   (2003-09-20 09:42) [3]

При выталкивании нужно воздействовать (типа player.x:= player.oldx-player.dx) только на одну координату Y, тогда по X будет двигаться гладко.


← →
Ландграф Павел ©   (2003-09-20 12:58) [4]

Нет, все не то...
Вот пример, но при движении вверх он цепляется, в остальных случаях гладко...
 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;


← →
Darthman ©   (2003-09-20 17:48) [5]

Ландграф Павел: А чем не нравится использование IntersectRect?


← →
Ландграф Павел ©   (2003-09-20 21:05) [6]

IntersectRect?
А как с помощью него узнать с какой стороны произошло столкновение...
если ты заметил в примере что я привел используется IntersectRect...


← →
Mihey ©   (2003-09-20 23:42) [7]

>IntersectRect?
А как с помощью него узнать с какой стороны произошло столкновение...


IntersectRect возвращает так же координаты прямоугольника, образуемого пересечением. По его месторасположению относительно объекта можно определить и сторону, с которой произошло столкновение.


← →
Ландграф Павел ©   (2003-09-21 10:47) [8]

Хм.. вот оно что... я то понял что он возвращает прямоугольник образуемый пересечением - но как эти данные использовать не понял - спасибо! попробую так...


← →
Darthman ©   (2003-09-22 09:57) [9]

Mihey:
дело говоришь. :) Жаль меня не было в выходные, сам бы сказал.

Ландграф Павел:
Пробуйте, эксперементируйте.. :)


← →
Ландграф Павел ©   (2003-09-22 12:09) [10]

Все сделал... только немного по своему:) ВСЕМ ПАСИБО!



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.021 c
1-1079467784
TRT
2004-03-16 23:09
2004.04.04
Лист каталогов


1-1079198303
$tranger
2004-03-13 20:18
2004.04.04
Не отображать форму при запуске


1-1079122076
ZaKaZ
2004-03-12 23:07
2004.04.04
TMemo не грузит весь файл...


14-1078732629
***ghost***
2004-03-08 10:57
2004.04.04
Шифратор текста.


1-1079355085
Cosinus
2004-03-15 15:51
2004.04.04
Сохранение всех документов, отправленных на принтер




   Наверх