Actionscript Массивы объектов? - PullRequest
       20

Actionscript Массивы объектов?

0 голосов
/ 19 декабря 2009

У меня есть класс с именем TextLink. Текст предназначен для нажатия, и он должен отправлять событие (о котором я пока не слишком обеспокоен) ... в настоящее время он просто печатает сообщение. Класс принимает x, y и строку для установки текста. Умер просто ... Но он вылетает из браузера.

Экземпляр звонков в основном:

package {
    import flash.display.Sprite;

    import nav.text.TextLink;

    public class test_array_of_objects extends Sprite
    {
        public function test_array_of_objects()
        {
            var ary:Array = new Array(5);
            var i:uint;
            var ty:uint;
            var tx:uint = 30;

            for(i=0; i<ary.length; i++)
            {
                ty = i * 20 + 20;   
                var tmp:TextLink = new TextLink(tx, ty, "some text" + i.toString());
                ary.push(tmp);
            }           
        }
    }
}

Класс:

package nav.text
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.external.ExternalInterface;

    public class TextLink extends Sprite
    {
        public var tf:TextField = new TextField();

        public function TextLink(tx:uint, ty:uint, tft:String)
        {   
            tf.text = tft;
            tf.x = tx;
            tf.y = ty;
            tf.autoSize = TextFieldAutoSize.LEFT;

            addChild(tf);
        }

        private function rollfunc(e:Event):void
        {
            ExternalInterface.call("console.log", "got a clicky");  
        }

        /*
        protected function rollfunc(e:Event):void
        {   //dispatch a custom event 
            dispatchEvent(new Event(Event.COMPLETE));   
        }
        */
    }
}

Вы заметите, что я закомментировал функцию rollfunc, потому что собирался добавить ее позже. То, что я хотел бы сделать здесь, - это отправить событие тому, кто слушает класс, чтобы я мог сделать что-то конкретное с событием нажатия на текст. Экземпляр будет определен вызовом addEventListener ().

Спасибо

Ответы [ 4 ]

3 голосов
/ 20 декабря 2009
for(i=0; i<ary.length; i++)
{
    ...
    ary.push(tmp);
}

Это бесконечный цикл. ary.push() будет увеличиваться ary.length на каждой итерации, и i никогда не сможет его догнать.

Я думаю, вы хотите второе предложение @ outis здесь; т.е. ary[i] = tmp

Или просто создайте пустой массив и вставьте в него вещи.

1 голос
/ 19 декабря 2009

ary[i] - это неопределенный элемент массива ary, поэтому ary[i].push выдаст исключение. Вы, вероятно, хотите либо:

ary.push(tmp);

или

ary[i] = tmp;

но я не могу сказать наверняка, поскольку вы не сказали, какое поведение вы получаете, вы просто заявили, что код «не будет работать».

1 голос
/ 19 декабря 2009

У вас есть несколько проблем, которые могут привести к сбою вашего фрагмента. Использование ary[i].push(tmp) является неправильным. Выполнение этого предполагает, что ary[i] сам по себе является другим массивом, который вы будете выдвигать (добавляя) Лично я бы не стал использовать uint таким же образом, как обычную практику. Это на самом деле медленнее, чем int и здесь не имеет смысла. Кроме того, вместо создания массива определенной длины, я буду использовать константы, как показано ниже. Массивы являются изменяемыми, поэтому длина не имеет значения, но это просто стилистическая проблема.

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        private static const NUM_SPRITES:int = 15;

        private var ary:Array;

        public function Test()
        {
            var i:int;
            var ty:int;
            var tx:int = 30;

            ary = [];

            for(i=0; i<NUM_SPRITES; i++)
            {
                ty = i * 20 + 20;
                var tmp:Sprite= new Sprite();
                tmp.addEventListener(MouseEvent.CLICK, handleClick);
                tmp.graphics.beginFill(0xFF0000);
                tmp.graphics.drawRect(0,0,20,20);
                tmp.x = tx;
                tmp.y = ty;
                addChild(tmp);
                ary.push(tmp);
            }
        }

        public function handleClick(event:MouseEvent):void
        {
            for each(var spr:Sprite in ary)
            {
                if(spr == event.target)
                    trace(spr.x, spr.y);
            }
        }
    }
}
0 голосов
/ 19 декабря 2009

Я вижу, что вы "обновляете" объект TextLink, но ничего не делаете с ним.

Вы хотели добавить это в массив 'ary'?

В существующем состоянии вы создаете этот новый экземпляр, и он выходит из области видимости при повторении цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...