Главная страница
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.025 c
1-1079088003
ChcngerMan
2004-03-12 13:40
2004.04.04
DLL


8-1070004089
user
2003-11-28 10:21
2004.04.04
Как удалить определенное кол-во секунд из .wav файла


3-1078331942
Rauf
2004-03-03 19:39
2004.04.04
Проблемы с TADOTable


8-1067042786
Almaz
2003-10-25 04:46
2004.04.04
Создание AVI файла


3-1078328414
В л а д и м и р
2004-03-03 18:40
2004.04.04
Экспорт данных из таблицы Exel в таблицу базы данных