Просмотр полной версии : Движение в случайную точку
Подскажите пожалуйста как задать клипу движение в случайную точку.
Зранее спасибо!
Division
06.08.2008, 23:06
Ну допустим есть у тебя точка(случайная, ага) с координатами nx и ny. И есть текущие координаты _x и _y. Чтобы двигаться в точку nx; ny тебе нужно найти вектор движения в ту точку
dx = nx-_x;
dy = ny-_y;
Потом найдем длину вектора -
l = Math.sqrt(dx*dx+dy*dy);
Далее
dx/=l;
dy/=l;
После этого в onEnterFrame объекта пишем
_x+=dx*Speed;
_y+=dy*Speed;
Где Speed - это наша скорость.
Мог в чем-то ошибиться, так как писал сразу в форуме.
Division, не первый раз вижу эту штуку с квадратным корнем, но теперь вроде поймал автора))
Вот Вы мне объясните, ради чего Вам знать длину гипотенузы? Вы будете смещать клип не по Х и У, а сразу на столько-то пикселей по диагонали?
http://flasher.ru/forum/showthread.php?t=112351
Division
06.08.2008, 23:29
Длина гипотенузы(точнее длина вектора), нужна чтобы найти нормализованный вектор направления в нужную точку. Если этот нормализованный вектор умножить на скорость(Speed) и прибавить к нашим координатам, объект переместится ровно на Speed пикселей. Не понимаю что конкретно Вам не нравится (:
Чтобы двигаться в точку nx; ny тебе нужно найти вектор движения в ту точку Да Господь с Вами, мне вполне достаточно смещаться по Х и по У, пока они не станут равны координатам точки n. А не нравится тридцать раз в секунду высчитывать квадратные корни)))
Division
06.08.2008, 23:54
Блин, я не могу Вас понять (: Интересно, а как вы узнаете, на какое расстояние нужно смещаться по x и по y? Может покажите небольшой примерчик? Где объект с заданной скоростью будет двигаться в точку n.
PS 30 раз в секунду посчитать корень это не страшно. К тому же всегда остается простор для оптимизации.
Это с постоянной скоростью
var dx = (nx-_mc._x)/speed;
var dy = (ny-_mc._y)/speed;
_mc.onEnterFrame = function(){
this._x += dx
this._y += dy
}
Это с замедлением до нуля))
_mc.onEnterFrame = function(){
this._x += (nx-this._x)/speed;
this._y += (ny-this._y)/speed;
}
Division
07.08.2008, 00:30
Ладно, с замедлением до нуля трогать не буду, но первый пример мне почему-то не нравится (:
То есть фактически скорость движения будет зависить от начального расстояние между точками. То есть условие "с заданной скоростью" вы не выполнили (: Да и скорость(speed) на самом деле не скорость, а число кадров, за которое объект доберется от начальной точки до конечной (: То есть если бы я делал игру, например, я бы хотел чтобы мой speed был реально скоростью, количеством пикселей, которое пройду за один кадр. Ваш вариант меня бы не устроил (:
))) Дружище, я бы мог развернуть дискуссию на тему сколько клеток от одного угла тетрадного листа до другого, что собственно и есть пиксели) Но в общем-то Вы правы, я сделал не с заданной скоростью, а с постоянной.
А теперь вопрос - если у нас 30 кадров в секунду и мы достигаем точки за 10 кадров, то....?
Division
07.08.2008, 00:43
Ну я надеюсь Вы теперь не будете так вот к квадратным корням придираться? (:
UPD:
А теперь вопрос - если у нас 30 кадров в секунду и мы достигаем точки за 10 кадров, то....?
Упс, не заметил. Я не совсем понял Ваш вопрос. Если нужно определить, когда нужно остановится, то это делается довольно просто. Так как у нас есть скорость Speed и Вы почему-то не любите корни, найдем квадрат скорость
SqSpeed = Speed*Speed;
Потом при движении смотрим, если квадрат расстояния между точками (x2-x1)^2+(y2-y1)^2
меньше квадрата скорости SqSpeed, значит мы дошли до точки. На самом деле мы можем её немного "перепрыгнуть", так что можно смело ставить наши текущие координаты в точку N
? Отчего же? Длина гипотенузы гарантирует заданную скорость? Я думал фпс ее гарантирует.
Division
07.08.2008, 00:57
? Отчего же? Длина гипотенузы гарантирует заданную скорость? Я думал фпс ее гарантирует.
Хоть убейте, не понимаю. Это к чему? Перефразируйте пожалуйста.
Вы скорость в чем измеряете? А то я чую мы о разном говорим.
Я вижу так - Ваша скорость это пиксели гипотенузы, поделенные на количество кадров.
Моя скорость - пиксели катета, поделенные на кадры.
Другими словами, это количество кадров, за которые объект попадет их точки А в точку В.
Вам не смешно спорить?
Division
07.08.2008, 01:06
Моя скорость - это расстояние в пикселях, которое пройдет объект за один кадр. Например, если двигаться под углом ang, то уравнение движения будет выглядеть как
x = x0+speed*cos(ang)*t
y = y0+speed*sin(ang)*t
Ну t это наверно номер кадра, в данной ситуации.
А вообще пора заканчивать спорить (:
О нет, я только что понял Вашу мысль)))
У вас количество кадров зависит от заданной скорости и расстояния, а у меня оно постоянно) Т.е. я задаю время, а не скорость движения. Вы правы, спасибо!
Ничего себе, вы меня в конец запутали!!))))
Если вам будет не сложно, переделайте пожалуйста мой исходник так чтоб:
1.Мувик летел в произвольную точку (в пределах поля).
2.Крутился тоже произвольно.
3.Все его движения заканчивались при достижении этой точки(полная остановка).
*4.Клип переходил на след. ключевой кадр, а мувик оставался на этом месте, в этом положении.
Буду очень благодарен, может на примере пойму.
Вы хотите, чтобы все сделали за Вас?
Да, PANKRAT, Вы хотите научиться или уже денег заработать?)))
Пробуйте, только так научитесь. А то знаете, слегка бесит "Я впервые столкнулся с флещь, но мне нада саздать фотогалерею чтобы с XML, и чтобы..."
Я вот "в детстве" квадратики двигал, да как видно, так и не научился))))
Желание заработать денег меня никогда не покидает!))))
Но данный случай исключительно ради знаний, а не ради коммерции.) Я уже много всего перепробовал, просто я рисую.., и программирование для меня такие дебри. Так что без вашей помощи мне не обойтись.
Division
07.08.2008, 12:41
PANKRAT
смотри пост #2 и #10 в этой теме.
dsQuadro
07.08.2008, 13:11
Упс, не заметил. Я не совсем понял Ваш вопрос. Если нужно определить, когда нужно остановится, то это делается довольно просто. Так как у нас есть скорость Speed и Вы почему-то не любите корни, найдем квадрат скорость
SqSpeed = Speed*Speed;
Потом при движении смотрим, если квадрат расстояния между точками (x2-x1)^2+(y2-y1)^2
меньше квадрата скорости SqSpeed, значит мы дошли до точки. На самом деле мы можем её немного "перепрыгнуть", так что можно смело ставить наши текущие координаты в точку N
а не проще раз уж мы вычисляем длинну вектора в каждом кадре сделать так:
если длина вектора меньше или ровна скорости двигаться в заданные координаты???
и автора помоему интересует генерация случайных чисел для задания координат... если я правильно понял... если это так то используй
Math.random()
Division
07.08.2008, 13:13
Да, наверно так проще (:
UPD: черт, не заметил. Правильно будет двигаться если длина вектора больше или равна скорости. Потому что если длина вектора(расстояние до точки) меньше чем скорость, это значит что мы достигли точки.
gloomyBrain
08.08.2008, 00:26
по поводу скорости:
1) ну вы далёте, господа флэшеры =)
2) я делаю так:
-вычисляю разности координат по х и по у (dx и dy соответственно)
-считаю расстояние (по теореме Пифагора - умный кстати был мужик)
-подсчитываю синус и косинус угла (dy/гиппотенуза, dx/гиппотенуза)
-умножаю синус и косинус на величину скорости - получаю скорость по у и по х соответственно
-делю гиппотенузу на скорость - получаю количество шагов (целое число, дробную часть отбрасываем)
весь расчёт делается один раз для СТАТИЧЕСКИХ точек
Далее необходимо только каждый кадр/долю секунды прибавлять к текущим координатам скорости по х и по у и проверять, который сейчас шаг. Если шаг с номером, равным высчитанному ранее числу шагов - просто перемещаем объект в конечную точку и выключаем функцию/убиваем интервал
по поводу точки:
метод Math.random() выдаёт случайное значение от 0 до 0,99999 (вроде стока девяток... =))
Если вы хотите получить значение в иных пределах, то стоит делать так:
var randomX:Number = Math.random()*100-50
приведённый код выдаёт значения от -50 до 50
т.е. получаемую в Math.random() величину (от 0 до 1) мы увеличиваем в 100 раз (получаем от 0 до 100) и отнимаем 50 (получаем... ну я думаю вы уже догадались, дорогой читатель=))
ЗЫ
для динамических точек (если одна движется к другой, а другая тоже движется ещё куда-то):
не вижу другого пути, как повторять расчёт расстояния и т.д.
dsQuadro
08.08.2008, 13:24
по поводу скорости:
1) ну вы далёте, господа флэшеры =)
2) я делаю так:
-вычисляю разности координат по х и по у (dx и dy соответственно)
-считаю расстояние (по теореме Пифагора - умный кстати был мужик)
-подсчитываю синус и косинус угла (dy/гиппотенуза, dx/гиппотенуза)
-умножаю синус и косинус на величину скорости - получаю скорость по у и по х соответственно
-делю гиппотенузу на скорость - получаю количество шагов (целое число, дробную часть отбрасываем)
весь расчёт делается один раз для СТАТИЧЕСКИХ точек
Далее необходимо только каждый кадр/долю секунды прибавлять к текущим координатам скорости по х и по у и проверять, который сейчас шаг. Если шаг с номером, равным высчитанному ранее числу шагов - просто перемещаем объект в конечную точку и выключаем функцию/убиваем интервал
такой метод дает правильные величины перемещения но НЕправильное движение... так как он не может переместить обьект в координату х = 24,4544467 изза этого если останавливать движение методом проверки расстояния до точки с маленькой погрешностью твой обьект уйдет нетуда...
мне пришла другая идея!
метод Division'а грузит компьютер(хоть и не сильно но всеже) но если его скрестить с методом Wolsh'а то можно сделать так:
1 раз посчитать расстояние вектора, поделить его на заданную скорость в пикселях/кадр(есесно с округлением)... тем самым получим за сколько кадров должны пройти это расстояние, а потом сдвигаться по принципу Wolsh'атолько делить не на постоянное число а на количество расчитанных кадров (точнее на то скока их осталось... ведь каждый кадр это число надо уменьшать на 1)... таким образом мало грузится компьютер и всегда приходим точно в заданную точку...
потом сдвигаться по принципу Wolsh'атолько делить не на постоянное число а на количество расчитанных кадров (точнее на то скока их осталось... ведь каждый кадр это число надо уменьшать на 1)... таким образом мало грузится компьютер и всегда приходим точно в заданную точку...Так хорошо начал )))))) Смотри, узнаем ОДИН раз, за сколько кадров мы должны добежать до чекпойнта - методом Division, конечно. Затем делим разницу в координатах - то есть сколько пройти по х и сколько по у - на количество кадров. И далее в onEnterFrame тупо прибавляем эти величины (разные конечно для х и у) к текущим х и у.
dsQuadro
08.08.2008, 14:36
я и говорю 1 раз посчитать вектор... но если и смещение посчитать только 1 раз то получается таже проблема погрешности... точнее того, что флешь не может перемещать обьект с большой точностью... и в итоге придем не в ту точку... кто хочет может проверить... я проверял... точнее не то что проверял а в свое время сстолкнулся с этой проблемой... в итоге когда солдатик шол в нужную точку он шол немного зигзагом... а не по прямой...
Это с постоянной скоростью
var dx = (nx-_mc._x)/speed;
var dy = (ny-_mc._y)/speed;
_mc.onEnterFrame = function(){
this._x += dx
this._y += dy
}
Это с замедлением до нуля))
_mc.onEnterFrame = function(){
this._x += (nx-this._x)/speed;
this._y += (ny-this._y)/speed;
}
а можно полный код, или исходник?
мне нужно плавное движение объекта от точки А до точки Б, но именно через action script. А у меня почему-то не получаеться плавное движение =(
Division
08.08.2008, 15:58
dsQuadro сам не пробовал, но слышал где-то. Если я не прав, поправьте меня. Насколько я понял, "флешь не может перемещать объект с большой точностью" это потому что _x и _y это setter методы которые приводят координаты к целому. Или нет? Если дело в этом то почему бы не хранить координаты отдельно, при движении сначала изменять их, а только потом _x и _y присваивать те значения?
ЗЫ не проверял, могу глубоко заблуждаться.
dsQuadro
08.08.2008, 16:38
округляются не к целому а точностью помоему до 2 знаков... думаю предложенный вариант должен работать....=)
gloomyBrain
08.08.2008, 16:45
2 dsQuadro
Вы, при всём уважении, внимательно читали то, что я написал?
Если да, то Вы должно быть и сами заметили, что:
Если шаг с номером, равным высчитанному ранее числу шагов - просто перемещаем объект в конечную точку и выключаем функцию/убиваем интервал
Ткните пальцем в монитор, где объект попал не в ту точку, в которую было надо?
2 Division
_x - это геттер-сеттер, который округляется до 2-х знаков после запятой
dsQuadro
08.08.2008, 19:06
2 dsQuadro
Вы, при всём уважении, внимательно читали то, что я написал?
Если да, то Вы должно быть и сами заметили, что:
Ткните пальцем в монитор, где объект попал не в ту точку, в которую было надо?
2 Division
_x - это геттер-сеттер, который округляется до 2-х знаков после запятой
ок! тогда просо последним действием мувика будит прыжок... причем если мувик двигался достаточно долго то прыжок будит существенным...
Division
08.08.2008, 19:14
ок! тогда просо последним действием мувика будит прыжок... причем если мувик двигался достаточно долго то прыжок будит существенным...
Если у программиста кривые руки, то может быть всё что угодно. ИМХО тема себя изжила.
Да уж, такого философского побоища на тему движения клипа из точки А в точку В на Флэшере давно не было. С пятого флэша наверно) Четыре страницы голых предположений и ни одного исходника. Удачи всем, друзья! Division, приятно было познакомиться!
Division
08.08.2008, 20:00
Wolsh взаимно (:
gloomyBrain
08.08.2008, 20:32
хахаха =)
спорщики
голые предложения... кстати да, прыжок есть
Но
чем меньше шаг (т.е чем меньше скорость и чаще интервал вызова ф-ции), тем это менее заметно.
судите сами
А теперь вспомним про гениальную догадку Divisionпочему бы не хранить координаты отдельно, при движении сначала изменять их, а только потом _x и _y присваивать те значения?Не правда ли, так гораздо лучше? Ну а от зигзага просто не избавиться, увы.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.