![]() |
Как узнать растояние между Movie ???
Вложений: 1
Всем привет!
Помогите переписать function. Данная функция расчитывает - растояния между двумя мувиками, как показанно на рисунке (см. внизу) проблем в том, что она жрет много ресуров //movie => _root.IE._target //x,y => _root.IE._x, _root.IE._y function distance(x, y, movie) { movie=eval(movie); mass = new Array(); //distance +X for (i=1; i<=_root.road._width; i++) { if (_root.road.hitTest(movie._x+i, movie._y, true)) {break;} } mass["R"]=i; //distance +Y for (i=1; i<=_root.road._height; i++) { if (_root.road.hitTest(movie._x, movie._y+i, true)) {break;} } mass["D"]=i; //distance -X for (i=1; i<=_root.road._width; i++) { if (_root.road.hitTest(movie._x-i, movie._y, true)) {break;} } mass["L"]=i; //distance -Y for (i=1; i<=_root.road._height; i++) { if (_root.road.hitTest(movie._x, movie._y-i, true)) {break;} } mass["U"]=i; return (mass); } За любой ответ зарание благодарен ;) |
юзайте теорему Пифагора.
|
И где ее применить?
Обрати внимание, что Clip "road" имеет сложную форму, в центре которой пустое место. Нужно найти растояния от "IE" до 'непустой' области "road", по Осям |
АУУУУУ! Ну хоть у когото есть идеи? Принимаю любые.
|
ты скажи задачу, то может тебе и такая функция не нуна будет)
|
Вложений: 1
Дело в том что я пишу небольшой симулятор гоночек,
код который показан выше - это часть кода котороая отвечает за движение "Искуственного Интелекта" (IE). Можете посмотреть вложеный файл, и попробывать поиграть без IE а потом с 1 или 2-мя IE. Разница заметна. |
сделай уравнение кривой, а потом по приращениям
|
Искуственный Интелект пишется AI, IE это сами знаете что :) Не стоит путать.
|
Кривой??? Всей дороги???
Рисунок я повесил только чтоб было понятно назначение функции. А реально, "кривая" - это произвольное стирание (Eraser Tool) закрашеного прямоугольника. Стертое место потом и образует - дорогу. |
Если бы я делал, то учитывал от машины только 4 точки, а именно центр соприкосновения колес, но не с дорогой, а тем что находиться за дорогой.
Если надо ввести учет соприкосновения с машинами соперников. То тут добавятся еще 4 тоски по углам машины. Но! Сначало проводить грубый хитТест для учета пересечения прямоугольников машин, если истина, тогда включать обсчет этих четерых точек с дрйгой машиной. |
Интересно. Что-то из этого я применю.
Но все же главная проблема заключается не в находения соприкосновения, а в нахождении растояния до него (чтоб ИЕ мог перерасчитывать напрваление движения) |
x1 = 0;
x2 = 1; y1 = 0; y2 = 1; trace (Math.sqrt (Math.pow ((x1 - x2), 2) + Math.pow ((y1 - y2), 2))); Где x1,x2,y1,y2 это координаты центра машин |
полярная система координат и массив [радиус векотор, угол] для пути движения или уравнение кривой....
если знаешь хоть чуток математику, поймешь,что с помошью уравнения можно нарисовать даже самую сумашедшую кривую |
iNils - перечитай главный вопрос
seeker2005 - эт анриал, описать таким способом кривую можно, но я просто за*бусь это делать, для всех карт. |
Перчитал и не понял чего ты хочешь.
|
Посмотри на рисунок.
На нем изображены два мувика IE и ROAD IE это просто круг; форма его не имеет никакого значения, нужны только его координаты на сцене ROAD - мувик со сложной формой (прямоугольник с стертой в ней областью) IE находится в стертой области ROAD Надо найти растояния от IE до нестертой области ROAD по вертикали и горизонтали в 4-ех напрвлениях (как показанно на рисунке) Функция которая написана в самом начале - это и делает. Но она жрет много ресурсов. Хотелось бы узнать возможно ли найти эти 4-е растояния каким-либо другим способом. |
Я тоже не совсем понял, чего тебе надо...
Если тебе надо кратчайщее растояние - то теорема Пифагора и решение тебе iNils уже дал. Если по кривой - кроме того метода, который я тебе предложил, я не знаю( В любом случае, когда ты работаешь на плоскости с одним направлением движения - самый оптимальный способ - полярная система координат. Ну а способы описания - либо дискретный в массиве (плюсы - не надо уравнения выдумывать), либо сполшной - уравнение |
Ну если вам непонятно мое описание, тогда всмотритесь в Script
Он создает масив (mass) в котором будут возвращенны эти 4-растояния (mass["R"], mass["L"], mass["D"], mass["U"]), каждое растояние расчитывается по одному принципу, например для mass["R"] - растояние от IE до ROAD по оси +Х //movie._x, movie._y ==== _root.IE._x, _root.IE._y for (i=1; i<=_root.road._width; i++) { if (_root.road.hitTest(movie._x+i, movie._y, true)) {break;} } mass["R"]=i; |
Максимально быстрый способ - при загрузки игры проходись по кривой трасы hitTest, записывай координаты х и y в массив, потом просто когда надо будет определить растояние, будешь брать значение из массива...
Массив организовывай по какой либо переменной. Например по Х тогда каждому значению X у тебя будет соответствовать набор (массив) значений по Y (трасса ведь одну и ту же точку по X может пересекать несколько раз по Y)... После всего этого просто алгоритм обработки вложенных массивов в заданной точке X Когда получишь значение по Y, используя его можешь найти и разницу по Х.... если этот поиск будет долгим, то тогда сделай еще один массив точек, только сортированный по Y... Точности в пиксел тебе более чем достаточно, поэтому не парься с дробями, да и вычисления проще будут)) |
Искуственный интелект — IE, ржу нимагу :D
|
Почитай про пути http://www.dembicki.org/path/index.html
Задать траекторию движение машин с AI по пути и с учетом кривизны менять скорость. Задавая уровень развития AI, можно ограничить рандом для уменьшения или увеличения степени ошибок при прохождении. |
ultraflasher - нехер сказать, так не вы*буйся
|
Цитата:
|
да, Path можно заюзать, но машинку к нему привязать на резинке:
машинка всегда стремится к точке на Path, при этом внешние факторы ее могут отталкивать от точки на Path. Второй момент - определение столкновения с препятствием: важно не только получить данные о том, что столкновение произошло, но и то, под каким углом в этом месте находится препятствие. Теоретически это можно сделать с помощью Path, но запаришься прописывать кривые в код (TO DO: JSFL). Поэтому кратчайшим путем будет создание Tween анимации объекта по пути (orient to path). При инициализации уровня в кадре пробегаешь по пути мувиком (это можно сделать за один кадр) и собираешь данные в массив о позиции и угле твоего объекта на пути. Как только ты определил, что произошел хит тест, пробегаешься по массиву и находишь 2 ближайшие точки на пути, принимаешь за основу то, что они лежат на прямой и находишь точку - перпендикуляр к этой прямой, а также угол, как соответствующую пропорцию углов. Считаешь отскок. |
Ив. По поводу кривых в код.
Делал я несколько игр в которых надо было задать сложную траекторию. Я кидал на сцену компонент с помощью которого добавлял точки и и строил по ним кривую Безье. Координаты точек сразу записывались в Shared Object. В процессе подгона я координаты менял, но значения соответственно всегда сохранялись. Когда получал нужный результат, координаты из SO переписывал в массив. Время экономится в разы |
хорошая тема. спасибо.
|
кстати, писать лучше не в SO а прямо в буфер обмена.
|
Спасибо за помощь.
Я так и сделаю. |
Цитата:
|
> Спасибо за помощь.
Незачто. > Я так и сделаю. делай делай, не жалко :) |
| Часовой пояс GMT +4, время: 17:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.