Просмотр полной версии : Создание динамической команды перехода
Alexksey
28.05.2004, 13:45
В фильме имеется 32 мувиклипа, каждый из которых может
принимать 5 графических видов (состояний). Пользователь
выбирает один из мувиклипов и устанавливает нужное
графическое состояния, путем ввода определенных
значений в окна ввода. (выбор клипа осущшествляется по
его имени в своем окне ввода).
Проблема следующая:
в кнопке выбора размещена команда вида:
_root.имя мувиклипа.gotoAndplay(a1);
где а1 - одно из 5 состояний мувиклипа.
не получается правильно передать в вышеприведенную
команду имя выбранного мувиклипа (одного из 32
экземпляров).
Пробовал _root.eval("a").GotoAndplay(a1); - Не работает.
Если подставляю, например, _root.e1.GotoAndPlay(a1);
установка одного из 5 состояний экземпляра мувиклипа
работает нормально.
КАК ОРГАНИЗОВАТЬ ДИНАМИЧЕСКИЙ ВЫБОР ИМЕНИ КЛИПА
ДЛЯ ВЫПОЛНЕНИЯ КОМАНДЫ ВИДА:
_root.имя мувиклипа.gotoAndplay(a1);
????????????????????????????????????????????????????
loadrunner
28.05.2004, 17:35
попробуйте создайть переменную с именем клипа и трейсить при нажатии и какую переменную (содержашую имя клипа) вы подставляете в обращении...Трейсом можно выловить такие баги.
eval бывает тупит и вот конструкция такго типа помогает _root[nn].gotoAndPlay(a1);
где nn переменная с именем клипа.
_root[nn] - где nn - строка-имя мувиклипа. Если nn - переменная, то она должна содержать строку. _root['mc'] эквивалентно _root.mc
CrazY WorM
28.05.2004, 21:48
>>Dindin
А если будет ещё вложенность например
_root[nn.mm] работать не будет
вот туто как раз eval катит
eval(nn.mm)
Nox Noctis
29.05.2004, 00:31
не стоит первым же сообщением на форуме писать глупость :)
_root[nn.mm] работать не будет и не должно.
а
_root[nn].mm работать будет
Нужно, я думаю, отметить, что метод глобального класса Object eval() возвращает всегда не сам объект, а только ссылку на него. Поэтому выражение типа "_root.eval("a")" изначально бессмысленно, так как если у нас в руте существует объект _root.a и процедура eval() вызывается из рута, то eval('a') вернёт ссылку на объект _root.a.
И совершенно бессмысленно писать перед eval() преффикс _root
зы. Вышесказанное верно в любых ситуациях
2CrazY WorM
_root[nn.mm] прокатит только в том случае, если у тебя есть объект nn в области видимости и поле этого объекта mm содержит строковое значение.
Nox Noctis
29.05.2004, 13:44
Оригинал написал(а) Dindin
Нужно, я думаю, отметить, что метод глобального класса Object eval()нужно, я думаю, отметить, что евал - это не метод :) и вообще не функция... а в лучшем случае макрос :)
если во время проигрывания ролика проверить является ли евал объектом - мы будем огорчены :) просто запустите trace(eval);
и, соответственно, это дело не вызывается ни относительно чего -
всё что делает строчка
eval('some_name');
это добавляет при компиляции в байткод одно действие:
push 'some_name'
то есть какое-либо тело функции вообще отсутствует.
Интересно :) В AS dictionary про eval() сказано следующее :Function; accesses variables, properties, objects, or movie clips by name. If expression is a variable or a property, the value of the variable or property is returned. If expression is an object or movie clip, a reference to the object or movie clip is returned. If the element named in expression cannot be found, undefined is returned
То есть они утверждают, что eval() это всё-таки функция. А функция просто обязана наследоваться от Object.
function asa() {
}
trace(getURL);
trace(getURL.__proto__);
trace(asa);
trace(asa.__proto__);
trace(eval.valueOf());
trace(eval.__proto__());
trace(eval);
Явственно показывает, что eval - не отчего не наследует и примитивного значения не имеет. Значит eval - всего лишь команда компилятора. Очень любопытно :)
Nox Noctis
29.05.2004, 14:50
ага, ага, и я о том. самое адекватное название - макрос ассемблера. (хотя какой же это макрос, если он заменяет одну команду на одну команду :)) )
Кстати, о макросах и фласме. Вчера попытался оптимизировать фласмом проект, состоящий почти из одного кода. В итоге из 32863 байт получил 33009 :) Вот такая, блин, оптимизация :)
CrazY WorM
31.05.2004, 22:13
Оригинал написал(а) Nox Noctis
не стоит первым же сообщением на форуме писать глупость :)
_root[nn.mm] работать не будет и не должно.
а
_root[nn].mm работать будет
И чё это я испортил, я лишь посоветовал, что если все эти 52 мувика множить в другом мувике (nn)...
Я сказал что _root[nn.mm].gotoAndplay(a1); работать не будет!!!
а вот eval(nn.mm).gotoAndplay(a1); ...работает
на случай вложенности будет работать:
__root.nn[mm] или, на худой конец, _root[nn][mm]
Забудьте про eval()
CrazY WorM
01.06.2004, 16:58
Я забуду про eval(), если объясните как здесь обойтись без него!!!
function visibleMC(obj) {
obj._visible = false;
}
but1.onPress = function() {
visibleMC(_root['1_mc']);
};
but2.onPress = function() {
visibleMC(_root['2_mc']['22_mc']);
};
but3.onPress = function() {
visibleMC(_root['3_mc']['33_mc']['333_mc']);
};
- Ответ
Но конкретно в твоём случае, проще так:for (obj in _root) {
if (obj.substr(0, 3) == 'but') {
_root[obj].num = obj.substr(3, 1);
_root[obj].onPress = function() {
_root[this.num+'_mc']._visible = !_root[this.num+'_mc']._visible; };
}
}
ЗЫ - просто вставь оба эти варианта вместо своего кода и проверь, как это работает :):)
ЗЗЫ Забудь про eval()
:):)
CrazY WorM
02.06.2004, 01:29
>>Dindin
Да... ну ты меня убедил... спасибо!!
Только всё равно непонятно чем так плох этот eval()... да в принципе не важно.
CrazY WorM
02.06.2004, 02:08
>>Dindin
Твой код почему то в флеш плеере не работает, хотя если запихать в HTML или сделать *.exe всё работает, а с eval() везде работает!!!
Извини, чужие кривые руки неизлечимы:) Всё работает :):)
CrazY WorM
03.06.2004, 00:33
Я тебя конечно извиняю, но вот у кого кривые руки это вопрос???
я про твой первый вариант!!!>>>
Подчёркиваю ещё раз: ЧУЖИЕ кривые руки.
Всё работает
CrazY WorM
03.06.2004, 14:08
Да-а-а-а-а :confused:
Пора замять эту тему!!!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.