Форум 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=102803)

Валиант 23.10.2007 10:30

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

основной мувик (где расположены основные пункты меню)
--подменю (мувик, который должен плавно появляться при наведении на определённый пункт меню)
----под-подменю (естественно меню, которое появляется при наведении на пукт меню в подменю)

уф... запутался почти... как это проще организовать? у меня много пунктов получится, можно конечно попробовать все выложить на основной мувик, но это там все запутано будет, я думал и про loadMovie, но при этом переменные в подгружаемом мувике не учитываются в основном...
Думал, что если просто организовать модуль, работоспособный, можно просто использовать XML, кароче трудности у меня с этим контекстным под-под-меню...

CorC 23.10.2007 10:49

Ответ: поискать такие меню с под-под-меню, они уже написаны, я точно помню, что щупал их исходники...

_ViPeR_ 23.10.2007 11:19

Component "Menu"
Нажмите Ctrl+F7 и там будет куча компонентов, которые сделаны разработчиками за Вас

_ViPeR_ 23.10.2007 11:21

Либо анимировать клипы MotionTween'ом, тормозить stop()'ом их в ключевых кадрах на старте и на полном выпадении, а при наведении на к.л. пункт по событию on(rollOver) стартовать проигрывание этих клипов, совсем по деревенски и можно запутаться, но зато можно очень красиво сделать менюшки

Валиант 23.10.2007 12:54

_ViPeR_, если чесно даже не знаю как и через что обращаться к компонентам, к тому же мне нужно анимированное меню, такое как Flash Menu Labs, но что нить попроще, отдельный рабочий пункт меню я вставляю как мувик, но так у меня не получается обрабатывать большинство событий

Валиант 23.10.2007 13:11

еще тогда по теме, я просто это одним словом сформулировать для поиска не могу, можно как то программно создать мувик... ммм... задать ему как он должен проигрываться, допустим чтобы он появлялся и исчезал, или например выдвигался по оси Х или игрек? то есть как обычный мувик с элементами какого-то действия, только программно?

Molecula 23.10.2007 13:28

класс Tween для этого можно использовать (для линейных изменений параметров мувика), поищи в хелпе или на форуме - поиск точно выдаст + в ФАК-е есть.
//---------------------------------
А по меню, Вам наверное, вот это пригодится - http://flashmenulabs.com/ru/opensource.htm, скачайте исходник, разбирайтесь и переделывайте под себя, как хотите.

Валиант 23.10.2007 14:56

О спасибо, все гораздо проще, немогли бы еще подсказать как обратить ту или иную функцию... то есть есть эффект где появляется мувик, плавно, как же сделать что б он также и исчез, использую tween класс

Kikasso 23.10.2007 15:03

Tween.continueTo() метод.

Валиант 23.10.2007 15:18

Цитата:

Сообщение от Kikasso
Tween.continueTo() метод.

Спасибо, но мне нада что бы он назад "нырял" по определенному запросу
Код:

menu1.onRollOver = function() {
        var myTween:Tween = new Tween(my_mc, "_y", mx.transitions.easing.Elastic.easeOut, 0, 50, 3, true);
       
};
menu1.onRollOut = function() {
                myTween.continueTo(0,5);
};

так не работает!

Kikasso 23.10.2007 15:26

Код:

var myTween:Tween = new Tween(my_mc, "_y", mx.transitions.easing.Elastic.easeOut, my_mc._y, my_mc._y, 1, true);
myTween.stop();
menu1.onRollOver = function() {
    myTween.continueTo(50,3);
};
menu1.onRollOut = function() {
    myTween.continueTo(0,5);
};

а так?

То что у вас не работает - понятно, вы же myTween объявили локально внутри функции.

Валиант 23.10.2007 15:48

О, так получилось, хм... но как я понял я задаю переменную myTween, и присваиваю ей значение Твина с проперти _Y, а если мне надо еще и _х мне нужно создать новую переменную? илиже есть какой то другой способ?

Kikasso 23.10.2007 15:55

Второе свойство - второй твин. В этом случае секунды лучше не использовать, чтобы не дергалось.

Валиант 23.10.2007 16:04

Цитата:

