PDA

Просмотр полной версии : Плавное перемещение объекта


Mosquito
14.06.2002, 15:15
Есть объект с координатами х=283 у=270. Надо его по нажатию кнопки плавно переместить в х=96 у=334
Как посредством actionscript это сотворить?
Книжку по флэшу отдала а мозгов видимо не хватает. :confused:

greyshaman
14.06.2002, 16:32
onClipEvent(load){
angle_rad=Math.atan2((y1-y2), (x1-x2));
dy=Math.sin(angle_rad);
dx=Math.cos(angle_rad);}
onClipEvent(enterFrame){
if(кнoпканажата){
if(_x<x1&&_y<y1){
_x+=dx;
_y+=dy;
}
}
}

Вот так приблизительно.

Mosquito
14.06.2002, 16:44
огромное спасибо, но вот вопрос.
а "оно" его будет перемещать по прямой или по дуге?
мне надо по прямой...

Crazy Blot
14.06.2002, 17:10
Мне нужно приблизительно тоже самое, но только чтобы оьект колебался возле нового центра.
Например вот такая задача.
Где то помещается клип. Для негно задется скорость, и координата назначения. Он к ней стремится и поколебавшись около нее останавливается.
Что-то не могу вспомнить как это посчиать. Давно школу закончил :)

greyshaman
14.06.2002, 17:30
2 комарик а откуда там дуге взятся
2 bolt начальную :)

Crazy Blot
14.06.2002, 17:42
Я проработав 10 лет в области компьютерной графики и думать не мог, что когда-нибудь мне понадобиться вспоминать тригонометрию. Но вот погрузился во флеш и понял, что ошибался.
Чем огрызаться лучше бы помог. У меня справочников под рукой нету, а товарищи по работе все сплошные менеджеры да художники (как и я). Хоть одного бы программиста - они с математикой дружны, обычно.

lizergil
14.06.2002, 23:49
это не тригонометрия, а аналитическая геометрия на плоскости, или линейная алгебра
МГУЛ - ПМ - РУЛЕЗ!!! :D

Nox Noctis
15.06.2002, 02:12
2Carzy Blot
движение до заданной точки можно сделать как написал шаман:
считаем угол наклона траектории через арктангенс (отношение разностей соответствующих координат), и по найденному углу через синус и косинус вычисляем каждую следующую точку с заданным шагом.

теперь затухание. теория.
общая формула колебательного процесса (начальный сдвиг фазы выбросили):
x = centerpoint.x + A*cos(wt);
y = centerpoint.y + A*sin(wt);
...то есть 't' - параметр, постоянно растет, а 'w' - циклическая частота (количество периодов за единицу времени)

чтобы гармонические колебания затухали, нужно уменьшать амплитуду 'A'...
можно сделать экспоненциальное затухание
(вроде A = C*exp(-t/T); где t - это тот же параметр, C - начальное значение амплитуды, а 'T' - начальное значение параметра 't')
а можно и просто линейное.
можно, к примеру, сделать A *= 0.9; тогда каждое следующее значение амплитуды будет на одну десятую меньше предыдущего, что естесственно приведет к затуханию...

1:11 по мск времени :) примерчик делать влом :)
если нужно, то завтра... или может шаман или лизергиль разродится :)

