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

LanSelven 12.09.2009 19:21

Обращения к элементам второго фрейма
 
Такая проблема, если кнопка находиться на первом фрейме внутри мувика то ее легко использовать:
Код AS1/AS2:

 Mc.btn.onRelease = function() {
}

Но если кнопка находиться на остальных фреймах, скажим на втором, то просто так к ней обратиться не получаеться, подозреваю что нужно использовать в имени путь к кадру или как-нибудь так О_о
Подскажите пожалйста.

mooncar 12.09.2009 19:46

По существу: нет, не так, к кадру обратиться нельзя, ролик туда может только перейти - сам в процессе воспроизведения или через gotoAndStop или gotoAndPlay.
Вам следует следить за тем, чтобы размещать кнопки и мувики там, где для них написан код. Нет ничего проще - сделайте слой, общий для всего ролика и разместите там элементы навигации.
При этом если в какой-то момент кнопка на сцене не нужна, задавайте ей _visible=false, а в нужных кадрах - проявляйте.
Что вам мешает написать код во втором фрейме, кстати?

Не очень понятна ситуация, зачем вам обращаться к кнопке, которой еще нет на сцене? :)
Или вам нужно просто выполнить действие, которое завязано на кнопке, то есть нажать ее программно?

LanSelven 12.09.2009 20:51

Вложений: 1
Вы меня немного не поняли, мувик уже есть, а кнопка скрыта с мувике, когда она появляется, нужно использовать условие, нажав на кнопку.
Вот пример:
Мувиклип, первый кадр пустой, а на втором кнопка, понятное дело что сначала надо перейти к фрейму с кнопкой, ну это не трудно сделать с помощью Mc.goto, однако кнопка всеровно не реагирует. Этой кнопке надо дать задание, причем код к кнопке должен быть на главной рабочей школе.
Вот скажем, мы переключили мувиклив на 2 фрейм и кнопка появлюсь на сцене, нужно сделать так, чтобы при нажатии выполнялось какое-нибудь действие, ну например trace("text");
Код AS1/AS2:

 Mc.btn.onRelease = function() {
    trace("text");
}

на первый взгляд простое дело но вся проблема во Мувиклипе, а точнее в том что находясь на второстепенных фреймах мувиклипа кнопка не запускается и не понимаю почему, так как в главной рабочей шкале такой проблемы не возникает.
А вообще задумка была в том, чтобы кнопка появлялась по какому-нибудь событию, на нее можно было нажать и она опять исчезла. И _visible я ей тоже не могу задать, так как не могу обратиться к ней впринцепи....
Ну, вот для наглядности flash документик.

mooncar 12.09.2009 20:56

Пересохраните для CS3, помните, что CS4 установлен не у всех.
Чувствую я, у вас всё там совсем с ног на голову...

LanSelven 12.09.2009 21:32

Вложений: 1
Вот та же флешка во Flash 8

mooncar 12.09.2009 21:42

А вам принципиально важно, чтобы внутри кнопки было два кадра и при начале проигрывания происходил моментальный переход на 2-ой кадр кнопки?

Добавлено через 7 минут
Она же у вас все равно видимой сразу делается, для чего нужен второй кадр?

LanSelven 12.09.2009 21:55

Ну вы даете... Я же вам четко объяснил что мне нужно. Во флешке просто наглядный пример.
Мне нужно просто чтобы кнопка появилась в связи с каким-нибудь действием, а потом могла снова исчезнуть(Это можно сделать перемещая кнопку, но это плохой тон)
Так вы знаете как обратиться к элементу второстепенного фрейма? Или как можно проделать появление и исчезновение кнопки.

mooncar 12.09.2009 22:03

Нужно, чтобы на момент назначения на события кнопки функций, кнопка как-то реально присутствовала на сцене, а у вас внутри Mc2 - первый кадр пустой.
Вариант 1. Ставим в первый кадр любой мувик с альфа = 0;
Вариант 2. Убираем второй кадр и оставляем один кадр, все равн кнопка сразу же делается видимой.

Вариант 3. Пишем функцию для выполнения в корне:

Код AS1/AS2:

function Mc2Release() {
 blink.gotoAndPlay(2) //просто наглядное действие
}

Внутри Mc2 - во втором кадре, где появляется сама кнопка, пишем ссылку на объявленную в _root функцию:
Код AS1/AS2:

btn.onRelease = _root.Mc2Release;

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

Добавлено через 15 минут
А "даю" я .. просто не организовывают так как у вас. Много ненужный проблем исчезает при правильном построении ролика..
Я же говорил: сделайте слой, общий для всего ролика и разместите там элементы навигации. И управляйте ими как хотите - через _visible и _alpha сообразно вашим событиям.
Я делаю так. Например, чтобы кнопка сперва не была видна сразу, в среде разработки, в свойствах, я ставлю ей alpha на 0%, в коде пишу _visible = false или enabled = false;
Затем в нужный момент программно включаю
Код AS1/AS2:

btn._alpha = 100;
btn._visible = true ;

Вот вам живой пример из проекта:

