Просмотр полной версии : Привязывание события к динамически создаваемым объектам
dudialex
07.07.2010, 11:24
AS2
Привет. Нужна помощь вот в чём.
У нас есть динамически создаваемые объекты, например точки и каждая точка имеет свою координату, своё название и свою ссылку.
Как привязать событие, которое происходит при нажатие на точку. Может кто нибудь выложит весь код. ни как не могу понять как привязать клик по точке и чтоб нить произошло, пытался пользоваться addEventListener - не могу понять как он работает и как обрабатывать.
Выкладываю код класса
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;
}// - - -- - -
}
Вот эта конструкция
container_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
вроде из AS3, а не AS2.
Вам скорее всего onRollOver нужно использовать.
И потом, как только вы загрузите контент в container_mc, все обработчики его событий слетят.
Вот тема была буквально недавно: http://www.flasher.ru/forum/showthread.php?t=141869
Решения там тоже есть.
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
Можно прокомментрировать или принцип как это работает описать
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
Огромное спасибо что помогли.
Выкладываю код для будущих поколений.
В первом кадре нашей флеш
stop ();
var b1= new Metka;
b1.add_metka("1","150","160");
var b2= new Metka;
b2.add_metka("2","250","100");
Файл Metka.as
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;
}// - - -- - -
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.