Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как передать параметр прослушивателю события? (http://www.flasher.ru/forum/showthread.php?t=139149)

nitsik 24.04.2010 15:27

Как передать параметр прослушивателю события?
 
Такая ситуация. Есть несколько MovieClip-ов, расположенных в массиве, например:
Код AS3:

Main.stairs[0] = new RightHeart;
Main.stairs[1] = new RightHeart;
Main.stairs[2] = new RightHeart;

Необходимо для каждого экземпляра мувика передать в функцию, которая реагирует на событие клика мышкой по мувику индекс мувика. Т. е. когда кликают по Main.stairs[0] в функции, реагирующие на возникновение события должна появляться переменная со значением 0; кликают по Main.stairs[1] - переменная со значением 1, по Main.stairs[2] - переменная со значением 2. Подскажите, как это можно сделать? Я так понял, что через какое-то свойство МувиКлипа? Код должен быть примерно таким (заранее неправильный):
Код AS3:

Main.stairs[key].addEventListener(MouseEvent.CLICK, function(e: Event) {
  var keyMovie = key;
});

Как сделать правильно? Заранее благодарен за ответы.

iflamberg 24.04.2010 15:38

много способов.
Самый элементарный - воспользоваться тем, что MovieClip - динамический класс
Код AS3:

for (var i:int=0; i<3; i++){
  var obj:RightHeart = new RightHeart ();
  obj.key = i; //у каждого объекта теперь свой key
  obj.addEventListener (MouseEvent.CLICK, clickHandler);
  Main.stairs.push(obj);
}
 
function clickHandler (e:Event):void {
  var obj:RightHeart = e.target as RightHeart;
  trace (obj.key); //какой key у объекта по которому кликнули?
}

Есть и другие пособы. Сделать свое собвстенное событие, или для не динамических классов применять почти такой же метод, что я привел, но данные хранить в Dictionary.

P.S. Не ленитесь ставить () после объявления экземпляра класса. Не создавайте функцию в addEventListener - они потом висят в памяти.

nitsik 24.04.2010 15:42

Спасибо за быстрый ответ и за замечания :-) Буду пробовать.

Wolsh 24.04.2010 17:39

Есть еще Array.indexOf()
)))
А правильнее по-моему просто завести в классе RightHeart свойство экземпляра key.

nitsik 24.04.2010 18:01

Цитата:

Сообщение от Wolsh (Сообщение 903140)
А правильнее по-моему просто завести в классе RightHeart свойство экземпляра key.

Т. е.:
Код AS3:

Main.stairs[key].key = key;

, правильно?

iflamberg 24.04.2010 18:07

не, это как раз мой способ, а он имеет ввиду создать класс

Код AS3:

package {
  public class RightHeart extends MovieClip {
    public var key:*;
  }
}

и связать его с мувиком. Так, как бы, правильнее, чтобы потом через много-много дней можно было вспомнить, какие свойства есть у объекта RightHeart, и откуда взялось key.

Wolsh 24.04.2010 18:11

Код AS3:

...
public class RightHeart extends MovieClip // или Sprite
{
    private var _key:uint;
    //....
    public function set key (value:uint):void { _key = value }
    public function get key ():uint { return _key }
}

Код AS3:

Main.stairs[i].key = i;

Т.е. то же, что предлагал iflamberg, только его вариант опирается на то, что МувиКлип - динамический класс. Т.е. со спрайтом например такой способ не пройдет. Да и просто грамотно - иметь фиксированные поля, а не создавать свойства "на лету" в рантайме. МувиКлип был оставлен динамическим не для такого использования, а по необходимости.

iflamberg 24.04.2010 18:15

А я такой *****кодер, такой *****кодер =) У меня даже есть
Код AS3:

package fbrg.utils {  public dynamic class DLoader extends Loader {}}

просто для того, чтобы в маленьких проектах не создавать новые классы расширяющие Loader для записи всего нескольких свойств.

BlooDHounD 24.04.2010 19:05

грамотнее, на самом деле, создавать хэши с "приватными" классами, в которых хранятся нужные вам значения.
Код AS3:

package {
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.utils.Dictionary;
 
        /**
        * @author                        BlooDHounD
        * @playerversion        Flash 9
        * @langversion                3.0
        */

        public class test extends Sprite {
 
                public function test() {
                        super();
 
                        var mc:Sprite = new Sprite();
                        // создаём свойства не создавая наследников
                        this._hash[ mc ] = new MyProps();
                }
 
                private const _hash:Dictionary = new Dictionary();
 
                private function handler_click(event:MouseEvent):void {
                        var props:MyProps = this._hash[ event.target ];
                        // do something
                }
 
        }
 
}
 
internal final class MyProps {
 
        public function MyProps() {
                super();
        }
 
        public var var1:Number;
 
        public var var2:String;
 
}

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

iflamberg 24.04.2010 19:18

я класс Dictionary упоминал вторым постом =)


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

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