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

dudialex 07.07.2010 11:24

Привязывание события к динамически создаваемым объектам
 
AS2

Привет. Нужна помощь вот в чём.
У нас есть динамически создаваемые объекты, например точки и каждая точка имеет свою координату, своё название и свою ссылку.

Как привязать событие, которое происходит при нажатие на точку. Может кто нибудь выложит весь код. ни как не могу понять как привязать клик по точке и чтоб нить произошло, пытался пользоваться addEventListener - не могу понять как он работает и как обрабатывать.

Выкладываю код класса
Код AS1/AS2:

class Metka {
 
 public var testt:Number;
 public var container_mc:MovieClip;
 
 
        public function draw  ():Void
        {
                container_mc=_root.createEmptyMovieClip("myClip"+testt, testt);
                container_mc.loadMovie("1.png");       
 
              // Вот тут надо привязать клик по точке
                container_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
 
        }       
 
        public function mouseOverHandler()
        {
                trace ("+");
        }
 
 
        //  Функция создает новый объект этого кдассаа
        public function add_metka(id,koor_x,koor_y)
        {
                testt=id;
                draw();
                koordinat(koor_x,koor_y);
        }
 
        //  Функция изменяем место пложение клипа
        public function koordinat(koor_x,koor_y)
        {
          if (koor_x){SetX(koor_x);}
          if (koor_y){SetY(koor_y);}
        }// - - -  --
 
        public function SetX(koor_x)
        {
                container_mc._x=koor_x;
        }// - - - - -
 
        public function SetY(koor_y)
        {
                container_mc._y=koor_y;
        }// - - -- - -
}


mooncar 07.07.2010 11:38

Вот эта конструкция
Код AS3:

container_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);

вроде из AS3, а не AS2.
Вам скорее всего onRollOver нужно использовать.

И потом, как только вы загрузите контент в container_mc, все обработчики его событий слетят.
Вот тема была буквально недавно: http://www.flasher.ru/forum/showthread.php?t=141869
Решения там тоже есть.

wvxvw 07.07.2010 12:25

Код AS1/AS2:

class Mark
{
        public var test:number;
        public var container:movieclip;
 
        public function set x(value:Number):Void
        {
                this.container._x = value;
        }
 
        public function set y(value:Number):Void
        {
              this.container._y = value;
        }
 
        /**
        * Constructor.
        * Creates new instance of <code>Mark</code>
        */

        public function Mark() { super(); }
 
        public function draw():Void
        {
                // Use MovieClipLoader instead
                this.container = _root.createEmptyMovieClip("myClip" + test, test);
                this.container.loadMovie("1.png");
 
              // Вот тут надо привязать клик по точке
                this.container.onRollOver = this.makeDelegate(this.mouseOverHandler);
 
        }       
 
        private function makeDelegate(func:Function):Function
        {
                var context:Mark = this;
                return function():Object
                {
                        return func.apply(context, arguments);
                }
        }
 
        public function mouseOverHandler():Void
        {
                trace ("+");
        }
 
        /**
        * This method creates new <code>MovieClip</code> somewhere...
        */

        public function addMark(id:Number, x:Number, y:Void):Void
        {
                this.test = id;
                this.draw();
                this.koordinat(x, y);
        }
 
        /**
        * Функция изменяет местоположение клипа
        */

        public function position(x:Number, y:Number):Void
        {
          if (!isNaN(x)) this.x = x;
          if (!isNaN(y)) this.y = y;
        }
}

Что понял, исправил, что не понял, оставил как есть. Если уж пишете в классах, то используйте MovieClipLoader, а не loadMovie

dudialex 07.07.2010 12:47

Можно прокомментрировать или принцип как это работает описать

in4core 07.07.2010 12:52

Код AS1/AS2:

class Mark
{
        public var test:number;
        public var container:movieclip;
 
        public function set x(value:Number):Void  // устанавливает начальную коорд контейнера
        {
                this.container._x = value;
        }
 
        public function set y(value:Number):Void  // устанавливает начальную коорд контейнера
        {
              this.container._y = value;
        }
 
        /**
        * Constructor.
        * Creates new instance of <code>Mark</code>
        */

        public function Mark() { super(); }  // для красоты
 
        public function draw():Void  //
        {
                // Use MovieClipLoader instead
                this.container = _root.createEmptyMovieClip("myClip" + test, test);
                this.container.loadMovie("1.png");
 
              // используем делегат класс для обработки событий в классах, подробнее mx.utils.Delegate сдесь же он использует собственно созданный делегат  .
                this.container.onRollOver = this.makeDelegate(this.mouseOverHandler);
 
        }       
 
        private function makeDelegate(func:Function):Function
        {
                var context:Mark = this;
                return function():Object
                {
                        return func.apply(context, arguments);
                }
        }
 
        public function mouseOverHandler():Void
        {
                trace ("+");
        }
 
        /**
        основная функция создающая клипец с параметрами какиеми надо
        */

        public function addMark(id:Number, x:Number, y:Void):Void
        {
                this.test = id;
                this.draw();
                this.koordinat(x, y);
        }
 
        /**
        * Функция изменяет местоположение клипа, в любой мопмент времени!!!
        */

        public function position(x:Number, y:Number):Void
        {
          if (!isNaN(x)) this.x = x;
          if (!isNaN(y)) this.y = y;
        }
}


dudialex 07.07.2010 14:01

Спасибо большое.
 
Огромное спасибо что помогли.

Выкладываю код для будущих поколений.

В первом кадре нашей флеш
Код AS1/AS2:

stop ();
 
var b1= new Metka;
b1.add_metka("1","150","160");
 
var b2= new Metka;
b2.add_metka("2","250","100");


Файл Metka.as
Код AS1/AS2:

class Metka {
 
 public var testt:Number;
 public var container_mc:MovieClip;
 public var container_mc_kartinko:MovieClip;
 
        public function draw  ():Void
        {
                container_mc=_root.createEmptyMovieClip("myClip"+testt, testt);
 
                container_mc_kartinko=container_mc.createEmptyMovieClip("kartinko",1);
                container_mc_kartinko.loadMovie("1.png");
 
                this.container_mc.onPress = this.makeDelegate(this.mouseOverHandler);               
        }       
 
        private function makeDelegate(func:Function):Function
        {
                var context:Metka = this;
                return function():Object
                {
                        return func.apply(context, arguments);
                }
        }
 
 
        public function mouseOverHandler()
        {
            //  Тут будет происходить то что нужно при клике
                getURL("http://ya.ru","_blank");
                trace (testt);
        }
 
 
        //  Функция создает новый объект этого кдассаа
        public function add_metka(id,koor_x,koor_y)
        {
                testt=id;
                draw();
                koordinat(koor_x,koor_y);
        }
 
        //  Функция изменяем место пложение клипа
        public function koordinat(koor_x,koor_y)
        {
          if (koor_x){SetX(koor_x);}
          if (koor_y){SetY(koor_y);}
        }// - - -  --
 
        public function SetX(koor_x)
        {
                container_mc._x=koor_x;
        }// - - - - -
 
        public function SetY(koor_y)
        {
                container_mc._y=koor_y;
        }// - - -- - -
}



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

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