Форум 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=206867)

lesnoj 10.03.2014 21:03

Удаление объекта при клике по нему
 
Приветствую всех.
Я новичок и это мой первый пост на форуме.

Столкнулся с задачей, для которой нашел на форуме решение: Удалить объект из массива по клику на него на сцене - http://www.flasher.ru/forum/showthread.php?t=206342

Немного изменив код под себя, столкнулся с ошибкой:
Код:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
at flash.display::DisplayObjectContainer/removeChild()
at Main/mouseClickHandler()

Вроде все работает за исключением удаления объектов.

Привожу код:

Код AS3:

package {
 
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
 
        public class Main extends MovieClip        {
 
                var objectList:Array = new Array();
 
                public function Main() {
                        var A:a = new a();
                        objectList.push(A);
                        addChild(A);
                        A.x = 0;
                        A.y = 0;
 
                        var B:b = new b();
                        objectList.push(B);
                        addChild(B);
                        B.x = 150;
                        B.y = 0;
 
                        var C:c = new c();
                        objectList.push(C);
                        addChild(C);
                        C.x = 300;
                        C.y = 0;
 
                        stage.addEventListener(MouseEvent.CLICK, mouseClickHandler);
                }
 
                function mouseClickHandler(event:MouseEvent) {
                        var currObj:MovieClip = event.target as MovieClip;
                        if (currObj) {
                                removeChild(currObj);
                                objectList.splice(objectList.indexOf(currObj), 1);
                        }
                }
 
        }
 
}


alexandrratush 11.03.2014 01:24

Скорее всего у вас есть вложенные визуальные элементы, которые реагируют на мышь, внутри ваших A B C.
Попробуйте написать:
Код AS3:

A.mouseChildren = false;


Godwarlock 11.03.2014 02:52

Код AS3:

function mouseClickHandler(event:MouseEvent) {
                        var currObj:MovieClip = event.target as MovieClip;
                        if (currObj) {
                              stage.removeEventListener(MouseEvent.CLICK, mouseClickHandler);
                                removeChild(currObj);
                                objectList.splice(objectList.indexOf(currObj), 1);
                        }
                }

Не уверен, но когда у меня была подобная проблема, я удалял слушатель и объект. В итоге объект удалялся без ошибок

lesnoj 13.03.2014 11:00

Работает со следующим кодом:
Код AS3:

function mouseClickHandler(event:MouseEvent) {
        var currObj:MovieClip = event.target as MovieClip;
        if (currObj) {
                var displayObject:DisplayObject = (DisplayObject) (event.target);
                displayObject.parent.removeChild(displayObject);
                objectList.splice(objectList.indexOf(currObj), 1);
        }
}

Добавлено через 6 минут
Так же работают все предложенные варианты. Спасибо.

Isfet 13.03.2014 11:23

не понятно только зачем 2 раза делать преобразование типов, и по хорошему нужно знать родителя, чтобы не было такой записи
Код:

currObj.parent
Код AS3:

function mouseClickHandler(event:MouseEvent) {
        var currObj:MovieClip = event.target as MovieClip;
        if (currObj) {
 
                currObj.parent.removeChild(currObj);
                objectList.splice(objectList.indexOf(currObj), 1);
        }
}


caseyryan 13.03.2014 12:10

Цитата:

Код AS3:

var displayObject:DisplayObject = (DisplayObject) (event.target);


Что это за хрень? ) В ас3 приведение к типу делается не так, а так:
Код AS3:

var displayObject:DisplayObject = event.target as DisplayObject;


lesnoj 13.03.2014 16:24

Подскажите, какие корректировки нужно внести, чтобы вместо удаления, происходило проигрывание анимации MC, по которому был совершен клик? И если будет не трудно, то прокомментируйте пожалуйста каждую строку подробно.

Код AS3:

function mouseClickHandler(event:MouseEvent) {
        var currObj:MovieClip = event.target as MovieClip;
        if (currObj) {
                var displayObject:DisplayObject = event.target as DisplayObject;
                displayObject.parent.removeChild(displayObject);
        }
}