Сообщение от Kikasso
Второе свойство - второй твин. В этом случае секунды лучше не использовать, чтобы не дергалось.

понятно, сейчас более-менее появляется что-то похожее на выпадающее меню у меня... хоть я конечно и не программер
Код:

import mx.transitions.*;
import mx.transitions.easing.*;

var myTween_y:Tween = new Tween(my_mc, "_y", mx.transitions.easing.Elastic.easeOut, my_mc._y, my_mc._y, 1, true);
var myTween_a:Tween = new Tween(my_mc, "_alpha", None.easeOut, my_mc._y, my_mc._y, 1, true);

my_mc.onRollOver= function() {
myTween_y.stop();
myTween_a.stop();
        }
my_mc.onRollOut        = function() {
    myTween_y.continueTo(0,1);
    myTween_a.continueTo(0,.5);       
       
}
menu1.onRollOver = function() {
        myTween_y.continueTo(22,1);
          myTween_a.continueTo(100,.7);
};
menu1.onRollOut = function() {
    myTween_y.continueTo(0,1);
    myTween_a.continueTo(0,.5);       
};

вот примерно так получается, что появляется подменю, и когда наводишь на это подменю, твин останавливается, а иначе меню просто исчезнет и юзер просто не успеет на него нажать... но он может навести на подменю гораздо раньше и получится что твин застопится на половине пути, наверно есть какое-то решение, что-то типо не останавливать, пока не закончится твин, но даже если так надо же как то обрабатывать событие onRollOver и onRollOut..?:umnik2:

Kikasso 23.10.2007 16:16

У твина есть событие onMotionFinished - по этому событию можно переназначить onRollOver и onRollOut (их же можно удалить в нужный момент)

Валиант 23.10.2007 16:43

как я понял onMotionFinished эта функция актуальна только тогда, когда твин подошёл к концу, не могу понять как это может оборвать полу секундное перемещение с одного объекта на другой, если твин у меня идёт примерно секунды 3%

Fernando Costa 23.10.2007 16:59

событие onMotionFinished вызывается когда твин закончил свое движение(какая разница коакое время это заняло)
событие onMotionStopped вызывается когда твин закончил свое движение или был остановлен

Валиант 23.10.2007 17:12

Цитата:

Сообщение от Fernando Costa
событие onMotionFinished вызывается когда твин закончил свое движение(какая разница коакое время это заняло)
событие onMotionStopped вызывается когда твин закончил свое движение или был остановлен

блин, тогда покажите мне кодом плиз, как можно прервать onRollOut или Over при помощи этой функции

Код:

menu.onRollOut=function(){
trace("2");
}
myTween_y.onMotionFinished  =function(){
                trace("1");
        }

в итоге цифра 2 у меня трэйсница два раза, и только потом трэйсница 1? Или я не понимаю о чем вы говорите, помните, я не программер, вы мне говорите, я пробую, у меня onMotionFinished начинается только тогда, когда например менюшка полностью появилась!

Fernando Costa 23.10.2007 17:15

<< у меня onMotionFinished начинается только тогда, когда например менюшка полностью появилась!

Так и должно быть. есть событие у класса Tween stop(); оно останавливает движение. Смотрите в хелпе

Kikasso 24.10.2007 01:58

Цитата:

Сообщение от Валиант
как я понял onMotionFinished эта функция актуальна только тогда, когда твин подошёл к концу, не могу понять как это может оборвать полу секундное перемещение с одного объекта на другой

Я имел в виду что можно по клику удалять onRelease и что там еще, и кнопки перестанут нажиматься.
А когда анимация доиграет до конца - снова назначить.

Валиант 24.10.2007 08:54

Цитата:

Сообщение от Fernando Costa
<< у меня onMotionFinished начинается только тогда, когда например менюшка полностью появилась!

Так и должно быть. есть событие у класса Tween stop(); оно останавливает движение. Смотрите в хелпе

Нее... твин стоп не катит, объясню на пальцах, по другому видимо я не могу... Когда навожу на меню, у меня играе твин1 (появляется под меню), когда отвожу, снова играет твин2 (Tocontinue то есть, подменюшка исчезает). Если навести на меню, а потом на под меню, то играет твин2 (подменю исчезает), мне нужно, что когда наводишь на подменю, продолжал проигрыватся твин1, что бы функция определила, что твин2 проигрывать не надо. Когда убераешь курсор с подменю, снова проигрывается твин2...
вот!

