Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Вниз

Поиск пути для "многоклеточных объектов"   Найти похожие ветки 

 
Warchief   (2005-07-25 17:13) [0]

Как реализовать? Все материалы, которые я видел описывают только поиск пути для "одноклеточных" объектов по полю, с размерами клетки как у объекта. А как сделать для объектов которые занимают, напрмер, 2x2 клетки - непонятно ( Можно конечно для таких объектов хранить отдельное поле с размерами клетки под размер объекта и уже там искать, но этот способ некорректно работает в некоторых ситуациях (


 
Wonderfulday ©   (2005-07-25 18:44) [1]

А если сделать клеткам свойство какой ширины персонаж на них может стоять? Ну типо для узкого прохода максимальная ширина персонажа 1 клетка, а для широкого - 5?


 
XProger ©   (2005-07-25 20:22) [2]

А если дать каждому объекту сферу и выталкивать всё что в неё попадает при передвижении?


 
Xeno ©   (2005-07-26 05:53) [3]

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


 
Zer0 ©   (2005-07-26 20:56) [4]

алгориим тот же что и для одноклеточного перса - только вот на каждом шаге придется проверять проходимость не одной а сразу нескольких клеток.


 
A22 ©   (2005-07-26 21:15) [5]

по-моему, вариант, предложенный Wonderfulday будет лучше всех. Немного больше предварительной работы, разо разницы в реализации на 1 строчку (соотв. и в скорости потерь никаких)


 
Warchief   (2005-07-27 20:00) [6]

>А если сделать клеткам свойство какой ширины персонаж на них может >стоять? Ну типо для узкого прохода максимальная ширина персонажа 1 >клетка, а для широкого - 5?
Не понял o_O


 
ViK ©   (2005-07-28 00:10) [7]

Обычный алгоритм поиска, только надо проверять сможет ли объект поместиться в заданной клетке. Особенно легко если объект квадратный с нечетным размером сторон (чтобы центр был).
Но если объект произвольной формы, то все сильно усложняется


 
WonderfulDay ©   (2005-07-28 01:31) [8]

XProger, если персонаж 2*2, то какая будет сфера ;) ?
Xeno, тогда неточная карта получится, ответ тоже будет неточный.
2 WarChief
>Обычный алгоритм поиска, только надо проверять сможет ли объект поместиться в заданной клетке.
если свойство клетки "3", а персонаж имеет ширину квадрата >3, то он не может пройти, а если <=3, то может.


 
WonderfulDay ©   (2005-07-28 01:32) [9]

Забыл слово "например" в последнем предложении :)


 
Xeno ©   (2005-07-28 05:53) [10]

Не забудьте ещё про то что персонаж,при передвижении, может иметь возможность также перепрыгивать некоторые препятствия...:)


 
XProger ©   (2005-07-28 09:50) [11]

WonderfulDay, будет радиуса 2 ;)


 
Warchief   (2005-07-28 12:59) [12]

> если свойство клетки "3", а персонаж имеет ширину квадрата >3, то он не может пройти, а если <=3, то может.
Ну, это понятно. Только вот как рассчитывать это свойство клеток?


 
A22 ©   (2005-07-28 13:43) [13]

данное свойство клетки равно расстоянию от нее до ближайшего препятствия (непроходимой клетки).


 
Kobik ©   (2005-07-28 20:12) [14]

>A22 ©   (28.07.05 13:43) [13]
>данное свойство клетки равно расстоянию от нее до ближайшего
>препятствия (непроходимой клетки).

Не согласен. Рассмотрим карты

XXXX
X00X
X00X
0000

и

XXX
X0X
000

0-проходимя клетка
X-не проходимая.

В обоих случая все нули в тупике будут иметь параметр = 1 , хотя  в первом случае объект ширины 2 должен заползти :)

Да, все равно свойство клеток рассчитать легко... хз сейчас только думать лень :)


 
WonderfulDay ©   (2005-07-31 00:05) [15]

Какая максимальная сторона вписывающегося квадрата - такое и свойство, это ж из определения вытекает :)
Впиши сначала квадрат со стороной 1, потом 2, потом 3 и т.д. пока можно вписывать.


 
Goorus ©   (2005-08-01 04:36) [16]

Для каждой клетки храним два параметра: расстояние до клетки по оси X (в положительном направлении!) и по оси Y (также в одном направлении).

Т.е. для карты
XXXX
X00X
X00X
XXXX

Получим:

(0, 0) (0, 0) (0, 0) (0, 0)
(0, 0) (2, 2) (1, 2) (0, 0)
(0, 0) (2, 1) (1, 1) (0, 0)
(0, 0) (0, 0) (0, 0) (0, 0)

Будем искать путь не для центра объекта (Т.к., уже выяснили, что для объекта размером 2х2 центр найти сложно :) ), а для крайней, точнее, левой-верхней точки!
Условие, возможности встать на клетку:
(Cell.FreeX >= Object.SizeX) and (Cell.FreeY >= Object.SizeY)
где SizeX - полная(!) ширина объекта, а не 1/2 её часть.


 
Zer0 ©   (2005-08-01 18:43) [17]

Неплохие идеи, даже можно забацать локальную оптимизацию - если обьект стоит на клетке X, а ему нужно топать до клетки Y и расстояние для ближайшей стены (значение FreeX и FreeY )больше, чем расстояние между Ч и Y то обьект должен переть по прямой и даже не задумываться о наличии препятствий.
Однако у такого метода есть один недостаток - он не real time, для создания такой карты проходимости нужно значительное время. (по прикидкам что-то вроде O( (Карта_По_X*Карта_По_Y)^2 ).


 
Zer0 ©   (2005-08-01 18:51) [18]

Ошибочка, можно O( Карта_По_X*Карта_По_Y*4 ) сделать.


 
Warchief ©   (2005-08-01 19:20) [19]

Всем спасибо



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

Форум: "Игры";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
4-1130767725
RomeoGolf
2005-10-31 17:08
2006.01.08
Свернуть дочернее окно в панель задач


6-1127327378
Den12
2005-09-21 22:29
2006.01.08
Используя что создать web-приложение?


14-1134664429
NickX
2005-12-15 19:33
2006.01.08
Компилирование


2-1134833592
dude
2005-12-17 18:33
2006.01.08
что в Delphi называется словом ?


2-1135109926
newhite
2005-12-20 23:18
2006.01.08
?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский