|
|
|||||
Рассылка сообщения всем SWF
Зачада: на странице загружено 10 копий одной swf - MediaPlayer.
При проигрывании одного из плеера, остальные 9 должны молчать, т.е. получить сообщение что играть пока нельзя. Если фокус Play преходит к одному другому плееру, сообщение рассылаем заново, все замолкают кроме текущего. При этом хочется сделать универсально в 1ной swf. Т.е. загруженных плееров может быть хоть тысячи... без гемора передачи параметров и без вызова JS. И так проблемы. SharedObject постояные проблемы с обновлением данных. Если даже пересоздавать обьект через таймер, данные не обновляются, и получается постоянная долбежка. Событыие SyncEvent не фурыкает как надо. LocalConnection невозможно создавать более двух подключений к одному соединению. Как решить подобную задачу?
__________________
www.vadimuz.ru Последний раз редактировалось VadimuZ; 02.12.2010 в 20:13. |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
var id = Math.random(); // желательно уникальный id var lc = new LocalConnection(); var maxPlayers = 100; var lcName = "player_"; function searchFreeConnections() { for (var k = 0; k<maxPlayers; k++) { if (lc.connect(lcName+k)) { lc.stopPlayback = function(_id) { if (_id != id) { // self pause here } }; return; } } } searchFreeConnections(); function muteOthers() { var lc2 = new LocalConnection(); for (var k = 0; k<maxPlayers; k++) { lc2.send(lcName+k,"stopPlayback",id); } }
__________________
hauts.ru Последний раз редактировалось Hauts; 03.12.2010 в 10:40. |
|
|||||
В этом примере, запускаем несколько таких флешек, первая флешка будет сервером, жмем на черный квадратик и текст из TextField-а попадает ко всем остальным.
Нужно только правильно реализовать переключение сервера и удаление недействительных клиентов (когда какая-нибудь флешка будет закрыта) package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.StatusEvent; import flash.net.LocalConnection; import flash.text.TextField; import flash.text.TextFieldType; public class Main extends Sprite { public function Main() { if (stage) addedToStageListener(); else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener); } private static const CLIENT_CONNECTION_NAME:String = "UniqueConnectionNameClient"; private static const SERVER_CONNECTION_NAME:String = "UniqueConnectionNameServer"; private var tf:TextField; private var client:LocalConnection; private var client_connection_name:String; private var server:LocalConnection; private var i_is_server:Boolean; /// количество клиентов private var amount_client:int; private function addedToStageListener(event:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener); tf = new TextField(); tf.border = true; tf.height = 30; tf.width = 100; tf.type = TextFieldType.INPUT; addChild(tf); var btn:Sprite = new Sprite(); btn.graphics.beginFill(0); btn.graphics.drawRoundRect(0, 0, 40, 20, 5); btn.graphics.endFill(); btn.buttonMode = btn.useHandCursor = true; btn.y = 30; addChild(btn); btn.addEventListener(MouseEvent.CLICK, clickListener); amount_client = 0 client = new LocalConnection(); client.addEventListener(StatusEvent.STATUS, onStatus); server = new LocalConnection(); server.addEventListener(StatusEvent.STATUS, onStatus); var findEmtpySlot:Boolean = false; while (!findEmtpySlot) { client_connection_name = CLIENT_CONNECTION_NAME + String(amount_client); try { client.connect(client_connection_name); findEmtpySlot = true; } catch (error:ArgumentError) { } amount_client++; if (findEmtpySlot) { client.client = this; } else { server.send(client_connection_name, "takeSlot"); } } i_is_server = amount_client == 0; } public function takeSlot():void { amount_client++; trace("Client amount: " + amount_client); } private function clickListener(e:MouseEvent):void { trace("onClick"); for (var i:int = 0; i < amount_client; i++) { var name:String = CLIENT_CONNECTION_NAME + String(i); // не будем посылать себе if (name != client_connection_name) { server.send(name, "setText", tf.text); trace("Send to " + name) } } } public function setText(text:String):void { tf.text = text; trace("Set text: " + text); } private function onStatus(event:StatusEvent):void { switch (event.level) { case "status": trace("LocalConnection.send() succeeded"); break; case "error": trace("LocalConnection.send() failed"); break; } } } } |
|
|||||
Реализовал вариант zuxul, всем спасибо.
__________________
www.vadimuz.ru |
Часовой пояс GMT +4, время: 13:35. |
|
« Предыдущая тема | Следующая тема » |
|
|