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

ChickenKid 14.12.2005 21:28

Отклик мувиков нужного типа на к-либо действие.
 
Я создаю несколько однотипных мувиков, в которых прописана какая-нибудь функция (например, изменяющая текст в текстфилде внутри этого мувика). Есть глобальная переменная, допустим, _root.v. Нужно, чтобы при изменении значения этой переменной на какое-нибудь другое, во всех мувиках сробатывали те прописанные функции.

Или можно создать класс, которому присвоить эти мувики, и вызывать где-нибудь метод этого класса (например, с новым значением _root.v в качестве параметра), который вызовет прописанную внутри него фунцию для каждого экземпляра (моих несчастных мувиков)? Как такое сотворить?

Практическое применение может быть следующим:
— сайт выполнен в какой-то цветовой гамме, т. е. элементы сайта одного и того же цвета (кнопки, текст, курсор и т. д.), и ондим нажатием мыши поменять цветю гамму сайта, т. е. одновременно цвета всех нужных элементов;
— если сайт на нескольких языках, поменять текст во всех нужных мувиках на соответствующий язык.

KUZEN 14.12.2005 22:00

Цитата:

Сообщение от ChickenKid
Есть глобальная переменная, допустим, _root.v.

Рассмешил :D

ChickenKid 14.12.2005 22:02

Простите-простите, в рамках моего, скажем так, проекта, такая переменная — глобальная. Ну пусть _global.v

Nirth 14.12.2005 22:12

Начал писать когда то, чуть дописал.
Код:

import mx.events.EventDispatcher;
class ru.flasher.helping.managers.MovieClipChanger {
        //event stuff
        private static var initDispatcher = EventDispatcher.initialize(MovieClipChanger.prototype);
        public var addEventListener:Function;
        public var removeEventListener:Function;
        private var dispatchEvent:Function;
        //private properties
        private var __movies_array:Array;
        private var __method:Function = null;
        //Constructor
        public function MovieClipChanger () {
                __movies_array = new Array ();
        }
        //public methods
        public function addMovie(mc:MovieClip):Number {
                __movies_array.push(mc);
                dispatchEvent({type:"add",mc:mc});
                return __movies_array.length;
        }
        public function removeMovie(mc):Object {
                var result:Object = null;
                if(typeof(mc) == "number") {
                        result = __movies_array[mc];
                        __movies_array.splice(mc,1);
                }else if(typeof(mc) == "movieclip") {
                        for(var i:Number=0;i<__movies_array.length;i++) {
                                if(__movies_array[i] == mc) {
                                        result = __movies_array[i];
                                        __movies_array.splice(i,1);
                                        break;
                                }
                        }
                }
                dispatchEvent({type:"remove",mc:result});
                return result;
        }
        public function getMovie(index:Number):MovieClip {
                if(index<=__movies_array.length) {
                        return __movies_array[index];
                }else{
                        return null;
                }
        }
        public function registerMethod(method:Function):Void {
                __method = method;
                dispatchEvent({type:"register" , method:__method});
        }
        public function execute(args:Array):Void {
                dispatchEvent({type:"execute",method:__method};
                for(var i:Number = 0;i<__movies_array.length;i++) {
                        __method.apply(__movies_array[i],args);
                }
        }               
        //read only
        public function get length ():Number {
                return __movies_array.length;
        }
        public function get movies ():Array {
                return __movies_array.slice()
        }
}

В Фла файле на сцену кладем мувики (назевем их b1_mc, b2_mc и так далее)
и в первом кадре пишем
Код:

import ru.flasher.helping.managers.MovieClipChanger
var manager:MovieClipChanger = new MovieClipChanger();
manager.addMovie(b1_mc);
manager.addMovie(b2_mc);
manager.addMovie(b3_mc);
manager.removeMovie(b2_mc);
function setText(name:String):Void {
        this._txt.text = this._name;
}
manager.registerMethod(setText);
manager.execute();


ChickenKid 15.12.2005 15:20

Спасибо огромное!

ChickenKid 05.10.2006 14:38

Nirth, скажи, а зачем ты в этом классе использовал EventDispatcher и его метод dispatchEvent? По сути они бесполезны, по крайней мере после того, как я их убрал, класс сохранил свою работоспособность.

Просто я хочу сделать так, чтобы в одном экземпляре MovieClipChanger можно было регистрировать несколько методов.

etc 05.10.2006 15:32

Цитата:

Сообщение от ChickenKid
По сути они бесполезны

Ещё как полезны, для подписки на события.
Хотя, похоже на аналог mx.data.binding.Binding…

ChickenKid 05.10.2006 16:45

Я имел в виду именно этот пример, в нем использование EventDispatcher мне не понятно

etc 05.10.2006 18:31

Цитата:

Сообщение от ChickenKid
Я имел в виду именно этот пример, в нем использование EventDispatcher мне не понятно

В данном примере может и не нужно. А вообще — полезно.


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

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