Код AS1/AS2:

// ф-я управления кнопками сохранить, отменить;
function manageCancelBut (dir) {       
        switch (dir) {
        case 'on':
        cancel_btn.enabled = true;       
        cancel_btn._alpha = 100;       
        break ;
        case 'off':
        cancel_btn.enabled = false  ;
        cancel_btn._alpha = 0;       
        break ;               
        }
};
function manageSaveBut (dir) {       
        switch (dir) {
        case 'on':
        saveData_btn.enabled = true ;       
        saveData_btn._alpha = 100;       
        break ;
        case 'off':
        saveData_btn.enabled = false ;
        saveData_btn._alpha = 0;       
        break ;               
        }
};

В начале кода у меня на _root у меня выключается все:
Код AS1/AS2:

manageSaveBut('off');
manageCancelBut('off');

При этом альфа в авторской среде выставлена на 0%, чтобы не было первоначального мигания, при выключении, а кнопки были невидимы сразу.
А потом, когда нужно, я их проявляю:
Код AS1/AS2:

_root.manageCancelBut('on');

То есть вызываю из абсолютно любого места ролика.
Естественно все onRelease и прочее прописаны на _root сразуи прекарсно работают.

LanSelven 12.09.2009 22:20

Ну, 3 способ равно силен тому, что я задам действие прямо кнопке
Код AS1/AS2:

on(release) {}

Не удобный способ...Мне нужно будет сделать таких кнопок окола 50 штук, и я хотел весь код уместить лишь на главной рабочей школе.
Не понял как делать "Вариант 1"
Вариант 2 не подходит. Я же вам говорил, то что кнопка сразу же делаеться видемой это ВАМ для наглядного примера "т.е нажал на первую - работает, на вторую - нет" в реалльной обстановке она появлится лиш когда например coose будет true, или когда на какой-нибудь кнопке сработает действиет
Код AS1/AS2:

Mc.gotoAndStop(2)


mooncar 12.09.2009 22:22

См. пример выше. пользуйтесь подготовленными функциями, это даст вам гибкость.

LanSelven 12.09.2009 22:23

Но я понял в чем проблема, спасибо большое за объяснение и за потраченное время, буду выкручиваться =)

mooncar 12.09.2009 22:26

1 Враиант - самый простой. Рисуете квадратик, делаете его мувиком, кладете в ваш первый 1 кадр, чтобы он не был пустым и в инспекторе свойств ставите ему alpha = 0%

LanSelven 12.09.2009 22:27

О, сначало не заметил добавленного примера, большое спасибо

Добавлено через 1 минуту
Насколько я понимаю, если использовать альфа, кнопка не будет видна но будет осязаема, т.е будет появляться курсор нажатия и она будет перекрывать собой все что находиться под ней. Ну, мне так делать нельзя.

Добавлено через 5 минут
К тому же, если использовать метод с альфа, будет очень много переменных, так как мне нужно сделать таких 50 кнопок. Просто очень долго все это копировать и изменять...уф..
Ну я пожалуй буду использовать функицю.

mooncar 12.09.2009 22:36

Вы обратили внимание на альфу, но выпустили из внимания, что если сделать _visible или enabled - false, то ини не будут реагировать.

Можно использовать одну и ту же функцию, задав ссылку на их событие onRelease в цикле, если соответствующие действия тоже можно как-то отследить с помощью цифр.

LanSelven 12.09.2009 22:42

Просто, Я хотел избежать задания кода в мувике так как, приодеться дублировать мувик 50 раз ради изменения 1 цифры.
Когда вы объяснили мне что все деле в том, что условие нажатия кнопки появляется до появления самой кнопки. я сделал проверку условия нахождения цикла на 2 фрейме, и все начало работать =)
большое спасибо!)

mooncar 12.09.2009 22:44

Вот я о чем:
Код AS1/AS2:

//функция проявления / скрытия кнопок
function manageBut (btn:Button, dir:String) {       
        switch (dir) {
        case 'on':
        btn.enabled = true ;       
        btn._alpha = 100;       
        break ;
        case 'off':
        btn.enabled = false  ;
        btn._alpha = 0;       
        break ;               
        }
};
 
//базовая ф-я действия с кнопки (для примера используется переход на кадр numb, заданный в цикле с пом. переменной i )
function doIt () {       
  gotoAndStop(this.numb);
};
 
 
for (i = 1; i < 51; i++) {
 Mc['btn'  + i].numb = i;
 Mc['btn'  + i].onRelease = doIt;
}

Включаем любую кнопку, когда надо:
Код AS1/AS2:

manageBut( Mc.btn39, 'on');

Добавлено через 42 секунды
Ну значит все хорошо :)
Все оптимизировано, можно расходиться праздновать...

LanSelven 12.09.2009 22:48

Ваш метод точень хорош! Пожалуй воспользуюсь им)))

mooncar 12.09.2009 22:51

Угу.. сенкс! :)
Заготовки копятся...

LanSelven 12.09.2009 23:00

"Заготовки копятся..." =D


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

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