Пьяная походка - Drunked walking / вычисление точки встречи
Модератор: 4epT
Взял то что у меня было прикреплено в этой теме пару страниц назад. Попытался ещё раз разобраться и добавить изменяемую дистанцию атаки. Старых записей не сохранил, так что у меня там было в прошлый раз пытался понять очень долго
Потом каким-то чудом понял то что у меня там было и вроде как сделал то что хотел. Плюс - добавил очень кривенький графический вывод информации.
Синяяя точка - игрок
Красная точка - моб
Бардовая точка - место куда моб движется
в конце пути на конце синей и красной линии появляются чёрные точки - это именно те места где будут моб и игрок когда игрок может начинать атаку. Эти чёрные точки рисуются на случай если рисуемые линии немного выйдут за свои пределы, чтоб не путаться.
И ещё - если моб доходит то точки назначения - то рисуется его путь дальше, по той-же самой траектории
Потом выложу теоретическое обоснование
Потом каким-то чудом понял то что у меня там было и вроде как сделал то что хотел. Плюс - добавил очень кривенький графический вывод информации.
Синяяя точка - игрок
Красная точка - моб
Бардовая точка - место куда моб движется
в конце пути на конце синей и красной линии появляются чёрные точки - это именно те места где будут моб и игрок когда игрок может начинать атаку. Эти чёрные точки рисуются на случай если рисуемые линии немного выйдут за свои пределы, чтоб не путаться.
И ещё - если моб доходит то точки назначения - то рисуется его путь дальше, по той-же самой траектории
Потом выложу теоретическое обоснование
- Вложения
-
- RO walk calc.rar
- v 0.2.0.0
- (192.25 КБ) 211 скачиваний
краткая теория
- картинка с пояснением той длинной и страшной формулы
- код программы с комментраиями что к чему и зачем
насчёт этого алгоритма есть один большой минус - если игрок не успевает перехватить моба по пути, и тот благополучно успевает дойти до точки назначения - в формуле выходит отрицательное число под корнем. поэтому нужно заранее определить, успеет ли игрок перехватить моба или нет.
Я думал над этим, но тот способ что у меня там используется не всегда подходит, в некоторых случая продолжают вылетать эксепшены.
можно конечно использовать try и в случае эксепшена считать что игрок дойти не успеет - но это как-то непрофесионально
короче вопрос - успеет ли моб добежать до точки назначения? или его по пути успеет начать атаковать бот? найти это как?
- картинка с пояснением той длинной и страшной формулы
- код программы с комментраиями что к чему и зачем
насчёт этого алгоритма есть один большой минус - если игрок не успевает перехватить моба по пути, и тот благополучно успевает дойти до точки назначения - в формуле выходит отрицательное число под корнем. поэтому нужно заранее определить, успеет ли игрок перехватить моба или нет.
Я думал над этим, но тот способ что у меня там используется не всегда подходит, в некоторых случая продолжают вылетать эксепшены.
можно конечно использовать try и в случае эксепшена считать что игрок дойти не успеет - но это как-то непрофесионально
короче вопрос - успеет ли моб добежать до точки назначения? или его по пути успеет начать атаковать бот? найти это как?
- Вложения
-
- teorija.txt
- (13.72 КБ) 192 скачивания
теперь вроде правильно определяется - надо идти сразу на конечную точку моба или надо перехватывать его в пути.
а ещё теперь картинка выводится без моргания
заодно сразу в исходниках дописал в коментах то что было отдельно в том текстовом документе
тут я ещё одну проблему нашёл
допустим координаты мгрока 2 , 14
координаты моба 24 , 12
моб идёт в точку 8 , 12
скорость предположим у обоих 1
дистанция атаки - 1
и благодаря всему этому мы получаем "invalid floating point operation" и ничего не считается
раньше подобные ошибки возникали при условии что моб доходит до своей точки назначения, а игрок не успевает его перехватить. С этой проблемой я разобрался, так что тут дело определённо не в этом
если теперь скорость одного из них чуть увеличить - то всё считается и рисуется и всё работает!. Я даже отловил условия возникновения ошибки -
-одинаковая скорость
-моб движется строго горизонтально (или строго вертикально)
и вот теперь я смотрю на ту формулу и мне страшно даже попытаться понять как там при этих условиях может получиться орицитальное число под корнем
а ещё теперь картинка выводится без моргания
заодно сразу в исходниках дописал в коментах то что было отдельно в том текстовом документе
тут я ещё одну проблему нашёл
допустим координаты мгрока 2 , 14
координаты моба 24 , 12
моб идёт в точку 8 , 12
скорость предположим у обоих 1
дистанция атаки - 1
и благодаря всему этому мы получаем "invalid floating point operation" и ничего не считается
раньше подобные ошибки возникали при условии что моб доходит до своей точки назначения, а игрок не успевает его перехватить. С этой проблемой я разобрался, так что тут дело определённо не в этом
если теперь скорость одного из них чуть увеличить - то всё считается и рисуется и всё работает!. Я даже отловил условия возникновения ошибки -
-одинаковая скорость
-моб движется строго горизонтально (или строго вертикально)
и вот теперь я смотрю на ту формулу и мне страшно даже попытаться понять как там при этих условиях может получиться орицитальное число под корнем
- Вложения
-
- RO walk calc.rar
- 0.3.0.0
- (223.03 КБ) 198 скачиваний
Да я и сам уже в РО почти не играю (и бота последний раз запускал давненько), просто раз уж тут есть шанс как-то помочь благому делу то в свободное время можно и тыковку почесать, подумать.kLabMouse писал(а):Yoggy
Хм.... нужно будет попробывать засунуть в кору и посмотреть.
Правда, признаюсь по секрету, кору Я не запускал уже полтора года
Ну и вот недавно просматривал топики в "идеях" и наткнулся на эту тему. Решил до конца это дело довести, а потом пусть кто захочет всё это на перл портирует и в опенкору добавляет
а перл я не знаю так что с добавлением этого помочь не смогу
(правда с учётом этих появляющихся ошибок и исключений - явно видно что моих универских знаний математики и физики тут не хватает, придётся думать кому-то ещё)
источник той предидущей проблемы я нашёл - оказывается при описанных мною условиях происходит не извелкание корня из отрицательного числа, а деление на ноль (там в формуле один значёк деления есть, и вот он единственный вызывает такую бяку). Что с этим делать я как-то пока не сообразил. Насколько я помню тут надо считать предел, с учётом что всё то что в знаменателе стремится к нулю. И добавлять ещё всякие проверки в коде, короче не факт что это сработает, и скорее всего есть более подходящее решение.
Я денька на два пропаду, заодно подумаю что с этим сожно сделать..
И ещё. Скорость моба не должна быть равной нулю, а то получается непрятный казус в виде внеочередного деления на ноль. Ну тут всё просто - делаем соответсвующую проверку и с учётом дистанции атаки считаем точку в которой игрок уже сможет напасть на стоящего на исходной позиции моба.
Ну вот хотя-бы вот эта проблема решится без проблем и мозголомства
И ещё И ещё. А если игроку придётся идти не по ровной поверхности, а по полю с деревьями/кустами которые ему ещё придётся обходить? Он тогда по времени не успеет догнать моба, и придёт с явным опозданием. Я не знаю как там это сейчас устроено в опенкоре, но наверное он ещё раз просчитает путь до моба и опять попытается его догнать, так?
И аналогично если моб дошёл до точки назначения, он же не будет стоять на месте а скорее всего попытается пройтись ещё куда-нибудь. В итоге бот придёт к той точке где он хотел атаковать моба, а тот уже свалил...
Давай исключим то что нужно ходить по поверхности с препятсвиями. Ибо рощёт должен происходить только когда траектория чиста, иначе двигаемя ближе к конечной точке, ибо так делают люди обходя препятсвия.Yoggy писал(а):И ещё И ещё. А если игроку придётся идти не по ровной поверхности, а по полю с деревьями/кустами которые ему ещё придётся обходить? Он тогда по времени не успеет догнать моба, и придёт с явным опозданием. Я не знаю как там это сейчас устроено в опенкоре, но наверное он ещё раз просчитает путь до моба и опять попытается его догнать, так?
И аналогично если моб дошёл до точки назначения, он же не будет стоять на месте а скорее всего попытается пройтись ещё куда-нибудь. В итоге бот придёт к той точке где он хотел атаковать моба, а тот уже свалил...
решение проблемы может и не слишком элегантное, но мне понравилось
проверяем, что получается в знаменателе. Если там ноль - то слегка увеличиваем скорость игрока (у меня там увеличение на 1/MaxInt это что-то умноженное на десять в минус десятой степени). Это практически не повлияет на результат, но ноля в знаменателе уже не будет
заодно добавил проверку на скорость моба равной нулю
ещё была одна учень глупая ошибка в первой проверке (на досягаемость моба с самого начала). Там проверялось не расстояние от игрока до моба, а от стартовой до конечной точки моба . Тоже исправил
сейчас я бы сказал что это дело уже можно внедрять в опенкору, все ошибки что у меня попадались я вроде исправил
проверяем, что получается в знаменателе. Если там ноль - то слегка увеличиваем скорость игрока (у меня там увеличение на 1/MaxInt это что-то умноженное на десять в минус десятой степени). Это практически не повлияет на результат, но ноля в знаменателе уже не будет
заодно добавил проверку на скорость моба равной нулю
ещё была одна учень глупая ошибка в первой проверке (на досягаемость моба с самого начала). Там проверялось не расстояние от игрока до моба, а от стартовой до конечной точки моба . Тоже исправил
угуДавай исключим то что нужно ходить по поверхности с препятсвиями. Ибо рощёт должен происходить только когда траектория чиста, иначе двигаемя ближе к конечной точке, ибо так делают люди обходя препятсвия.
сейчас я бы сказал что это дело уже можно внедрять в опенкору, все ошибки что у меня попадались я вроде исправил
- Вложения
-
- RO walk calc.rar
- v 0.4.0.0
- (223.31 КБ) 208 скачиваний