Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: 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 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-1078328414
В л а д и м и р
2004-03-03 18:40
2004.04.04
Экспорт данных из таблицы Exel в таблицу базы данных


14-1078768130
ChcngerMan
2004-03-08 20:48
2004.04.04
Компьютерные клубы :)


6-1074606738
LexaTyukha
2004-01-20 16:52
2004.04.04
Как отловить сообщение приходящее от net send?


1-1079601573
dima74
2004-03-18 12:19
2004.04.04
DCU в отдельный каталог


1-1079343040
Jager
2004-03-15 12:30
2004.04.04
Как заставить программу запускаться при закгузке в защ. режиме