Форум: "Игры";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизПроверка столкновений прямоугольников в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c