Kikasso 24.10.2007 12:45

Поставьте маленький таймаут на onRollOut. При наведении на подменю, таймаут очищайте.
Покажите, что у вас получилось, может я неправильно понял.

Валиант 24.10.2007 12:53

Вам знаком класс lmc_tween.as?
Вот с его помощью у меня с горе пополам что-то получилось!
Если знакомы подскажите что лучше, обычный класс Tween или этот, или это все одно и тоже, только разными словами?

Валиант 24.10.2007 16:37

Еще хотел спросить, я дублирую клипы
Код:

submenu_inst.duplicateMovieClip("sub2menu"+i,depth);
допустим у меня их 20, я хочу сделать всего лишь одну функцию

Код:

Eval("sub2menu"+i).onRollOver = function(){}
как мне вот определить какой именно элемент активирует функцию
Код:

onRollOver
:umnik2:

Molecula 24.10.2007 16:49

Код:

dupl = submenu_inst.duplicateMovieClip("sub2menu"+i,i);
dupl._n=i
dupl.onRollOver=over;
function over(){
trace(this._n)
}


Валиант 24.10.2007 17:03

Ничего себе, даже теоретически ничего не произойдет помоему, что такое dupl? переменная что ли?
Почему это невозможно, потому что на форме у меня нет ничего с именемм dubl, как программа будет определять onRollOver?

Molecula 24.10.2007 17:09

dupl - просто переменная, а dupl._n - это будет ссылка на его так сказать номер. При ролОвере будет в трейсе высвечиваться, т.е. будем знать над каким элементом сроллОверили.

Kikasso 24.10.2007 18:19

duplicateMovieClip возвращает ссылку на созданный клип. Строго говоря,
Код:

var dupl:MovieClip = submenu_inst.duplicateMovieClip("sub2menu"+i,i);

Валиант 25.10.2007 08:37

Спасибо большое, сейчас я столкнулся с глубиной, %: У меня много пунктов меню и для каждого я задаю следующую глубину, и того у меня получается depth глубиной 40 ))) мне сказали что эт как то можно реализовать в контейнера) и еще что лучше использовать, attach или Duplicate

Вот насчет контейнера я делаю так
Код:

var container:MovieClip = this.createEmptyMovieClip("cont_"+texts, this.getNextHighestDepth());
for(i=0;i<cnt;i++){
      this["cont_"+texts].attachMovie("mc_menu","menu_",["cont_"+texts].getNextHighestDepth());
}

у меня добавляется мувик с определенной глубиной, когда цикл проходит второй раз, мувик словно взаимозаменяется, да и как я понял я создаю мувик с именем menu_",["cont_"+texts], почему то я не могу обратится к нему, где ошибка плиз?

Kikasso 25.10.2007 13:08

Код:

var container:MovieClip = this.createEmptyMovieClip("cont_"+texts, this.getNextHighestDepth());
for(i=0;i<cnt;i++){
 container.attachMovie("mc_menu","menu_" + i, container.getNextHighestDepth() );
}

Только зачем лишняя операция? Клип пустой, только что созданный, вполне можно обойтись i++
getNextHighestDepth() будет возвращать те же цифры, что и i

Валиант 25.10.2007 15:44

Вложений: 1
Вот файл че я тут намудрил, сильно не смейте, но у меня чет вообще ниче не получается, с этими дублями и аттачами...
стройской
create_menu(mainTextArray.length,mainTextArray,0);
создается сам текст меню... в чем проблема, там у меня путается или взаимозамещается глубина клипов, и еще я опять таки не могу к ним обратится посредством onRollOver...
тока не спрашивайте почему без XML, я его не знаю, учить тож некогда, надо щас с одним чем нить разобратся плиз!

Валиант 26.10.2007 16:38

Цитата:

Сообщение от Molecula
dupl - просто переменная, а dupl._n - это будет ссылка на его так сказать номер. При ролОвере будет в трейсе высвечиваться, т.е. будем знать над каким элементом сроллОверили.

