PDA

Просмотр полной версии : Создание динамической команды перехода


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 переменная с именем клипа.

Dindin
28.05.2004, 21:13
_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 работать будет

Dindin
29.05.2004, 12:58
Нужно, я думаю, отметить, что метод глобального класса Object eval() возвращает всегда не сам объект, а только ссылку на него. Поэтому выражение типа "_root.eval("a")" изначально бессмысленно, так как если у нас в руте существует объект _root.a и процедура eval() вызывается из рута, то eval('a') вернёт ссылку на объект _root.a.
И совершенно бессмысленно писать перед eval() преффикс _root
зы. Вышесказанное верно в любых ситуациях

Dindin
29.05.2004, 13:00
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'

то есть какое-либо тело функции вообще отсутствует.

Dindin
29.05.2004, 14:08
Интересно :) В 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
ага, ага, и я о том. самое адекватное название - макрос ассемблера. (хотя какой же это макрос, если он заменяет одну команду на одну команду :)) )

Dindin
29.05.2004, 15:26
Кстати, о макросах и фласме. Вчера попытался оптимизировать фласмом проект, состоящий почти из одного кода. В итоге из 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); ...работает

Dindin
01.06.2004, 09:44
на случай вложенности будет работать:
__root.nn[mm] или, на худой конец, _root[nn][mm]
Забудьте про eval()

CrazY WorM
01.06.2004, 16:58
Я забуду про eval(), если объясните как здесь обойтись без него!!!

Dindin
01.06.2004, 18:25
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; };
}
}

Dindin
01.06.2004, 18:26
ЗЫ - просто вставь оба эти варианта вместо своего кода и проверь, как это работает :):)
ЗЗЫ Забудь про eval()
:):)

CrazY WorM
02.06.2004, 01:29
>>Dindin
Да... ну ты меня убедил... спасибо!!
Только всё равно непонятно чем так плох этот eval()... да в принципе не важно.

CrazY WorM
02.06.2004, 02:08
>>Dindin
Твой код почему то в флеш плеере не работает, хотя если запихать в HTML или сделать *.exe всё работает, а с eval() везде работает!!!

Dindin
02.06.2004, 02:43
Извини, чужие кривые руки неизлечимы:) Всё работает :):)

CrazY WorM
03.06.2004, 00:33
Я тебя конечно извиняю, но вот у кого кривые руки это вопрос???

я про твой первый вариант!!!>>>

Dindin
03.06.2004, 11:38
Подчёркиваю ещё раз: ЧУЖИЕ кривые руки.
Всё работает

CrazY WorM
03.06.2004, 14:08
Да-а-а-а-а :confused:
Пора замять эту тему!!!