Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   addEventListener (http://www.flasher.ru/forum/showthread.php?t=72932)

AlDev 07.12.2005 07:43

addEventListener
 
Господа, вот такая вот проблемка. Пишу код:
Код:

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

Цитата:

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

Потому что очень легко не просто не добавить новое куда надо, но и прибить старое. Подходы, использующие push/pop/shift технику гораздо безопаснее и спасают от головной боли.

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

Mokus 09.12.2005 12:21

Цитата:

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

Потому, что там должен ексепшн выскакивать еще когда ты только ссылаешся на несуществующий елемент массива, а если не выскакивает - то ето означает, что клас Array - кривой и ненадо под его кривизну самому изгибатся. И если такие мелкие ошибки в Бете не исправят, то работу с АС3 прийдется начинать с переписывания базовых классов...


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

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