10
фев
  LocalConnection, или как вызвать из одной флешки функцию другой 7 баллов
 

Вопрос:


Здравствуйте снова. У меня следующий вопрос или скорее даже просьба: Все никак не могу врубиться в класс LocalConection. Как им пользоваться? Искал разные способы уже опубликованные кем-то где-то на форумах - вставлял свои имена в коды, но ничего не работало. Мне нужно заставить пересылать команды из одного swf в другой, находящихся на одном сайте. Буду примного благодарен за объяснение. И если вам не трудно - пример с кодом ).
Ответ:

Здраствуйте… Каюсь, боюсь вам больше не нужна моя помощь, так как вопрос был задан 06.02.2008 г., а сегодня уже 16 число, этого же месяца, целых 10 дней прошло, мало ли что могло случиться, и вам, может быть, сейчас совсем не до флешек и каких-то там Local Connection в Flash, но всё-таки, сегодня родил я перед сном пример c уроком и даже исходником для вас, может чем-то и поможет =)

Две флешки на одной странице


Сразу оговорюсь, всё описанное ниже будет работать ТОЛЬКО в сети, но никак не на локальном компьютере, по-крайней мере у меня именно так и было. Максимум на что вы можете расчитывать тестируя данные Flash приложения — это взаимодействие двух флешек на разных страницах браузера, открытых в данные момент. Кстати вот вам ещё один факт, несколько Flash приложений могут взаимодействовать между собой не только находясь на одной HTML странице браузера, но и на разных (например тут и тут), на самом деле интересная штука.

Flash. Local Connection. Взаимодействие


Так, чтобы заставить взаимодействовать между собой две флешки, нужно сначала создать в них объекты класса Local Connection, которые будут посылать друг другу команды, а так же разобраться какие команды посылают, а какие принимают команды.

Создаём объект Local Connection


var receiving_lc:LocalConnection = new LocalConnection();

Как понятно, receiving_lc — это имя объекта Local Connection, с которым мы будем работать.

Посылаем команды. Метод send


_root.sending_lc.send(“lc_name”, “zapusk_func”, 5);

Метод send класса LocalConnection в Flash посылает определённые команды другому объекту LocalConnection в другой флешке.

1. _root.sending_lc — это имя объекта Local Connection, который будет посылать команды;
2. lc_name — имя канала “связи” между флешками;
3. zapusk_func — функция, которую нужно запустить в другой флешке. Данная функция обязательно должна быть методом объекта Local Connection другой флешки.

Принимаем команды. Метод connect


receiving_lc.connect(“lc_name”);

Метод connect, как бы подключается к “каналу связи” между флешками, по которому в дальнейшем он может получать команды. Единственным параметром этого метода является имя “канала связи”, которое в данном случае lc_name. Мне этот принцип напоминает то, как мы, включая радио, настраиваемся на волну какой-то радиостанции и слушаем её трансляции.

Пример исходного кода


Далее я выложу примеры исходных кодов флешек, которые я использовал при создании данного урока. Весь исходный код содержит достаточно большое количество комментариев, так что, я надеюсь, разобраться в нём у вас не составит большого труда.

Флешка посылающая команды


//Делаем так, чтобы флешка не масштабировалась
Stage.scaleMode = “noScale”;
//
//Создаём объект Local Connection
var sending_lc:LocalConnection = new LocalConnection();
//При наведении курсора немного увеличиваем размеры объекта button_mc
button_mc.onRollOver = function() {
        this._xscale = this._yscale=105;
};

Флешка принимающая команды


