Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Плавный обход преград

Автор: 32167 18.11.2006 7:10

Такая проблема: есть игра в разработке, похожая по движку на NOX.
В NOX'e объекты представляются в виде цилиндров с основнием в виде
окружности.
Как сделать чтобы герой, подойдя к преграждающему путь объекту,
не стоял как вкопанный(возвращение старых координат),а плавно
обходил его(окружность) в оптимальном направлении, как в Ноксе.
Известны координаты центра героя(точка), центра окружности,
ее радиус, а направление движения(или шаги смещения по X и Y) определяется
так же как в Ноксе - положение мышки относительно героя(Эти
координаты тоже известны).
Должен быть какой-нибудь алгоритм или формула для осуществления
плавного обхода преград.
Еще желательно решить ту же проблему для столкновения со стенами,
которые занимают 2мерный массив.
[attachmentid=4277]


Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение

Автор: lapp 18.11.2006 11:10

Я вот что не понял.. Из твоего текста следует, что пересечения окружностей не должно быть, а должно быть только их касание. А на рисунке явное пересечение изображено.. Почему?

Что касается алгоритма, то не понимаю, какие сложности. Просто ведешь его по окружности радиусом R+r (R и r - радиусы препятствия и героя) с центром в центре окружности препятствия - и все. Я что-то недопонял?

Автор: 32167 18.11.2006 19:55

Цитата(lapp @ 18.11.2006 7:10) *

Я вот что не понял.. Из твоего текста следует, что пересечения окружностей не должно быть, а должно быть только их касание. А на рисунке явное пересечение изображено.. Почему?

Что касается алгоритма, то не понимаю, какие сложности. Просто ведешь его по окружности радиусом R+r (R и r - радиусы препятствия и героя) с центром в центре окружности препятствия - и все. Я что-то недопонял?

На рисунке окружность героя вычисляется в зависимости от размер его изображения(это скриншот из
редактора игры, она для наглядности), его реальные размеры в игре - это точка. А радиус имеют только обЪекты. Даже если бы герой имел свои радиус,то почему просто r+R?Как получить конечную
формулу для смещения его координат?
Движение происходит пока нажата правая клавиша.
Например, его координаты хранятся в
MAP.OBJECTS.ITEMS[hero_index].x
MAP.OBJECTS.ITEMS[hero_index].y
а смещение при нажатии мышки определяется через угол, Stepx,StepY
MAP.OBJECTS.ITEMS[hero_index].x:=MAP.OBJECTS.ITEMS[hero_index].x+stepx
MAP.OBJECTS.ITEMS[hero_index].y:=MAP.OBJECTS.ITEMS[hero_index].x+stepy
нужно найти эти смещеня в случае, когда он натыкается на обЪект. Герой должен
скользить. В НОКС наверное все играли?

Автор: Archon 23.11.2006 6:26

Мне вот что в голову пришло:
1. Находим смещение героя без учёта препятствий: dx и dy
2. Проверяем координаты (x+dx, y+dy). Если свободно, идём туда, иначе
3. Проверяем координаты (x+dx, y). Если свободно, идём туда, иначе
4. Проверяем координаты (x, y+dy). Если свободно, идём туда, иначе
5. Стоим

Работает если dx <> 0 и dy <> 0.
Для строго вертикального или горизонтального движения:
Если dx = 0 проверяем координаты (x+/-dy, y)
Если dy = 0 проверяем координаты (x, y+/-dx)

Получится немного "сТуПеНчАтО" smile.gif , ну да ладно, в конце концов при желании алгоритм можно улучшить.

PS Толькочто понял, что работает только если подходить под острыми углами... Можно попробовать проверять не только x+dx, а ещё и x-dx (c y аналогично). Если ещё чего надумаю, отпишусь.