Просмотр полной версии : Небольшой вопросик
step2006
08.10.2006, 02:32
Такая ситуация. В сцене есть переменная n которая равна 0. Так же в сцене есть movie clip по окончанию которого n=1. Как получить значение переменной из movie clipа (n=1) в саму сцену. Допустим чтоб кака нибудь z в сцене была равна значению n из mc.
Bar_Duck13
08.10.2006, 02:42
z = <имя клипа>.n
Воообще-то это основной синтаксис современных языков программирования.
z = mc.n
в данном случае z это ссылка на объект (клип, строка, текстовое поле)
Можно создавать ссылкм и на функции, и на методы, и на другие объекты (например мувиклипы).
Например в клипе house есть клип window
Можно записять прямую ссылку на window
z = house.window
и делать с мувиклипом по ссылке что угодно
z.x = 100
Можно и так делать
a = _root.house.window.play
и вызывать метод объекта
a()
можно ещё свои методы и функции писать и вызывать
step2006
08.10.2006, 02:55
Спасибо ребят. Че то я как то по сложному начал делать. сам запутался. А eval это что тогда???
Функция eval конвертирует сторку в путь к объекту (ряд ссылок)
str = 'mc.n';
z = eval(str)
По этому вопросу всё в доке написано, и поиском рекомендую заняться.
Bar_Duck13
08.10.2006, 03:00
Забудь этот архаизм. Eval сильно тормозит при работе.
Bar_Duck13
08.10.2006, 03:20
Можно и так делать
a = _root.house.window.play
и вызывать метод объекта
a()
Нифига неправда!!! Зачем народ сбивать с толку??? Сначала проверяй!
//остановим
_root.mc.stop();
//не работает!!!
a = _root.mc.play;
a()
//работает
_root.mc.play();
//или так
a = _root.mc;
a.play();
Нифига неправда!!! Зачем народ сбивать с толку??? Сначала проверяй!
//остановим
_root.mc.stop();
//не работает!!!
a = _root.mc.play;
a()
//работает
_root.mc.play();
//или так
a = _root.mc;
a.play();
Для тебя такой способ оращения к функциям, видимо, тоже стало открытием.
Всё прекрасно работает.
function f()
{
trace('call')
}
a = f;
a();
сначала ссылка на объект-функцию, а потом вызов объекта-функции по ссылке. Всё верно.
Bar_Duck13
08.10.2006, 13:59
Ты используешь разные вещи тут:
a = _root.house.window.play
//и вызывать метод объекта
a()
и тут:
function f()
{
trace('call')
}
a = f;
a();
Второй способ я постоянно использую. Это давно для меня не открытие. Запусти пример и убедись, что ты не прав.
2 Bar_Duck13:
this.createEmptyMovieClip ("mc2", 0);
mc2.createEmptyMovieClip ("mc3", 0);
mc2.mc3.b = function (arg) {
trace (arg);
};
c = _root.mc2.mc3.b;
c (3);
вы восьмёрку юзаете, а я девятку. )))))
В АС 3 всё работает, а в восьмерке почему-то не все методы MovieClip'а вызываются (stop, play). Зато самописанные вызываются всегда.
Видимо это реальный баг АС 2 .
В любом случае, ссылка может быть на любую функцию! Я просто не удачный ПРИМЕР привёл stop().
Bar_Duck13
08.10.2006, 16:48
2 iNils, 2 miramax: Вы не путайте функции созданные вами с ПРЕДУСТАНОВЛЕННЫМИ(наверно так называются), те которые цветом выделяются. - play, stop, и т.д. Miramax как раз про это пишет и версия тут ни при чём!!!
2 iNils, 2 miramax: Вы не путайте функции созданные вами с ПРЕДУСТАНОВЛЕННЫМИ(наверно так называются), те которые цветом выделяются. - play, stop, и т.д. Miramax как раз про это пишет и версия тут ни при чём!!!
:taunt: Ну да. А чем по-твоему таким особым отличается "предустановленная" функция от "не предустановленной" ? Я создам новый класс и перепешу метод play или в прототипе что-нибудь понаверчу, что тогда? Функция это, прежде всего, объект.
Почему же всё работает в АС 3 ? Вывод, в АС 2 где-то глюк. Функция она и в африке функция.
Вызов функции по ссылке это чуть ли не основа ООП.
Надо будет не полениться создать класс extends MovieClip и попробовать вызвать метод по ссылке...
2 iNils, 2 miramax: Вы не путайте функции созданные вами с ПРЕДУСТАНОВЛЕННЫМИ(наверно так называются), те которые цветом выделяются. - play, stop, и т.д. Miramax как раз про это пишет и версия тут ни при чём!!!
Я не припомню, что бы вопрос стоял о конкретных методах, поэтому говорить чего я не должен путать некорректно.
И я не думаю, что баг именно в АС2, потому как ставя ас1 при публикации это также не работает.
И кстати:
q = _root.mc.stop;
trace (typeof q);
trace (q == _root.mc.stop);
trace (q == _root.mc.play);
Bar_Duck13
08.10.2006, 17:06
С удовольствием посмотрю твой исходник. Только просьба: сделай для Flash 2004 MX. Я не изучал досконально прототипы, классы. НЕ ПОЛЕНИСЬ! Если получиться, то так и быть - я неправ. Но сейчас неправ(а) - ты. Я имею ввиду твоё первое изречение:(Да простит меня iNils)
"a = _root.house.window.play
и вызывать метод объекта
a()"
А вот это работает...
_root.mc.q = _root.mc.stop;
_root.mc.q ();
Все, разобрался. Копируем код, запускаем с дебагером и смотрим, где создался mcTest :(
c = mc.createEmptyMovieClip;
c ("mcTest", 0);
Bar_Duck13
08.10.2006, 17:25
Другое дело... :-)
Да, проблема в том что АС 1/2 всё-таки не класс ориентированы вотличие от АС 3.Методы объявлены или глобально, или непонятно где действуя только на вызывающий объект.... Здесь и вкралась ошибка.
Да, проблема в том что АС 1/2 всё-таки не класс ориентированы вотличие от АС 3.Пока это лишь домысел (причина проблемы).
2 Miramax
и AS1 и AS3 100% ООП языки, оба они динамические, единственное отличие ас3 от ас1, это опциональная типизация, и 2 механизма наследования(трейтовый и прототипный, в то время как ас1 только прототипный)
Класс Ориентированных языков еще не придумали, есть Объекто Ориентированные и Аспектно Ориентированные.
Насчет этой байды:
c = mc.createEmptyMovieClip;
c ("mcTest", 0);
Есть подозрение, что когда писали плеер, по каким то соображениям стали использовать не this, как "якорь", а объект активации функции (вернее аналог этого дела в С++), а объект активации, создается на этот раз в руте.
Это теория.
ЗЫ между прочим АС1 даже ближе к ООП чем C++\C# ;)
Ок, я имел ввиду АС 3 это класс-based язык.
Но то что нельзя по ссылке вызвать метод - проблемка-с
что такое class-based Мирамакс?
в АС1 абсолютно все пашет на классах. я не понимаю тебя.
Есть такое понятие как Объектно-Ориентированный Язык, это значит что язык напрямую зависит от объектов.
Класс, Тип, Структура, Прототип это просто шаблоны, на Java\C++ иногда реализуют прототипную цепочку вручную, в АС, данный паттерн проектирования поддерживается "от рождения".
От того каким образом создаются объекты разницы большой нету, (хотя есть разница в скорости, прототипный паттерн постоянно бегает проверяет всех родителей), объекты остаются объектами. И в ас1 пашут классы(Object,String, MovieClip, TextField, LoadVars), просто наследование реализованно через прототипы.
Вот класс-ориентированный или класс-based
http://en.wikipedia.org/wiki/Class-based_programming
Просто модель проектирования ООП
//остановим
_root.mc.stop();
//не работает!!!
a = _root.mc.play;
a()
//работает
_root.mc.play();
//или так
a = _root.mc;
a.play();
_root.mc.stop();
_root.mc2.stop()
var a:Function = _root.mc.play;
var a2:Function = _root.mc2.play();
a();
a2();
Если компилировать во flashdevelop, то оба мувика будут проигрываться...
Получается на протяжении всех версий 6, 7, 8 макромедиа не исправила этот баг?
У меня была идея откомпилить в FDT но я подумал, что это в языках AS1/2 проблема.
Значит компиль в девятке хоть в чё-то лучше предыдущих :)
У меня была идея откомпилить в FDT
FDT сам компилировать ничего не умеет.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.