Я только начал изучать AS3, но такое ощущение, что чем больше узнаю, тем меньше понимаю. Вроде немного с php знаком и jQuery ежедневно использую в работе, но AS3 с его классами и списком отображения до сих пор для меня остается неприступной крепостью :) Такое ощущение что не хватает ни конкретного, а обобщенного понимания, как в нем все устроено.

caseyryan 13.03.2014 16:38

Код AS3:

function mouseClickHandler(event:MouseEvent) {
      if (event.target is MovieClip) { // проверяем, чтобы объект был действительно мувиклипом
          var currObj:MovieClip = event.target as MovieClip;
          currObj.gotoAndPlay(0); // переходим в первый кадр и начинаем проигрывание
      }
}


lesnoj 13.03.2014 17:34

  1. caseyryan, данный код не работает.
    Код AS3:

    package {
            import flash.display.MovieClip;
            import flash.events.MouseEvent;
            import flash.display.DisplayObject;
     
            public class Main extends MovieClip        {               
                    public function Main() {
                            var A:a = new a();
                            addChild(A);
                            A.x = 0;
                            A.y = 0;
     
                            var B:b = new b();
                            addChild(B);
                            B.x = 150;
                            B.y = 0;
     
                            var C:c = new c();
                            addChild(C);
                            C.x = 300;
                            C.y = 0;
     
                            stage.addEventListener(MouseEvent.CLICK, mouseClickHandler);
                    }
     
                    function mouseClickHandler(event:MouseEvent) {
                            if (event.target is MovieClip) {
                                    var currObj:MovieClip = event.target as MovieClip;
                                    currObj.gotoAndPlay(0);
                            }
                    }
     
            }
     
    }

  2. Код AS3:

    if (event.target is MovieClip) { // проверяем, чтобы объект был действительно мувиклипом

    А как он может не быть мувиклипом, если слушатель установлен на мувиклип? Или данная проверка это чтото вроде правил хорошего тона в AS3?
  3. Код AS3:

    var currObj:MovieClip = event.target as MovieClip;

    Если я правильно понимаю, тут создается ссылка на объект по которому был совершен клик. Нельзя ли к нему обратиться напрямую по имени экземпляра? Ведь с ним есть связь через слушатель и нам в конце концов известно его имя:
    Код AS3:

    var A:a = new a();

  4. Есть ли возможность вывести некую визуальную карту объектов в списке отображения и их связей? Например как это делается с массивами в php:
    Код:

    var_dump()
    или
    Код:

    print_r()

caseyryan 13.03.2014 20:04

Цитата:

А как он может не быть мувиклипом, если слушатель установлен на мувиклип?
stage - это не мувиклип. Мувиклипом у вас является документ класс, который лежит на стейдж. Большинство новичков путаются в этом, и часто считают что методы addChild() addEventListener() и т.д. равнозначны stage.addChild(), stage.addEventListener() ... Хотя на самом деле они эквивалентны этому this.addChild(), this.addEventListener()...
Цитата:

Если я правильно понимаю, тут создается ссылка на объект по которому был совершен клик. Нельзя ли к нему обратиться напрямую по имени экземпляра? Ведь с ним есть связь через слушатель и нам в конце концов известно его имя:
Нет, нельзя. Имя это условность. В данном случае A (кстати это моветон, писать названия переменных с большой буквы, а названия классов с маленькой, надо наоборот) не является именем объекта, как это происходит с instance name во flash ide. Это название переменной, причем локальной, доступной только в конструкторе Main. В обработчике mouseClickHandler к ней уже нет никакого доступа.

Цитата:

Есть ли возможность вывести некую визуальную карту объектов в списке отображения и их связей? Например как это делается с массивами в php:
нет

Цитата:

caseyryan, данный код не работает.
А так?
Код AS3:

stage.addEventListener(MouseEvent.CLICK, mouseClickHandler, true);



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

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