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

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

Цитата:

Сообщение от Bar_Duck13
Нифига неправда!!! Зачем народ сбивать с толку??? Сначала проверяй!
Код:

//остановим
_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

2 miramax
 
Вложений: 1
Ты используешь разные вещи тут:
Код:

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

Цитата:

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

:taunt: Ну да. А чем по-твоему таким особым отличается "предустановленная" функция от "не предустановленной" ? Я создам новый класс и перепешу метод play или в прототипе что-нибудь понаверчу, что тогда? Функция это, прежде всего, объект.
Почему же всё работает в АС 3 ? Вывод, в АС 2 где-то глюк. Функция она и в африке функция.
Вызов функции по ссылке это чуть ли не основа ООП.
Надо будет не полениться создать класс extends MovieClip и попробовать вызвать метод по ссылке...

iNils 08.10.2006 16:59

Цитата:

Сообщение от Bar_Duck13
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

Цитата:

Сообщение от miramax
Да, проблема в том что АС 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

Цитата:

Сообщение от Bar_Duck13
Код:

//остановим
_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

Цитата:

Сообщение от miramax
У меня была идея откомпилить в FDT

FDT сам компилировать ничего не умеет.


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

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