•  
  • 0
  •  
0

Удаление eventListeners после прохода через for

Знатоки флеша и Action Script, помогите решить задачку... Картинки в игру добавляются динамически, из данных в XML-файле. Таким же образом добавляются и клетки для них, в которые эти самые картинки нужно перетащить. Поскольку количество используемых картинок на каждом уровне произвольно и берется через FOR, путём подсчета соответствующих веток в XML-коде столкнулся с проблемой того, что при переходе на другой фрейм или новом старте не получается убрать event listeners. Проблема связана с динамическим добавлением картинок. После добавления через for, максимум что получается, так это убрать последнюю из добавленных картинок. Помогите решить задачу.

//loading xml and images and adding them on the stage
    function fileLoaded(event:Event):void {
        myXML=XML(event.target.data);
        trace(myXML.game[trueGame].images.image);
        xmlList=myXML.game[trueGame].images.image;

               // Adding cells for puting images into them
            for (var k:int=0; k<xmlList.length(); k++) {
        window=new UILoader();
        window.x=(100*k)+20*k+50;
        window.y=250;
        window.source=xmlList[k].attribute("window");
        window.name="window"+k;
        allBoxesNames[boxNum]=window.name;
        boxNum++;
        stage.addChild(window);
    }

            // Adding draging images to stage
            for (var i:int=0; i<xmlList.length(); i++) {
        placeId[i]=xmlList[i].attribute("place");
        trace(placeId[i]);
        loadPic= new UILoader();
        loadPic.x=100*(i+1);
        loadPic.y=400;
        loadPic.source=xmlList[i].attribute("name");
        loadPicArray[i]=loadPic;
        loadPic.name="loadPic"+i;
        allNames[number]=loadPic.name;
        number++;
        loadPic.addEventListener(MouseEvent.MOUSE_DOWN, drag);
        loadPic.addEventListener(MouseEvent.MOUSE_UP, drop);
        loadPic.addEventListener(MouseEvent.MOUSE_UP, hitCheck);
        trace(stage.addChild(loadPic));
        stage.addChild(loadPic);
    }
AS3, Action Script, Flash, xml.
спросил 930 дней назад Аватор пользователя ArMikael ArMikael
296 16
изменил 930 дней назад Аватор пользователя ArMikael ArMikael
296 16
300

3 ответа:

    •  
    • 1
    •  

    Почему только последнюю? Я вижу в коде массив loadPicArray, судя по всему глобальный. Тогда может как-то так?

    function removePictListeners():void 
    {
        for (var i:int = 0; i < loadPicArray.length; i++)
        {
            loadPicArray[i].removeEventListener(MouseEvent.MOUSE_DOWN, drag);
            loadPicArray[i].removeEventListener(MouseEvent.MOUSE_UP, drop);
            loadPicArray[i].removeEventListener(MouseEvent.MOUSE_UP, hitCheck);
        }
    }
    

    И вызывать это в тех местах, где нужно почистить лисенеры?

    А вообще, в давно начавшуюся эпоху AS3 код во фреймах - архаичное зло, за которое нужно больно бить по рукам.

    Вики-ответ
    изменил 930 дней назад Аватор пользователя void void
    191 11
    •  
    • 1
    •  

    Ну если разумных людей, то никого лучше Колина Мука предложить не могу. Его книги Essential ActionScript 3.0 вполне достаточно, чтобы понять все фишки AS3. А их там, по сравнению с AS2, много. В частности, вместо кадров код пишется в классах. Точка входа - конструктор класса документа (говорю о Flash, во Флексе ещё не копался).

    Если надо, могу написать статейку небольшую, в которой будут показаны основы обращения с AS3 во Flash.

    ответил 929 дней назад Аватор пользователя void void
    191 11
    •  
    • 0
    •  

    Снова я всё напутал. Проблема была не с удалением event listeners, а как раз с удалением самих динамических объектов... Картинки и ячейки для них, которые мы взяли из XML и закинули на уровень с помощью "For".

    var delPic:Object;
    
    function removeAllListener():void {
        //urlLoader.removeEventListener(Event.COMPLETE,fileLoaded);
        for (var x:int=0; x<loadPicArray.length(); x++) {
            //trace(loadPicArray[x]);
            var delPic:Object=loadPicArray[x];
            //this.parent.removeChild(this.parent.parent);
            if (delPic != null) {
                delPic.parent.removeChild(delPic);
            }
        }
    }
    

    Не хочет паразит убирать их и всё.

    А можно поподробней о кодинге вне фреймов? Где же тогда можно ещё писать код? Расскажите, как сегодня принято работать. Мы в процессе освоения Action Scripta, поэтому пока не поздно, готовы впитывать любую полезную информацию и внимать речам разумных людей.

    ответил 929 дней назад Аватор пользователя ArMikael ArMikael
    296 16
Чтобы написать ответ, вы должны авторизироваться.