PDA

Просмотр полной версии : Массив ссылок на объекты


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

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

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

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

CCCPirate
16.08.2006, 18:01
создай свой класс

Zmet
16.08.2006, 18:06
создай свой класс
А попроще никак? Т.е. массивов не бывает?

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

Zmet
16.08.2006, 18:23
Zmet, используй EventDispatcher, там есть возможность определения объекта, отославшего событие.
Спасибо. Пока не знаю, правда, что это такое. Пойду в справке поковыряюсь :)

etc
16.08.2006, 18:29
Класс mx.events.EventDispatcher
http://livedocs.macromedia.com/flash/8/main/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
объект может передавать свое _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
не удивительно, вы же не прочитали правил форума, вам предупреждение.
Прочла. Какой из пунктов нарушен? Не пререкаюсь, просто не понимаю.

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

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

etc
21.08.2006, 14:01
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] можно было и не писать. Мало того, что ухудшает читабельность, так ещё и тормозит.