Форум 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)
-   -   Зацикленное элипсообразное решение. (http://www.flasher.ru/forum/showthread.php?t=122410)

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

Вложений: 1
На основе примера Монстра сделал нужное движение.
Код AS1/AS2:

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).
Решается это вот так:
Код AS1/AS2:

        mc._x=60 + (Math.cos(rad)*xdist)/2;
        mc._y=60 + (Math.sin(rad)*ydist)/2;

Однако это жутко портит всю малину, ведь с координатами "mc" работают и другие функции перемещающие объект по сцене.
И тогда, предварительно передвинув муви клип на точку (60, 60), я решаю проблему так:
Код AS1/AS2:

        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. Мувик обязательно должен быть на главной сцене. Конечно, если бы его можно было просто вложить в другой мувик, и тот уже двигать куда надо, проблем не было бы. Однако код моей флешки не позволяет делать этот клип вложенным.

VVall 12.03.2009 23:23

Вы подумайте, что вы сделали, заменив 60 на переменную, которую в этой-же строке изменяете, и поймёте, что не так.

Acrossfy 12.03.2009 23:56

Ну да.. Глупо было спрашивать почему при этом работает не так, как надо. Но как еще в данном случае заставить клип двигаться вокруг своего положения в сцене, не указывая координат?

VVall 13.03.2009 00:02

Эти цифры и есть положение клипа в сцене, т.е. центр эллипса. Вам нужно завести вместо них две новые переменные, и для движения клипа изменять их, а не mc._x,mc._y.

Acrossfy 13.03.2009 01:08

Ну допустим:
Код AS1/AS2:

//добавляем
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" поменять никак нельзя. Координаты записываются иным способом.
Код AS1/AS2:

TweenLite.to(prod, 0.75, {_x:60, _y:60, ease:Back.easeIn, onComplete:onFinishTween});


VVall 13.03.2009 01:31

Вам надо всё-таки немного думать, что вы делаете и что в результате этого происходит. Если вы будете постоянно присваивать a и b значения _x и _y, какой тогда смысл в добавлении этих переменных?

Вторую проблему можно решить разными способами. Можно сделать невидимый объект, к которому вы будете применять трансформации, а потом перемещать на новое место видимый; можно сделать новый класс на основе нужного, и т.д.

Acrossfy 13.03.2009 02:44

Цитата:

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

VVall 13.03.2009 02:48

Нечего тут демонстрировать, это элементарнейшая вещь.

Переменные инициализируются один раз - задаётся начальное положение объекта. Дальше вы меняете их, когда вам требуется переместить объект. Всё.

nOobCrafter 13.03.2009 11:22

Код AS1/AS2:

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

Вложений: 1
Извиняюсь за долгое отсутствие на форуме.
Код проверил. Работать то работает, а проблема осталась.
Объясню поподробнее. У меня есть кнопка(mc). Именно она крутится вокруг своей оси. За кнопкой есть отдельный мувиклип(bg) в два раз больше кнопки. При наведении на него кнопка устремляется за курсором мыши. Когда кнопка его достигает, срабатывает delete mc.onEnterFrame; и пока мышь на ней, она уже не крутится. Дальше если курсор резко отвести в сторону от кнопки, она возвращается на привычное место (60;60) и снова начинает там крутиться.
Проблема - когда стал использовать координаты в коде:
Код AS1/AS2:

        mc._x = 60 + (Math.cos(rad)*xdist)/2;
        mc._y = 60 + (Math.sin(rad)*ydist)/2;

кнопка перестала двигаться к курсору при наведении на bg сзади нее, потому что bg.onrollover также использует для движения кнопки mc._x и mc._y

Более очевидно думаю все будет в исходнике. Линиями я выделил область bg.
Очень надеюсь на вашу помощь в данной ситуации.


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

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