PDA

Просмотр полной версии : Небольшой вопросик


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

miramax
08.10.2006, 02:45
Воообще-то это основной синтаксис современных языков программирования.

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 это что тогда???

miramax
08.10.2006, 02:59
Функция 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();

miramax
08.10.2006, 05:07
Нифига неправда!!! Зачем народ сбивать с толку??? Сначала проверяй!
//остановим
_root.mc.stop();
//не работает!!!
a = _root.mc.play;
a()
//работает
_root.mc.play();
//или так
a = _root.mc;
a.play();
Для тебя такой способ оращения к функциям, видимо, тоже стало открытием.
Всё прекрасно работает.

function f()
{
trace('call')
}
a = f;
a();

сначала ссылка на объект-функцию, а потом вызов объекта-функции по ссылке. Всё верно.

Neosano
08.10.2006, 11:33
ого, не знал...

Bar_Duck13
08.10.2006, 13:59
Ты используешь разные вещи тут:
a = _root.house.window.play
//и вызывать метод объекта
a()
и тут:
function f()
{
trace('call')
}
a = f;
a();
Второй способ я постоянно использую. Это давно для меня не открытие. Запусти пример и убедись, что ты не прав.

iNils
08.10.2006, 16:09
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);

miramax
08.10.2006, 16:10
вы восьмёрку юзаете, а я девятку. )))))
В АС 3 всё работает, а в восьмерке почему-то не все методы MovieClip'а вызываются (stop, play). Зато самописанные вызываются всегда.
Видимо это реальный баг АС 2 .
В любом случае, ссылка может быть на любую функцию! Я просто не удачный ПРИМЕР привёл stop().

Bar_Duck13
08.10.2006, 16:48
2 iNils, 2 miramax: Вы не путайте функции созданные вами с ПРЕДУСТАНОВЛЕННЫМИ(наверно так называются), те которые цветом выделяются. - play, stop, и т.д. Miramax как раз про это пишет и версия тут ни при чём!!!

miramax
08.10.2006, 16:56
2 iNils, 2 miramax: Вы не путайте функции созданные вами с ПРЕДУСТАНОВЛЕННЫМИ(наверно так называются), те которые цветом выделяются. - play, stop, и т.д. Miramax как раз про это пишет и версия тут ни при чём!!!
:taunt: Ну да. А чем по-твоему таким особым отличается "предустановленная" функция от "не предустановленной" ? Я создам новый класс и перепешу метод play или в прототипе что-нибудь понаверчу, что тогда? Функция это, прежде всего, объект.
Почему же всё работает в АС 3 ? Вывод, в АС 2 где-то глюк. Функция она и в африке функция.
Вызов функции по ссылке это чуть ли не основа ООП.
Надо будет не полениться создать класс extends MovieClip и попробовать вызвать метод по ссылке...

iNils
08.10.2006, 16:59
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()"

iNils
08.10.2006, 17:09
А вот это работает...
_root.mc.q = _root.mc.stop;
_root.mc.q ();

iNils
08.10.2006, 17:12
Все, разобрался. Копируем код, запускаем с дебагером и смотрим, где создался mcTest :(
c = mc.createEmptyMovieClip;
c ("mcTest", 0);

Bar_Duck13
08.10.2006, 17:25
Другое дело... :-)

miramax
08.10.2006, 17:41
Да, проблема в том что АС 1/2 всё-таки не класс ориентированы вотличие от АС 3.Методы объявлены или глобально, или непонятно где действуя только на вызывающий объект.... Здесь и вкралась ошибка.

iNils
08.10.2006, 17:56
Да, проблема в том что АС 1/2 всё-таки не класс ориентированы вотличие от АС 3.Пока это лишь домысел (причина проблемы).

Nirth
08.10.2006, 19:01
2 Miramax
и AS1 и AS3 100% ООП языки, оба они динамические, единственное отличие ас3 от ас1, это опциональная типизация, и 2 механизма наследования(трейтовый и прототипный, в то время как ас1 только прототипный)

Класс Ориентированных языков еще не придумали, есть Объекто Ориентированные и Аспектно Ориентированные.

Насчет этой байды:
c = mc.createEmptyMovieClip;
c ("mcTest", 0);

Есть подозрение, что когда писали плеер, по каким то соображениям стали использовать не this, как "якорь", а объект активации функции (вернее аналог этого дела в С++), а объект активации, создается на этот раз в руте.

Это теория.

Nirth
08.10.2006, 19:05
ЗЫ между прочим АС1 даже ближе к ООП чем C++\C# ;)

miramax
08.10.2006, 19:07
Ок, я имел ввиду АС 3 это класс-based язык.
Но то что нельзя по ссылке вызвать метод - проблемка-с

Nirth
08.10.2006, 19:09
что такое class-based Мирамакс?

в АС1 абсолютно все пашет на классах. я не понимаю тебя.

Nirth
08.10.2006, 19:14
Есть такое понятие как Объектно-Ориентированный Язык, это значит что язык напрямую зависит от объектов.

Класс, Тип, Структура, Прототип это просто шаблоны, на Java\C++ иногда реализуют прототипную цепочку вручную, в АС, данный паттерн проектирования поддерживается "от рождения".

От того каким образом создаются объекты разницы большой нету, (хотя есть разница в скорости, прототипный паттерн постоянно бегает проверяет всех родителей), объекты остаются объектами. И в ас1 пашут классы(Object,String, MovieClip, TextField, LoadVars), просто наследование реализованно через прототипы.

miramax
08.10.2006, 22:34
Вот класс-ориентированный или класс-based
http://en.wikipedia.org/wiki/Class-based_programming
Просто модель проектирования ООП

lowka
08.10.2006, 22:47
//остановим
_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, то оба мувика будут проигрываться...

miramax
08.10.2006, 23:01
Получается на протяжении всех версий 6, 7, 8 макромедиа не исправила этот баг?
У меня была идея откомпилить в FDT но я подумал, что это в языках AS1/2 проблема.
Значит компиль в девятке хоть в чё-то лучше предыдущих :)

etc
09.10.2006, 18:44
У меня была идея откомпилить в FDT
FDT сам компилировать ничего не умеет.