//В кратце опишу сегодняшний урок:
//Сегодня мы создадим две флешки, одна из которой будет принимать определённую команду от другой.
//В роли команды будет выступать “ЗАПУСК” вращающегося логотипа сайта flashist.ru
//В общем всё можете увидеть сами, нажав CTRL+ENTER и поклацав на рабочем поле, это будет демонстрация “ЗАПУСКА”
//
//Делаем так ,чтобы флешка не масштабировалась
Stage.scaleMode = “noScale”;
//Создаём переменную “ГРАВИТАЦИИ”, которая будет постепенно величивать скорость “подкинутых” объектов,
//и ускорять их падение
var varGrav:Number = 0.5;
//Создаём массив, в котором мы будем “запоминать” все созданные нами ЛОГОТИПЫ, и переменную, в которой
//мы будем запоминать КОЛИЧЕСТВО всех созданных логотипов.
//Я намеренно не использую для этих целей свойство length класса Array, потому что перед инициализацией
//цикла, а циклы мы в уроке будем тоже использовать, лучше “запомнить” количество объектов массива в
//отдельную переменную, разными опытами доказано, что так цикл будет работать гораздо быстрее.
var logo_array:Array = [];
var varLength:Number = 0;
//Создаём функцию, которая будет “ЗАПУСКАТЬ” новые объекты клипа logo_mc
//
//Переменная varCount показывает какое количество объектов будет создано за раз
function zapusk_func(varCount:Number) {
        //Если varCount не задано при вызове функции, то присваиваем ему значение 1. Что означает, что будет
        //создан, один объект
        if (!varCount) {
                varCount = 1;
        }
        //Запускаем цикл, в теле которого будут создаваться новые объекты.
        for (var i = 0; i< varCount; i++) {
                //”Аттачим” из библиотеки на рабочее поле объект logo_mc
                //
                //Случайно задаём ему координату по X, в пределах ширины флешки.
                //По Y располагаем его на самой границе рабочей области снизу.
                //Так же случайно от 25 до 100 задаём ему параметр _xscale
                varLogo = _root.attachMovie(“logo_mc”, “logo”+_root.getNextHighestDepth()+“_mc”, _root.getNextHighestDepth(), {_xscale:25+random(75), _x:random(Stage.width), _y:Stage.height});
                //Делаем так, чтобы _yscale и _xscale объекта были одинаковы, нужно для того, чтобы сохранить
                //пропорции объекта.
                varLogo._yscale = varLogo._xscale;
                //Добавляем созданный объект в массив logo_array
                _root.logo_array.push(varLogo);
                //”ЗАПОМИНАЕМ” в переменную varLength длину массива (колличество элементов)
                _root.varLength = _root.logo_array.length;
                //Создаём у объекта переменные скорости изменения по оси X, Y и ВРАЩЕНИЯ
                //Величина параметров будет зависить от РАЗМЕРА объекта, чем он МЕНЬШЕ, тем он в среднем
                //будет двигаться и вращаться быстрее.
                varLogo.varSpeedY = (-10)*100/varLogo._xscale;
                varLogo.varSpeedX = (Math.random()*5-Math.random()*5)*100/varLogo._xscale;
                varLogo.varSpeedRotation = (Math.random()*20-Math.random()*20)*100/varLogo._xscale;
        }
}
//Создаём функцию “ПЕРЕМЕЩЕНИЯ” всех созданных объектов.
//
//Тут надо приостановиться и объяснить, почему я делаю так, а не использую Класс Tween или событие
//onEnterFrame для каждого объекта. Про класс Tween в подобных случаях вообще забудьте, он жрёт очень много
//ресурсов. когда количество “передвигаемых” объектов достаточно большое, класс Tween очень не желательно
//использовать, т.к. компьютор пользователя может просто “не потянуть” всю програмнмную анимацию
//и зависенуть. Так же мы не используем событие onEnterFrame для каждого объекта, потому что, опять же,
//в уелях экономии ресурсов компьюетра “дешевле” вызывать одну функцию 30 раз в секунду, чем для 20 объектов,
//по одной функции 30 раз в секунду.
//
//Если этот момент я не очень хорошо объяснил, и вы чего-то непоняли, то просто пропустите его, я думаю вы
//поёмёте, о чём я говорил, когда в разработке Flash приложений столкнётесь с проблемами производительности.
//
function move_func() {
        //Создаём цикл, который будет перебирать все элементы массива logo_array, т.е. все созданные нами
        //объекты
        for (var i = 0; i<_root.varLength; i++) {
                //Для удобства и улучшения производительности “запоминаем” объект, с которым мы будем сейчас работать
                //в отдельную переменную.
                varTarget = _root.logo_array[i];
                //Смещаем объект по осям X и Y, смещение будет равно скорости объекта по этим осям.
                varTarget._y += varTarget.varSpeedY;
                varTarget._x += varTarget.varSpeedX;
                //Так же изменяем параметр _rotation в зависимости от СКОРОСТИ ВРАЩЕНИЯ объекта
                varTarget._rotation += varTarget.varSpeedRotation;
                //Изменяем скорость объекта по оси Y прибавляя к ней значение ГРАВИТАЦИИ, которая будет “тянуть”
                //объект вниз.
                varTarget.varSpeedY += _root.varGrav;
                //Проверяем, если объект опустился достаточно низко за нижний предел экрана, удаляем его, и
                //”стираем” этот элемент из массива logo_array
                if (varTarget._y>Stage.height+50) {
                        //Удаляем объект
                        varTarget.removeMovieClip();
                        //Удаляем элемент под номером i из массива
                        _root.logo_array.splice(i, 1);
                }
        }
}
//Задаёмм интервал для функции ДВИЖЕНИЯ, он будет вызывать её примерно 30 раз в секнду.
setInterval(move_func, 30);
//При нажатии мышки на рабочем поле, будет вызываться функция СОЗДАНИЯ ОБЪЕКТА
onMouseDown = zapusk_func;
//
//Создаём объект класса Local Connection
//
var receiving_lc:LocalConnection = new LocalConnection();
//Т.к. из другой флешки могут вызываться только функции объекта класса Loacal Connection присваиваем
//функцию запуска к функции только что созданного объекта.
receiving_lc.zapusk_func = zapusk_func;
//Как бы “говорим” объекту Local Connection, что нужно ПРИНИМАТЬ данные от “СВЯЗИ” под именем lc_name
receiving_lc.connect(“lc_name”);
//
// www.flashist.ru

В заключении


Привожу ссылки на две флешки расположенные на разных HTML страницах:

http://www.flashist.ru/files/localconnection/otpravlyaet.swf

http://www.flashist.ru/files/localconnection/prinimaet_2.swf

А так же стандартные ссылки на пример работающей флешки, и архив к уроку:

Сами флешки (swf) | Исходник (fla)

Комментарии (1)   Автор: admin
Комментарии
GLD
04.02.10 | 07:49
0 баллов

Супер! Спасибо огромное, очень помог ваш урок, за комментарии отдельное спасибо!

 
 
 
 

Последние комментарии

Полезные ссылки

Реклама сайтов