PDA

Просмотр полной версии : Привязывание события к динамически создаваемым объектам


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;
}// - - -- - -
}

mooncar
07.07.2010, 11:38
Вот эта конструкция
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
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
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;
}// - - -- - -
}