Просмотр полной версии : Зацикленное элипсообразное решение.
Acrossfy
10.03.2009, 19:20
Появилась задача реализовать подобное программно. Муви клип постоянно движется по определенной элиптической траектории. С помощью рисованной траектории и таймлайновой анимации реализовывать подобное не хочется.
Была попытка сделать это с помощью цикла и четырех движений классом TweenLite. Ничего вразумительного из этого не вышло.
Буду очень благодарен, если кто-то поделится своими предложениями и знаниями)
nOobCrafter
10.03.2009, 19:46
http://demiart.ru/forum/index.php?showtopic=78132
можно тут глянуть, пример Монстра весьма подробно изложен.
Acrossfy
10.03.2009, 20:01
Огромное спасибо, ссылка очень помогла. А то я тут велосипед изобретал)
Acrossfy
12.03.2009, 23:13
На основе примера Монстра сделал нужное движение.
var xdist:Number=2;
var radStep:Number=Math.PI/360;
var ydist:Number=8;
var speed:Number=1;
var angle:Number=0;
mc.onEnterFrame = function(){
angle+=5;
var rad=angle*radStep;
mc._x=(Math.cos(rad)*xdist)/2;
mc._y=(Math.sin(rad)*ydist)/2;
};
Столкнулся со следующей проблемой. Мувиклип движется относительно начала координат сцены. Мне нужно, поместить его на определенную точку. Допустим на (60, 60).
Решается это вот так:
mc._x=60 + (Math.cos(rad)*xdist)/2;
mc._y=60 + (Math.sin(rad)*ydist)/2;
Однако это жутко портит всю малину, ведь с координатами "mc" работают и другие функции перемещающие объект по сцене.
И тогда, предварительно передвинув муви клип на точку (60, 60), я решаю проблему так:
mc._x=mc._x + (Math.cos(rad)*xdist)/60;
mc._y=mc._y + (Math.sin(rad)*ydist)/60;
И вот после этого все работает, как надо, кроме самой функции. Объект в данном случае движется не по элипсу, а по элипсообразной спирали, медленно и плавно уходя за экран.
В чем может быть проблема? Как избавиться от этого побочного эффекта?
Один из нюансов. Когда вместо численных кординат, прописал "mc._x" и "mc._у", мувиклип крутился как бешенный, пока я не увеличил делитель в самой формуле. С 2 до 60.
P.S. Мувик обязательно должен быть на главной сцене. Конечно, если бы его можно было просто вложить в другой мувик, и тот уже двигать куда надо, проблем не было бы. Однако код моей флешки не позволяет делать этот клип вложенным.
Вы подумайте, что вы сделали, заменив 60 на переменную, которую в этой-же строке изменяете, и поймёте, что не так.
Acrossfy
12.03.2009, 23:56
Ну да.. Глупо было спрашивать почему при этом работает не так, как надо. Но как еще в данном случае заставить клип двигаться вокруг своего положения в сцене, не указывая координат?
Эти цифры и есть положение клипа в сцене, т.е. центр эллипса. Вам нужно завести вместо них две новые переменные, и для движения клипа изменять их, а не mc._x,mc._y.
Acrossfy
13.03.2009, 01:08
Ну допустим:
//добавляем
var a:Number=prod._x;
var b:Number=prod._y;
//изменяем
prod._x=a + (Math.cos(rad)*xdist)/2;
prod._y=b + (Math.sin(rad)*ydist)/2;
Возникает побочный эффект, рассмотренный в первом случае, когда клип прибивался на координаты, и никакая другая функция его сдвинуть не могла.
Добавлено через 4 минуты
Имеется класс, в котором "mc._x" на "a" поменять никак нельзя. Координаты записываются иным способом.
TweenLite.to(prod, 0.75, {_x:60, _y:60, ease:Back.easeIn, onComplete:onFinishTween});
Вам надо всё-таки немного думать, что вы делаете и что в результате этого происходит. Если вы будете постоянно присваивать a и b значения _x и _y, какой тогда смысл в добавлении этих переменных?
Вторую проблему можно решить разными способами. Можно сделать невидимый объект, к которому вы будете применять трансформации, а потом перемещать на новое место видимый; можно сделать новый класс на основе нужного, и т.д.
Acrossfy
13.03.2009, 02:44
какой тогда смысл в добавлении этих переменных?
Я был бы очень признателен, если бы вы продемонстрировали ваш пример использования переменных.
Нечего тут демонстрировать, это элементарнейшая вещь.
Переменные инициализируются один раз - задаётся начальное положение объекта. Дальше вы меняете их, когда вам требуется переместить объект. Всё.
nOobCrafter
13.03.2009, 11:22
var radStep:Number=Math.PI/360;
var ydist:Number=8;
var speed:Number=1;
var angle:Number=0;
var rad:Number; // просто вынесли что бы не обьявлять каждый ентерфрейм
var mc_x:Number; // добавили новых var mc_x:Number = (Math.cos(rad)*xdist)/2;
var mc_y:Number; // добавили новых
mc.onEnterFrame = function()
{
angle += 5;
rad = angle * radStep;
mc._x = 60 + (Math.cos(rad)*xdist)/2; // mc._x = 60 + mc_x; может можно и так, не тестил
mc._y = 60 + (Math.sin(rad)*ydist)/2;
mc_x = (Math.cos(rad)*xdist)/2; // определяем значения наших доп. переменных, по сути тоже самое что и mc._x только без 60
mc_y = (Math.sin(rad)*ydist)/2; // определяем значения наших доп. переменных
};
код на работоспособность не проверял, просто идея, так же немного непонял чем не подходит дальнейшее использование вариант (mc._x - 60) - вместо mc._x
Acrossfy
18.03.2009, 21:52
Извиняюсь за долгое отсутствие на форуме.
Код проверил. Работать то работает, а проблема осталась.
Объясню поподробнее. У меня есть кнопка(mc). Именно она крутится вокруг своей оси. За кнопкой есть отдельный мувиклип(bg) в два раз больше кнопки. При наведении на него кнопка устремляется за курсором мыши. Когда кнопка его достигает, срабатывает delete mc.onEnterFrame; и пока мышь на ней, она уже не крутится. Дальше если курсор резко отвести в сторону от кнопки, она возвращается на привычное место (60;60) и снова начинает там крутиться.
Проблема - когда стал использовать координаты в коде:
mc._x = 60 + (Math.cos(rad)*xdist)/2;
mc._y = 60 + (Math.sin(rad)*ydist)/2;
кнопка перестала двигаться к курсору при наведении на bg сзади нее, потому что bg.onrollover также использует для движения кнопки mc._x и mc._y
Более очевидно думаю все будет в исходнике. Линиями я выделил область bg.
Очень надеюсь на вашу помощь в данной ситуации.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.