Al S'asha
15.06.2002, 02:55
/*Этот скрипт - к любому мувику.
Хрестоматийный пример
bounce .
Только ещё как Bonus - можно делать драг мышью*/
onClipEvent (mouseDown) {
// drag the object if the cursor is over it and mouse is clicked
if (hitTest(_root._xmouse, _root._ymouse, true)) {
startDrag ("");
set ("_parent.press" add this._name, true);
// get the location of this object when picked up
xLoc = this._x;
yLoc = this._y;
// get the time
timePressed = getTimer();
}
}
onClipEvent (mouseUp) {
stopDrag ();
set ("_parent.press" add this._name, false);
// checking the timer, we can find out:
// did the user throw the object, or just pick it up and carry it?
if (getTimer()<timePressed+300) {
// they definitely threw the object.
// what is the new location of this object?
xNewLoc = this._x;
yNewLoc = this._y;
// how hard did they throw it?
xTravel = xNewLoc-xLoc;
yTravel = yNewLoc-yLoc;
// setting the speed of the object depending on how far they travelled with it
xInc = xTravel/2;
yInc = yTravel/2;
timePressed = 0;
} else if (getTimer()>timePressed+300) {
// they did not throw the object, just carried it, so don't move it
xInc = 0;
yInc = 0;
}
}
onClipEvent (enterFrame) {
hit = false;
for (objects in _parent) {
// check out all of the other objects, are they touching this one?
if (hitTest(eval("_root." add objects add "._x"), eval("_root." add objects add "._y"), true) && objects != this._name) {
hit = true;
}
if (hit == true && objects != this._name) {
// an object is touching this one, but where is it?
if (eval("_root." add objects add "._y")<this._y) {
// if the colliding object is above this one,
// we have to allow it to bounce to the left or right if necessary
offset = (this._x-eval("_root." add objects add "._x"));
set ("_root." add objects add ".xInc", eval("_root." add objects add ".xInc")+offset);
xInc = xInc+offset;
}
// we find out how hard the other object hit this one
// the impact of that object affects the speed of this object
xIncHit = eval("_root." add objects add ".xInc");
yIncHit = eval("_root." add objects add ".yInc");
yInc = yInc+yIncHit;
xInc = xInc+xIncHit;
this._x = this._x+xIncHit;
this._y = this._y+yIncHit;
// when an object hits another, its speed is reversed. here, we just send the object
// in the other direction, at the same speed it was travelling when it hit this one
//
// we don't know which object hit us, so we just find out the name of the last thing
// that hit us, and set its movement values to the opposite of what it was before
set ("_root." add objects add ".xInc", eval("_root." add objects add ".xInc")*(-1));
set ("_root." add objects add ".yInc", eval("_root." add objects add ".yInc")*(-1));
hit = false;
}
}
// time to make the object move
if (eval("_parent.press" add this._name) != true) {
// the speed increment becomes 94% of itself in each iteration. this is our "friction".
// it may or may not be scientific, but it looks realistic
xInc = xInc*.94;
yInc = yInc*.94;
// ditto for gravity. we need something to make the object(s) drop towards the bottom
gravity = 3;
yInc = yInc+gravity;
// these next two lines are actually the core movement of this object
this._y = this._y+yInc;
this._x = this._x+xInc;
// set up the bounds for bouncing objects
leftBound = 0;
rightBound = 550;
topBound = 0;
bottomBound = 400;
// if the object goes off bounds, send it back and reverse its travel speed
if (this._x>rightBound) {
this._x = rightBound;
xInc = -xInc;
} else if (this._x<leftBound) {
this._x = leftBound;
xInc = -xInc;
} else if (this._y>bottomBound) {
this._y = bottomBound;
yInc = -yInc;
} else if (this._y<topBound) {
this._y = topBound;
yInc = -yInc;
}
}
}

Crazy Blot
15.06.2002, 14:51
Справочник нарыл заодно. Что-то начало смутно вспылвать из пучин забвения.

Mosquito
17.06.2002, 17:52
А почему в скрипте стоит onClipEvent(load) ?
Если мне просто надо on (press) то принцип остается тот же или меняется?
Сорри, если вопрос сильно чайниковский. давно я над скриптами не сидела.... да если бы и сидела вряд ли бы вопрос стал от этого умней :(
:)

greyshaman
18.06.2002, 10:57
Оригинал написал(а) Mosquito
Есть объект с координатами х=283 у=270. Надо его по нажатию кнопки плавно переместить в х=96 у=334
Как посредством actionscript это сотворить?

так наверное проще. Чё то намудрил в прошлый раз хотя и правильно но тупо.

frames - за сколько кадров перемещаем объект

_root.activeframe=0; // и где мы есть
on (press) {
dx=(_root.x2-_root.x1)/frames;
dy=(_root.y2-_root.y1)/frames;
if(_root.activeframe<=frames){
_root.mc._x+=dx;
_root.mc._y+=dy;
_root.activeframe++; //чуть не забыл
}
}

best regards,
Grey

Mosquito
18.06.2002, 12:24
огромнейший мерси.
ща попробую. мож сработает. :)

Mosquito
18.06.2002, 14:14
по клику "оно" перемещается только на одно dx и одно dy :( и цикл совершенно не отрабатывает
аааааааааа :eek:
Вот собсно то, что у меня стоит в мувике кот. потом вставляется в сцену, где этот самый fon и должен двигаться:
on (press) {
_root.activeframe = 0;
frames = 50;
dx = (_root.fon.x2-_root.fon.x1)/frames;
dy = (_root.fon.y2-_root.fon.y1)/frames;
if (_root.activeframe<=frames) {
_root.fon._x += dx;
_root.fon._y += dy;
_root.activeframe++;
}
}

greyshaman
18.06.2002, 14:54
лажаюсь
на так
на кнопке
on (press) {
_root.mc.bp=true;
_root.mc.dx = (_root.fon.x2-_root.fon.x1)/50;
_root.mc.dy = (_root.fon.y2-_root.fon.y1)/50;
}
on(release){
_root.mc.bp=false;
}
в мувике
onClipEvent(enterFrame){
if(bp){
if (_root.activeframe<=50) {
_root.fon._x += dx;
_root.fon._y += dy;
_root.activeframe++;
}
}
}

Mosquito
18.06.2002, 15:22
структура всей сцены немного не такая.
сцена с мувик-объектом fon, в ней мувик с кнопкой, при нажатии на кот. мувик-объект fon двигается в этой сцене.
Навертела короч :)
Скрипт меняется от этого???

Mosquito
18.06.2002, 16:29
на самом деле все заработало.
больной пасиб.
но вот что теперь неясно. после того как fon вернуть в то положение где он был изначально, то по нажатию на эту кнопку он уже никуда не двигается.
то бишь срабатывает это один раз и усе. :(
ну да ладно. буду разбираться. хватит мне уже людей от дела отвлекать :)