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

Zmet 16.08.2006 17:54

Массив ссылок на объекты
 
Уже перелопатила несколько учебников и никак не могу понять, есть ли в АС возможность создать массив ссылок на объекты, например принадлежащие одному мувику? или массив кнопок (как в С++)?

Если нет, то как решается подобная проблема: есть достаточно большое количество однотипных объектов (например, кнопок), которые одинаково реагируют на одно и то же событие (например, движение мыши). Действия при наступлении события описываются в отдельной функции, а вот реакцию на это событие приходится описывать отдельно для каждого объекта. А если их сто?!

Пробовала делать через листенера, но ведь он не может определить, какой конкретно объект из списка вызвал событие. Или может? Если может, то как получить на него ссылку.

Заранее спасибо.

CCCPirate 16.08.2006 18:01

создай свой класс

Zmet 16.08.2006 18:06

Цитата:

Сообщение от CCCPirate
создай свой класс

А попроще никак? Т.е. массивов не бывает?

etc 16.08.2006 18:12

Zmet, используй EventDispatcher, там есть возможность определения объекта, отославшего событие.

Zmet 16.08.2006 18:23

Цитата:

Сообщение от __etc
Zmet, используй EventDispatcher, там есть возможность определения объекта, отославшего событие.

Спасибо. Пока не знаю, правда, что это такое. Пойду в справке поковыряюсь :)

etc 16.08.2006 18:29

Класс mx.events.EventDispatcher
http://livedocs.macromedia.com/flash.../00003473.html

CCCPirate 16.08.2006 18:34

объект может передавать свое _name, так же можно просмотреть все объекты внутри клипа: (for var name in clip) { trace (name) ...}

я не совсем понял в чем собственно задача? (что неообходимо реализовать?)

Zmet 16.08.2006 18:34

Мерси

Zmet 16.08.2006 18:52

Цитата:

Сообщение от CCCPirate
объект может передавать свое _name, так же можно просмотреть все объекты внутри клипа: (for var name in clip) { trace (name) ...}

я не совсем понял в чем собственно задача? (что неообходимо реализовать?)

Задача описана вначале, кажется довольно понятно :confused:
Есть сто разных картинок. При нажатии на любую картинку ее прозрачность становится равной 50. Как описать эти действия для всех картинок сразу.

Есть:
Код:

pict1.onSobytie=function(){
pict1._alpha=50;
}; //и так сто раз, для каждой картинки

Хочу:
Код:

pict[i].onSobytie=function(){
pict[i]._alpha=50;
};

//событие наступает только для одного объекта, но описывается сразу для всех

etc 16.08.2006 18:55

Код:

import mx.events.EventDispatcher;
EventDispatcher.initialize(container_mc);
for (var i in container_mc) {
    var mc = MovieClip(container_mc[i]);
    if (mc!=null) {
        mc.onAnyEvent = function(event) {
              this._alpha = 50;
              trace(['Event receiver: '+this,'Event sender: '+event.target]);
        }
        container_mc.addEventListener("onAnyEvent",mc); // если используется EventDispatcher
    }
}
container_mc.dispatchEvent({type:'onAnyEvent'});

Пример.

Zmet 16.08.2006 18:57

Да ладно, неужели сработает?! Попробую :)

etc 16.08.2006 18:59

Я дополнил, посмотри.

Zmet 16.08.2006 19:07

Вот это посолидней! Ваяю. Результат скажу завтра :) Спасибо

Zmet 21.08.2006 11:16

Прискорбно. Ничего не получилось...

Nirth 21.08.2006 11:36

не удивительно, вы же не прочитали правил форума, вам предупреждение.

Juice_Green 21.08.2006 11:58

2 __etc: если судить по задаче, то можно обойтись и без eventDispether'a, а просто использовать this в в функции обработчике.

Zmet 21.08.2006 13:02

Цитата:

Сообщение от Nirth
не удивительно, вы же не прочитали правил форума, вам предупреждение.

Прочла. Какой из пунктов нарушен? Не пререкаюсь, просто не понимаю.

Спасибо всем. Один из вариантов решения проблемы нашла на RealTime. Если кому-то интересно, выкладываю кусочек кода:
Код:

for (var i in mc){
  if(mc[i].getDepth){
    mc[i].onPress=function(){
      trace(this);
}}}


etc 21.08.2006 14:01

Цитата:

Сообщение от Juice_Green
2 __etc: если судить по задаче, то можно обойтись и без eventDispether'a, а просто использовать this в в функции обработчике.

Можно. Но я привёл пример того, как сделал бы я.

pome 20.09.2007 19:34

Код:

var container_mc:MovieClip=this.createEmptyMovieClip("container_mc", this.getNextHighestDepth());
var clips:Array = new Array();

for (m=0; m<20; m++){
        clips[m]=container_mc.createEmptyMovieClip("clips"+m, container_mc.getNextHighestDepth());
        clips[m].lineStyle(1,0x000000,100);
        clips[m].beginFill(0x000000, 100);
        clips[m].moveTo(0,0);
        clips[m].lineTo(10,0);
        clips[m].lineTo(10,10);
        clips[m].lineTo(0,10);
        clips[m].lineTo(0,0);
        clips[m].endFill();
        clips[m]._x=20;
        clips[m]._y=10+m*12;
        clips[m].qwe="Это клип "+m;
}

container_mc._x=100;

import mx.events.EventDispatcher;
EventDispatcher.initialize(container_mc);
for (var i in container_mc) {
    var mc = MovieClip(container_mc[i]);
    if (mc!=null) {
        mc.onPress = function(event) {
              this._alpha = 50;
              trace(['Event receiver: '+this,'Clip number: '+this.qwe]);
        }
        container_mc.addEventListener("onAnyEvent",mc); // если используется EventDispatcher
    }
}
container_mc.dispatchEvent({type:'onAnyEvent'});

Вот так работает прекрасно. Мне тож статейка пригодилась:)

etc 20.09.2007 19:43

А вот двадцать раз clips[m] можно было и не писать. Мало того, что ухудшает читабельность, так ещё и тормозит.


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

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