PDA

Просмотр полной версии : addEventListener


AlDev
07.12.2005, 07:43
Господа, вот такая вот проблемка. Пишу код:

package
{
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.events.MouseEventType;
import flash.util.trace;

public class myApp extends Sprite
{
protected var b:Array;
public function myApp()
{
this.b = new Array();
for (var i:uint = 0;i<10;i++)
{
this.b[i] = new myButton();
this.b[i].x = 60*i;
this.b[i].y = 10;
this.b[i].addEventListener(MouseEventType.CLICK,this.onButtonClick);
this.addChild(this.b[i]);
}
}

protected function onButtonClick(evnt:MouseEvent):Void
{
trace ('onRelease called');
}
}

private class myButton extends SimpleButton
{
protected var downSprite:Shape;
protected var upSprite:Shape;

public function myButton()
{
this.downSprite = new Shape();
this.downSprite.graphics.lineStyle(2, 0x202020);
this.downSprite.graphics.beginFill(0x00FF00);
this.downSprite.graphics.drawRect(10, 10, 50, 50);

this.upSprite = new Shape();
this.upSprite.graphics.lineStyle(2, 0x202020);
this.upSprite.graphics.beginFill(0xFFFF00);
this.upSprite.graphics.drawRect(10, 10, 50, 50);

this.upState = upSprite;
this.overState = upSprite;
this.downState = downSprite;
this.useHandCursor = true;
this.hitTestState = this;
}
}
}


а проблемка в том, что событие срабатывает только для первого элемента в массиве.
Объясните, pls, почему? :confused:

Antares
07.12.2005, 09:26
Такие вещи изначально объявляются в конструкторе, а не n раз для каждого экземпляра ;)

AlDev
08.12.2005, 15:58
хм. а почему тогда событие всё-таки срабатывает только для первого? и почему оно вообще срабатывает?

Mokus
08.12.2005, 17:54
Ответ у тебя в блоге.
Между прочим конструкции типа
this.b[i] = new myButton();
ЗЛО.
так нехорошо в масив елементы добавлять... просто нехорошо... и некрасиво...
Если начал баловаться с АС3 - старайся отучатся от АС1 стиля программирования.

s_u_m_p
08.12.2005, 18:04
2 Mocus: а можно объснить подробно почему именно такой подход (добавление в массив) неправилен?

silin
08.12.2005, 19:53
Интересно, что кому-то еще кнопки в старом флеше не надоели, давай их и здесь мучать.., это я к тому, при всей неправильности такая же схема со спрайтом нормально работает:
package
{
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.events.MouseEventType;
import flash.util.trace;

public class myApp extends Sprite
{
protected var b:Array;
public function myApp()
{
this.b = new Array();
for (var i:uint = 0;i<10;i++)
{
this.b[i] = new myButton();
this.b[i].x = 60*i;
this.b[i].y = 10;
this.b[i].addEventListener(MouseEventType.CLICK,this.onButtonClick);
this.addChild(this.b[i]);
}
}

protected function onButtonClick(evnt:MouseEvent):Void
{
trace ('onRelease called');
}
}

private class myButton extends Sprite
{
public function myButton()
{
graphics.lineStyle(2, 0x202020);
graphics.beginFill(0x00FF00);
graphics.drawRect(10, 10, 50, 50);

}
}
}

Antares
08.12.2005, 20:33
2 Mocus: а можно объснить подробно почему именно такой подход (добавление в массив) неправилен?
Потому что очень легко не просто не добавить новое куда надо, но и прибить старое. Подходы, использующие push/pop/shift технику гораздо безопаснее и спасают от головной боли.

Но это не про АС3.

Mokus
09.12.2005, 12:21
2 Mocus: а можно объснить подробно почему именно такой подход (добавление в массив) неправилен?
Потому, что там должен ексепшн выскакивать еще когда ты только ссылаешся на несуществующий елемент массива, а если не выскакивает - то ето означает, что клас Array - кривой и ненадо под его кривизну самому изгибатся. И если такие мелкие ошибки в Бете не исправят, то работу с АС3 прийдется начинать с переписывания базовых классов...