Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
3-1078402608
Duncann
2004-03-04 15:16
2004.04.04
Про ODBC


3-1078162992
ceval
2004-03-01 20:43
2004.04.04
поменять в таблицы DisplayLabel ,DisplayWidth


8-1069859027
TitanDesign
2003-11-26 18:03
2004.04.04
Изменение картинки при наведении...


14-1078486964
Denis_Visma
2004-03-05 14:42
2004.04.04
Где найти компоненты Developer Express?


7-1074495064
Serge
2004-01-19 09:51
2004.04.04
win.ini





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский