Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Анимация движения по наведению курсора
Flash Zone Forum > Macromedia Flash > Общие вопросы
Nekonosan
Ситуация такова. AS2.
Есть текстовое поле типа TextField. И есть две стрелочки, тип MovieClip, "верх" и "низ" соответственно.
Наводим на стрелочки (но не нажимаем), текстовое поле скролируется вверха или вниз, пока не достигнет края. Если отвести курсор от стрелочек, скроллинг останавливается.


Пока что у меня получилось при наведении в курсора на область текстовое поле скролируется только на один шаг. Дальше надо дёрнуть чуть мышкой, чтобы оно проползло ещё на шаг.

CODE

_root.onMouseMove = function(){

if(_xmouse>868&_xmouse<888&_ymouse>625&_ymouse<635) {
do{
r_top_ar._visible = true;
r_top_ar._alpha = 100;
txtholder.scroll+=1;
if (txtholder.scroll>=txtholder.maxscroll) {
r_bot_ar._visible = false;
}
}while(txtholder.scroll>txtholder.maxscroll)
}


if(_xmouse>868&_xmouse<888&_ymouse>270&_ymouse<280) {
do{

r_bot_ar._visible = true;
r_bot_ar._alpha = 100;
txtholder.scroll--;
if (txtholder.scroll<=1) {
r_top_ar._visible = false;
}
}while(txtholder.scroll<1)
}

}


Почему не применяю функции onRollOver и OnRollOut - стрелочки маленькие, ещё у них фон прозрачный.


Аналогичная ситуация, если вместо текстового поля есть MovieClip с маской, где вместо скроллинга играемся параметром ._y
Там вообще любые циклы приводят к зависанию, приходится довольствоваться if.





Вопрос вот в чём. Как подобное реализовать? Какова логика, что лучше применять вместо циклов?
HaWK
Вам нужно при наведении на кнопку создавать интервал и в функции-обработчике смещать куда надо. А при отведении удалять интервал.
MustLive
Цитата
Анимация движения по наведению курсора

Nekonosan

Для этого тебе нужно использовать, во-первых, onRollOver и onRollOut, а во-вторых, задать циклическую проверку условия. О том как правильно сделать проверку условия тебе уже сказал HaWK.

Цитата
Почему не применяю функции onRollOver и OnRollOut - стрелочки маленькие, ещё у них фон прозрачный.

Размер стрелочек и прозрачность фона не имеет значения. Сделай данные объекты кнопками (button) и в них есть область Hit (четвёртый кадр). Вот в ней и задашь область взаимодействия курсора с кнопками.

Цитата
Как подобное реализовать? Какова логика, что лучше применять вместо циклов?

Как я уже сказал, тебе нужно организовать циклическую проверку условия. А для этого есть несколько методов, о чём мы многократно писали на форуме. Но в твоём случае нужно правильно сделать алгоритм - с использованием onRollOver и onRollOut - тогда ты вполне сможешь обойтись без подобного. Лишь используешь интервалы для выполнения движения: для события onRollOver укажи setInterval, а для события onRollOut укажи clearInterval. Примеры кодов для работы с интервалами у нас также не раз приводились на форуме.
Nekonosan
"Семен Семеныч"! Ну как же я мог забыть об интервалах. А ведь когда-то, ища функцию для однократной задержки, они мне не подошли и я благополучно забыл.

Как получится, опишу алгоритм smile.gif
HaWK
Цитата
"Семен Семеныч"! Ну как же я мог забыть об интервалах

Это типо мне "спасибо" такое smile.gif
MustLive
Nekonosan

Всегда пожалуйста.

Мы с HaWK были рады тебе помочь smile.gif.

Цитата
Это типо мне "спасибо" такое

Бывают такие люди - эпизодически с такими сталкиваюсь - которым трудно сказать "спасибо". Поэтому в своих ответах они "уходят в сторону", лишь бы не поблагодарить людей которые им помогли (думая, что это "само собой разумеющееся"). Будем надеяться, что Nekonosan учтёт это на следующий раз wink.gif.
HaWK
А знаешь какая ситуация на Флешере.ру, Женя?
Там наоборот говоришь спасибо, а они не говорят пожалуйста, потому что считают это выше своей гордости )
Nekonosan
Итак, спасибо огромное всем, кто помог. Рецепт сего дела такой:
Исходные данные.
1. Итак, имеем две стрелочки по имени arrow_top и arrow_bot: одна должна двигать объект вверх, вторая - вниз. Обе типа movieClip.
2. На стрелочки нажимать нельзя, все действия выполняются по наведению.
3. Двигаемый movieClip по имени newsMVC является контейнером для повторяющихся объектов, новостей с картинками. Они загружаются динамически из xml файла. С другой стороны, newsMVC прячется под маску, которая отображает только три новости.

Как верно подсказали товарищи MustLive и HaWK, для движения лучше всего использовать свойства стрелок onRollOver и onRollOut. Так же, как верно решение с интервалами. Итак.
1. Создаём функцию, которая бы двигала клип newsMVC вверх на один шаг, пока не будет достигнут предел

CODE

function arft():Void{

if(newsMVC._y<=270)
{
arrow_bot._visible = true;
var moving = new mx.transitions.Tween(newsMVC,"_y", None.easeOut, newsMVC._y,newsMVC._y+132,5);
if(newsMVC._y==138) {
arrow_top._visible = false;
}}


}


2. Если навести мышкой на стрелочку, то стартует повторение выполнения функции arft() до тех пор, пока интервал не будет остановлен:

CODE

arrow_top.onRollOver = function(){
artIn = setInterval(arft,500);
};


3. Если мышку убрать со стрелочки:

CODE
arrow_top.onRollOut = function(){
clearInterval(artIn );
};


P.S. Самое сложное в этом деле - правильно рассчитать пределы, при которых стрелочки должны пропадать, а поле останавливаться. Методика скорее эмпирическая, шаманская и зависит от совпадения начала координат муви-клипа и его маски, шага, количества последних отображаемых элементов, высоты одного элемента, общей высоты блока.
Nekonosan
P.P.S. Приходить сюда и благодарить с пустыми руками, без рецепта и кода не хотелось, вот только сейчас дошли руки до описания. Ещё раз спасибо smile.gif
HaWK
Да, Nekonosan, молодец, что описал алгоритм. Судя по всему на AS2.
Цитата
Код
var moving = new mx.transitions.Tween(newsMVC,"_y", None.easeOut, newsMVC._y,newsMVC._y+132,5);

За место этой строчки можно было просто смещать объект по оси _y напрямую:
Код
newsMVC._y += 132,5;
Русская версия IP.Board © 2001-2014 IPS, Inc.