![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1151 | |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
![]() Цитата:
Во-вторых, с аномалией или другими труднопроходимыми ячейками тоже самое, только замените алгоритм с A* на D*. В-третьих, это не реалтайм и здесь тира не устроишь. |
|
![]() |
![]() |
![]() |
#1152 | ||
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]() Цитата:
Или еще лучше - у нас возможно PvP, персонаж1 куда-то пошел по одному из двух путей, и пока он шел, один из них пересек тоже пришедший откуда-то персонаж2 с агрессивными намерениями (у которого тоже, например, два пути) и стукнул персонажа1 по голове. А тот шел в святой уверенности, что поблизости вообще никого нет. Цитата:
Ну или на одном из путей засел PvP-противник в инвизе (информация, которую ни в коем случае не должен знать клиент). В общем, ситуаций, в которой два пути, которые алгоритм примет одинаковыми по длине, могут оказаться существенно различными, придумать можно множество.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
||
![]() |
![]() |
![]() |
#1153 |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
![]()
И что что обстановка меняется? Команды на выполнение остаются прежними. Чтобы их изменить нужно заново пересчитать матрицу пути.
Если беспокоят коллизии, то достаточно их обрабатывать на клиенте, но не как не обрабатывать каждый шаг на сервере. Вы только прикиньте во сколько возрастает нагрузка при расчёте каждого шага - она возрастёт ровно на количество шагов до конечной точки. |
![]() |
![]() |
![]() |
#1154 |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
![]()
Я понял почему Вы меня не понимаете - у Вас неверное представление о цели действия в пошаговом сценарии.
Вы считаете, что должна быть возможность применять действие к пустому месту. Типо, атака по пустой ячейке, где в следующий ход должен появиться противник. Это изначально не верная логика. Действие (не перемещение) должно применяться не к ячейке, а к объекту. То есть игрок должен атаковать противника, а не ячейку. Не надо заранее рассчитывать будет ли игрок в этой ячейке через определённое количество ходов. Нужно просто обработать коллизию, проверить возможность текущего положения и получить возможность выполнения действия. Всё... |
![]() |
![]() |
![]() |
#1155 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
Виталик, ты ошибаешься, у меня нет никаких построений и уравнений. Сервер по таймеру (своему) двигает объект точка за точкой, а клиент у себя точно так же, двигает точка за точкой. Сервер ничего не считает. Вместо поиска пути я вставил "стопор", элементарное условие, что если следующая клетка на пути - препятствие, то отправить всем, что объект идет в точку до препятствия, ...только и всего. В процессе перемещения пользователя по карте, сервер ничего не считает и не передает.
Волновой алгоритм поиска пути я отметаю сразу. Причина простая. Клеток на карте много, в ММO одновременно может перемещаться и менять точку перехода 10, 20, 30 тыс. человек, не считая мобов, ...сервер просто ляжет под такой нагрузкой. Решение очень простое - переложить волновой алгоритм в мозг пользователя, пусть сам думает куда идет. Я ни разу не видел человека на улице, который бы тупо шел в стену и ждал пока его кто-нибудь направит в обход, ...он это делает сам, вот и пусть кликает по проходам. А с мобами решается очень просто, простейшая система обхода небольшого препятствия по двум сторонам. Мы это уже обсуждали на страницах этого раздела, и весьма успешно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
![]() |
![]() |
![]() |
#1156 | ||||
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
К тому же мы пока говорили только о перемещении, а как Вы собираетесь реализовывать дальние атаки (стрелковое оружие)? Если более конкретно, то как будет рассчитываться вероятность попадания на малых углах при наличии препятствий? |
||||
![]() |
![]() |
![]() |
#1157 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Виталий Желтяков, кажется, мы действительно друг друга не понимаем, хотя я по-прежнему не понял вашу точку зрения. Так что постараюсь объяснить свою.
Итак, пользователь ткнул мышкой по точке на карте, скомандовав: "Иди сюда". Для примера рассмотрим шахматную доску (та же система ячеек, что и в рассматриваемой игре). Герой стоит на А1, пользователь щелкнул на H8. Клиент, зная всю местность, рассчитал путь: сначала на А2, потом на B2, потом на B3, потом на C3... Теперь он посылает серверу сигнал: иду на А2. Тот сделал элементарную проверку: "Ага, ты находишься на А1, эта А2 соседняя и не занятая, можешь идти. Пришел." Клиент получает от сервера сообщение, что он теперь на А2, понимает, что по маршруту следующая B2 и говорит серверу: "Теперь я иду на B2". Тот снова делает элементарную проверку и дает добро. И так далее пока не дойдет, пользователь не передумает или еще что-то не произойдет, что маршрут придется пересчитать. Почему необходимо согласовывать с сервером каждый шаг? Варианта два - клиент может случайно ошибиться, или же это может быть чит. К примеру, находясь на А1, он (ошибочно или злонамеренно) может сказать серверу: "Перемещаюсь на H8". А тот ему: "Куда?! У нас по правилам можно только на соседнюю клетку за один раз перемещаться. Ну-ка стой где стоял! Или давай шагай по-честному." Таким образом, исключается случайная или читерская мгновенная телепортация через полкарты. Теперь по поводу того, кто должен считать маршрут - пользователь или сервер. Самый рациональный ответ: никто из них. Заниматься этим должен клиент и только клиент. Сервер загнется считать по волновому алгоритму пути для сотен и тысяч пользователей, в то же время он может гораздо с меньшими затратами проверять, перемещается ли каждый на соседнюю к нему свободную клетку, или его нужно завернуть с пути. А пользователю таким извращением, как ходьба только по отрезкам заниматься и вовсе не захочется. Сейчас, насколько мне известно, нет ни одной (если не считать кустарных поделок) игры, в которой юниты/персонажи по щелчку мыши (для перемещения) шли бы тупо по прямой и упирались в стенку. Везде используется хотя бы элементарный поиск пути. Если вам по дороге попадется маааленький пенек шириной в одну клетку, и ваш герой в него врежется и дальше не пойдет, вы проклянете разработчика игры и больше никогда с таким извращением дела иметь не будете. Извините за экспрессию, но пользователь сейчас балованный пошел и совершенно точно будет рассуждать именно в этом ключе. Делать игру без поиска пути - почти то же самое, что и игру с прокруткой по целому экрану. Если есть какие-то вопросы с туманом войны и рассчетом для клиента, то можно только двигаться к точке из открытого пространстов, ближайшей к указанной точке перемещения (точно так же, как делается, когда перемещение в какую-то точку на экране невозможно - нет прохода/спуска и т.д.), и по мере открытия новой области можно пересчитывать. Впрочем, это уже детали.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#1158 | |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
![]()
Как Вы предлагаете организовывать перемещение, Я понял сразу. Это глупо и ресурсоёмко и имеет проблемы в перспективе.
Цитата:
Коллизии обрабатываться по мере их возникновения по запросу с клиента. Всё равно без команды пользователя их не обработать. Организуется это при помощи пары триггеров. Сравним мой и ваш подход: - При вашем подходе количество запросов равно количеству шагов, в моём количеству команд, т.е. одному запросу. - При вашем подходе количество проверок доступности ячеек равно количеству шагов, в моём - количество_шагов*количество_рёбер. - В вашем подходе каждый ход происходит пересчёт действий всех игроков, при моём только тех, которые начали или закончили ход. - При моём подходе задержка на соединение будет только в начале перемещения (или конце), в вашем при каждом шаге. - Ваш подход не решает проблему стрелкового оружия, мой - решает. Я думаю достаточно. Если хотите возразить, то сначала прикиньте, что быстрее: установка соединения и передача пакетов или же перебор 100-200 ячеек с проверкой на доступность. |
|
![]() |
![]() |
![]() |
#1159 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,524
|
![]()
А тут вы ошибаетесь. 1.5 тыс соеденинений совсем не много
|
![]() |
![]() |
![]() |
#1160 |
Программист и
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,265
|
![]()
Это решение было бы хорошо для 3D игры с возможностью вида от третьего лица и элементарным управлением WASD, но не для 2D MMORPG. В таких играх считаю что должен присутствовать алгоритм обхода препятствий и анализа встречи с врагом при обходе, пусть даже элементарный. Пример можно посмотреть в тех же героях 3 или Disciples 2. И имея ввиду посмотреть, не надо смотреть и говорить что они пошаговые, путь рассчитывается моментально за доли секунд и красным выделяются когда столкновение с врагом. Думаю такой же алгоритм надо заложить в клиента, ведь у него будут все данные для расчета (знание видимой облости когда он перемещается: препятствия, враги). Главное в этом деле постоянное и актуальное обновление с сервером, и клиент после получения данных должен смотреть на свою построенную траекторию и анализировать появление врагов и препятствий, перестраивая маршрут для достижения цели.
Последний раз редактировалось Simply-Art; 23.05.2012 в 05:31. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уроки по созданию игр для новичков... | -=DeS=- | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 750 | 14.11.2017 20:26 |
Музыка программистов - как вы относитесь к АРИИ? | Весёлый Жека | Свободное общение | 46 | 10.10.2008 22:32 |
Конкурсы по созданию игр на Delphi | mutabor | Свободное общение | 0 | 15.06.2007 12:40 |
Работа по созданию ПО | remix | Фриланс | 3 | 22.04.2007 11:00 |