Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как узнать растояние между Movie ??? (http://www.flasher.ru/forum/showthread.php?t=69923)

leo99 04.10.2005 12:23

Как узнать растояние между 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);
}

За любой ответ зарание благодарен ;)

Art-dir 04.10.2005 18:01

юзайте теорему Пифагора.

leo99 04.10.2005 18:33

И где ее применить?

Обрати внимание, что Clip "road" имеет сложную форму, в центре которой пустое место.
Нужно найти растояния от "IE" до 'непустой' области "road", по Осям

leo99 05.10.2005 12:02

АУУУУУ! Ну хоть у когото есть идеи? Принимаю любые.

seeker2005 05.10.2005 12:25

ты скажи задачу, то может тебе и такая функция не нуна будет)

leo99 05.10.2005 12:47

Вложений: 1
Дело в том что я пишу небольшой симулятор гоночек,
код который показан выше - это часть кода котороая отвечает за движение "Искуственного Интелекта" (IE).

Можете посмотреть вложеный файл, и попробывать поиграть без IE а потом с 1 или 2-мя IE. Разница заметна.

seeker2005 05.10.2005 12:50

сделай уравнение кривой, а потом по приращениям

iNils 05.10.2005 13:07

Искуственный Интелект пишется AI, IE это сами знаете что :) Не стоит путать.

leo99 05.10.2005 13:21

Кривой??? Всей дороги???
Рисунок я повесил только чтоб было понятно назначение функции.

А реально, "кривая" - это произвольное стирание (Eraser Tool) закрашеного прямоугольника. Стертое место потом и образует - дорогу.

iNils 05.10.2005 13:30

Если бы я делал, то учитывал от машины только 4 точки, а именно центр соприкосновения колес, но не с дорогой, а тем что находиться за дорогой.
Если надо ввести учет соприкосновения с машинами соперников. То тут добавятся еще 4 тоски по углам машины. Но! Сначало проводить грубый хитТест для учета пересечения прямоугольников машин, если истина, тогда включать обсчет этих четерых точек с дрйгой машиной.

leo99 05.10.2005 13:48

Интересно. Что-то из этого я применю.

Но все же главная проблема заключается не в находения соприкосновения, а в нахождении растояния до него (чтоб ИЕ мог перерасчитывать напрваление движения)

iNils 05.10.2005 14:03

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 это координаты центра машин

seeker2005 05.10.2005 14:05

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

leo99 05.10.2005 14:35

iNils - перечитай главный вопрос

seeker2005 - эт анриал, описать таким способом кривую можно, но я просто за*бусь это делать, для всех карт.

iNils 05.10.2005 14:41

Перчитал и не понял чего ты хочешь.

leo99 05.10.2005 15:09

Посмотри на рисунок.
На нем изображены два мувика IE и ROAD

IE это просто круг; форма его не имеет никакого значения, нужны только его координаты на сцене

ROAD - мувик со сложной формой (прямоугольник с стертой в ней областью)

IE находится в стертой области ROAD

Надо найти растояния от IE до нестертой области ROAD по вертикали и горизонтали в 4-ех напрвлениях (как показанно на рисунке)

Функция которая написана в самом начале - это и делает. Но она жрет много ресурсов.

Хотелось бы узнать возможно ли найти эти 4-е растояния каким-либо другим способом.

seeker2005 05.10.2005 15:15

Я тоже не совсем понял, чего тебе надо...
Если тебе надо кратчайщее растояние - то теорема Пифагора и решение тебе iNils уже дал. Если по кривой - кроме того метода, который я тебе предложил, я не знаю(
В любом случае, когда ты работаешь на плоскости с одним направлением движения - самый оптимальный способ - полярная система координат. Ну а способы описания - либо дискретный в массиве (плюсы - не надо уравнения выдумывать), либо сполшной - уравнение

leo99 05.10.2005 15:45

Ну если вам непонятно мое описание, тогда всмотритесь в 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;

seeker2005 06.10.2005 06:47

Максимально быстрый способ - при загрузки игры проходись по кривой трасы hitTest, записывай координаты х и y в массив, потом просто когда надо будет определить растояние, будешь брать значение из массива...
Массив организовывай по какой либо переменной. Например по Х
тогда каждому значению X у тебя будет соответствовать набор (массив) значений по Y (трасса ведь одну и ту же точку по X может пересекать несколько раз по Y)...
После всего этого просто алгоритм обработки вложенных массивов в заданной точке X
Когда получишь значение по Y, используя его можешь найти и разницу по Х....
если этот поиск будет долгим, то тогда сделай еще один массив точек, только сортированный по Y...

Точности в пиксел тебе более чем достаточно, поэтому не парься с дробями, да и вычисления проще будут))

ultraflasher 06.10.2005 09:30

Искуственный интелект — IE, ржу нимагу :D

iNils 06.10.2005 10:35

Почитай про пути http://www.dembicki.org/path/index.html
Задать траекторию движение машин с AI по пути и с учетом кривизны менять скорость. Задавая уровень развития AI, можно ограничить рандом для уменьшения или увеличения степени ошибок при прохождении.

leo99 06.10.2005 12:42

ultraflasher - нехер сказать, так не вы*буйся

ultraflasher 06.10.2005 13:04

Цитата:

Сообщение от leo99
ultraflasher - нехер сказать, так не вы*буйся

http://deforum.ru/forum/images/smiles/lol.gif

Iv 06.10.2005 15:12

да, Path можно заюзать, но машинку к нему привязать на резинке:
машинка всегда стремится к точке на Path, при этом внешние факторы ее могут отталкивать от точки на Path.

Второй момент - определение столкновения с препятствием:
важно не только получить данные о том, что столкновение произошло,
но и то, под каким углом в этом месте находится препятствие.
Теоретически это можно сделать с помощью Path, но запаришься
прописывать кривые в код (TO DO: JSFL).
Поэтому кратчайшим путем будет создание Tween анимации объекта по пути
(orient to path). При инициализации уровня в кадре пробегаешь по пути мувиком (это можно сделать за один кадр) и собираешь данные в массив о позиции и угле твоего объекта на пути.
Как только ты определил, что произошел хит тест, пробегаешься по массиву и находишь 2 ближайшие точки на пути, принимаешь за основу то, что они лежат на прямой и находишь точку - перпендикуляр к этой прямой, а также угол, как соответствующую пропорцию углов. Считаешь отскок.

iNils 06.10.2005 18:13

Ив. По поводу кривых в код.
Делал я несколько игр в которых надо было задать сложную траекторию. Я кидал на сцену компонент с помощью которого добавлял точки и и строил по ним кривую Безье. Координаты точек сразу записывались в Shared Object.
В процессе подгона я координаты менял, но значения соответственно всегда сохранялись. Когда получал нужный результат, координаты из SO переписывал в массив. Время экономится в разы

Iv 06.10.2005 18:26

хорошая тема. спасибо.

Iv 06.10.2005 18:44

кстати, писать лучше не в SO а прямо в буфер обмена.

leo99 06.10.2005 20:29

Спасибо за помощь.
Я так и сделаю.

iNils 06.10.2005 20:37

Цитата:

Сообщение от BitSky
кстати, писать лучше не в SO а прямо в буфер обмена.

Я все это в mx делал. Кроме того как я уже говорил, могут быть правки точек, и поэтому до получения конечных результатов лучше координаты хранить на диске. А вывод в массив у меня шел через трейс делая сразу готовый для вставки AS.

ultraflasher 06.10.2005 20:37

> Спасибо за помощь.

Незачто.

> Я так и сделаю.

делай делай, не жалко :)


Часовой пояс GMT +4, время: 17:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.