Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание функций в цикле (http://www.flasher.ru/forum/showthread.php?t=196248)

HorusWM 21.03.2013 13:37

Создание функций в цикле
 
Есть цикл в котором создаются кнопки, по нажатию каждой из которых должен запускаться соответствующий ей метод.
пример цикла:
Код AS3:

var i:int;
 
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.handler = function():void
                      {
                          trace(btn.id);
                      }
}

На примере этого цикла каждой кнопке присваивается id, соответствующий i и мне нужно выводить при нажатии на нее ее id, но при нажатии на любую кнопку всегда выводится номер 9 (последний).
Помогите, пожалуйста, сделать корректное создание хендлеров с выводом идентификатора его кнопки.

bav 21.03.2013 13:51

Анонимные функции – зло. Создайте одну функцию.
Код AS3:

function buttonHandler(e:MouseEvent):void
{
  var btn:UIButton = e.target as UIButton;
  if (bth)
    trace(btn.id);
}
 
var i:int;
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.addEventListener(MouseEvent.CLICK, buttonHandler);
}


HorusWM 21.03.2013 13:59

Цитата:

Сообщение от bav (Сообщение 1126167)
Анонимные функции – зло. Создайте одну функцию.
Код AS3:

function buttonHandler(e:MouseEvent):void
{
  var btn:UIButton = e.target as UIButton;
  if (bth)
    trace(btn.id);
}
 
var i:int;
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.addEventListener(MouseEvent.CLICK, buttonHandler);
}


Согласен, стараюсь никогда не использовать подобный способ, но слушатели мне не подходят - движок растровый и все рисуется в одну битмапу, как следствие слушатели ни на что не повесить. Хотя, вы натолкнули меня на одну идею - проверять объект, находящийся под курсором, за это спасибо)

caseyryan 21.03.2013 14:02

Цитата:

движок растровый и все рисуется в одну битмапу, как следствие слушатели ни на что не повесить.
Собственно, чем тогда вообще помогут эти кнопки?
Не может быть того, чтобы кнопки можно было нажать мышью, но при этом нельзя было повесить никаких слушателей. По-моему только с SimpleButton какая-то фигня подобная

HorusWM 21.03.2013 14:09

Цитата:

Сообщение от caseyryan (Сообщение 1126170)
Собственно, чем тогда вообще помогут эти кнопки?
Не может быть того, чтобы кнопки можно было нажать мышью, но при этом нельзя было повесить никаких слушателей. По-моему только с SimpleButton какая-то фигня подобная

Кнопки наследуются от общего класса объектов, который не наследуется от классов экранных объектов, а лишь хранит информацию о массиве пикселей, которые идут в отрисовку, позиции, где их рисовать, порядке отрисовки, bound-бокса объекта и т.п. А слушатель можно повесить только на дисплей обджект, насколько я помню. Чем помогут? На мой взгляд copyPixels самый быстрый способ отрисовки, во всяком случае спрайты и мувиКлипы у меня сильно грузили сцены.

silin 21.03.2013 14:42

я тоже не понял прикола с невозможнстью повесить мышиные слушатели при том, что 'нужно выводить при нажатии на нее ее id'
по сути вопроса в этом анонимном handler'е видна var btn:UIButton, которая после отработки цикла естественно указывает на последний, а нужна ссылка на конкретный экземпляр
т.е. если нужен изврат с определением handler именно в цикле, то как-то так это может быть
(это только для посмотреть, здесь конечно логичнее этот handler в самом UIButton и определить)
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var i:int;
 
                        for (i = 0; i < 10; i++)
                        {
                                var btn:UIButton;
 
                                btn = new UIButton();
                                btn.id = i;
                                btn.y = i * 25;
                                addChild(btn);
                                btn.handler = function():void
                          {
                                  trace("this.id: " + UIButton(this).id);
                                  trace("btn.id: " + btn.id);
                          }
                        }
                        // чтобы как-то посмотреть работу btn.handler
                        this.addEventListener(MouseEvent.CLICK, this_click);
                }
 
                private function this_click(e:MouseEvent):void
                {
                        var btn:UIButton = e.target as UIButton;
                        btn.handler();
                }
 
        }
 
}
import flash.display.Sprite;
class UIButton extends Sprite
{
        public var id:int;
        public var handler:Function;
        public function UIButton()
        {
                graphics.beginFill(0x0);
                graphics.drawRect(0, 0, 60, 20);
 
        }
}


AlexLucas 21.03.2013 14:43

А на клик вы водписываете stage или другой контейнер, и потом смотрите где клик упал, и именно тот объект который находится под курсором и ловит его ?

in4core 21.03.2013 14:44

Цитата:

Анонимные функции – зло
А вы вкурсе, что в той же джаве - анонимные функции используются так же охотно, как и методы класса? Кроме того, есть еще и анонимные классы - которые тоже используются на ура!
Так кто же прав, когда GC одинаков почти в этих 2х языках?

HorusWM 21.03.2013 14:47

silin, я описал почему нет возможности - мои объекты не являются наследниками экранных объектов флеша, они все просто набор информации о пикселях и в каком месте их рисовать в общем битмап-листе, выводимом на экран. Да, я жертвую слушателями (хотя, редко когда они действительно мне нужны) взамен скорости.

Цитата:

Сообщение от AlexLucas (Сообщение 1126179)
А на клик вы водписываете stage или другой контейнер, и потом смотрите где клик упал, и именно тот объект который находится под курсором и ловит его ?

Именно так и сделал, AlexLucas )
Цитата:

Сообщение от HorusWM
Хотя, вы натолкнули меня на одну идею - проверять объект, находящийся под курсором, за это спасибо)


AlexLucas 21.03.2013 15:03

А если объекты накладываются друг на друга, как вы вычислите кто ловит событие ?


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

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