спасибо разобрался но что делать с масивом...
я делаю так
этот код у меня в теле цикла for
Код:

                       
my_array[mnu_i]=but.attachMovie("linkageName", "menus"+i, but.getNextHighestDepth());
                        my_array[mnu_i]._width=m_width;
                        my_array[mnu_i]._height=m_height;
                        my_array[mnu_i]._y=20*i;
                        my_array[mnu_i]._x=sub_i;
                        trace(my_array[mnu_i]);
                        trace(mnu_i);
                        mnu_i++

затем я пытаюсь обрабатывать события onRollOver

Код:

function Getobj(){
        my_array.onRollOver = __onRollOver
        my_array.onRollOut = __onRollOut

        function __onRollOver():Void {
//        this._n.alphaTo(50,0.5);
trace(my_array[mnu_i]);
        }
       
                function __onRollOut():Void {
        this.alphaTo(100,0.5);
        }

}

вот тут я и запутался, если делать опять же через for
Код:

for (i=0;i<total;i++){
my_array[i].onRollOver = __onRollOver
my_array[i].onRollOut = __onRollOut
}

то все работает, но чутко тормазить событие onRollOver как быть?

Kikasso 26.10.2007 17:37

Цитата:

Сообщение от Валиант
затем я пытаюсь обрабатывать события onRollOver
Код:

function Getobj(){
    my_array.onRollOver = __onRollOver
    my_array.onRollOut = __onRollOut
...


Какой еще ролловерр у масива??

Валиант 26.10.2007 18:18

Цитата:

Сообщение от Kikasso
Какой еще ролловерр у масива??

вот смотри здесб я присваиваю массиву аттач
Код:

my_array[mnu_i]=but.attachMovie("linkageName", "menus"+i, but.getNextHighestDepth());
соответственно я легко смогу вызывать роловер у элементов массива... но это долго и тормозит если чесно, я вот посто и хотел спросить есть ли вариант, который описал Molecula, для массива элементов? Там ведь в примере один указывается, а мне надо на все мувики! воть, понятно объяснил? я просто плохо объясняю извините:rolleyes:

Wolsh 26.10.2007 20:17

Массивы по природе своей тормоза вызывают, много памяти жрут. По возможности лучше без них обходиться.
А в данном месте - есть большая разница между массивом и элементом массива.

Валиант 26.10.2007 20:26

это я уже наглядно понял на своем примере... что можно вместо них применить...?

Wolsh 26.10.2007 23:19

Да ничего не надо применять, у вас же клипы с индексами в именах создаются, вот в их свойства и пишите чего надо.
А файл Ваш ни я, ни множество других людей посмотреть не сможет - во-первых, версия флэша не у всех такая модная, во-вторых классик Вы поленились в архив приложить

Валиант 27.10.2007 06:55

Вы же сами сказали что это тормоза вызывает? не пойму...
Код:

for (i=0;i<total;i++){
my_array[i].onRollOver = __onRollOver
my_array[i].onRollOut = __onRollOut
}

вот так я это делаю, но повторяюсь что почему то происходит приличная задержка при появлении какого-то эффекта, например курсор на меню надо подержать секунды 2 что бы он вспыхнул.

Kikasso 27.10.2007 12:45

Массивы тут не при чем - дело в обработчиках на наведение, скорее всего где-то в недрах таинственных функций tween и alphaTo. Что именно, неизвестно, так как lmc_tween.as вы в архив не включили.

Wolsh 27.10.2007 19:10

Массивы память жрут, Kikasso, ты же знаешь. Я недавно один проект свой переписал , убрав массивы ссылок на аттачащиеся клипы, скорость в три раза возросла.
В общем я не знаю толком что там у Вас происходит (из-за неполного исходника), но данный кусок сделал бы так
Код:

for (i=0;i<total;i++){
    attached = but.attachMovie("linkageName", "menus"+i, but.getNextHighestDepth());
    attached._width = m_width;
    attached._height = m_height;
    attached._y = 20*i;
    attached._x = sub_i;
    attached.onRollOver = __onRollOver
    attached.onRollOut = __onRollOut
    trace(i+"  "+attached._name);
}



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

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