Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего (http://www.flasher.ru/forum/showthread.php?t=188806)

PasserBy 06.12.2012 21:01

Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего
 
Режим отладки
Код:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
        at flash.display::DisplayObjectContainer/removeChild()
        at src::Bullet/clearBullet()[E:\FlashWorks\FerdnProject\src\Bullet.as:69]
        at src::Enemy/delBullets()[E:\FlashWorks\FerdnProject\src\Enemy.as:90]

Код AS3:

package src {
        import flash.display.Sprite;
        import flash.display.Graphics;
        import flash.display.Shape;
        import flash.display.MovieClip;
        import flash.events.Event;
    import flash.events.MouseEvent;
 
        public class Bullet extends MovieClip{
        private var speedx:Number = 0;
        private var speedy:Number = 0;
        private var DEFAULT_BUL_SIZE:int = 6;
        private var DEFAULT_LIFE:int = 150; //Количество фремов к-е будет жить пуля
        private var DEFAULT_COLOR:uint = 0xFFCC66;
        private var TAKE_POSITIONX:int;
        private var TAKE_POSITIONY:int;
        private var BULLET:*;
 
                public function Bullet(TAKE_X:int, TAKE_Y:int) {
                        var bullet:Sprite = new Sprite();
                        BULLET = bullet;
                        TAKE_POSITIONX = TAKE_X;
                        TAKE_POSITIONY = TAKE_Y;
                        bullet.graphics.lineStyle(0,DEFAULT_COLOR,0);
                        bullet.graphics.beginFill(DEFAULT_COLOR, 1);
                        bullet.graphics.drawRect(TAKE_POSITIONX, TAKE_POSITIONY, DEFAULT_BUL_SIZE, DEFAULT_BUL_SIZE);
                        bullet.graphics.endFill();
                        addChild(BULLET);
 
                        addEventListener(Event.ADDED, funcAttack);
                        addEventListener(Event.ENTER_FRAME, polet);
                }
 
                private function funcAttack(event:Event):void{
                        this.x += DEFAULT_BUL_SIZE/2;
                        this.y += DEFAULT_BUL_SIZE/2;
 
                        var xc:Number = mouseX - TAKE_POSITIONX;       
                        var yc:Number = mouseY - TAKE_POSITIONY;
                        var tan:*;
                        var ugol:*;
 
                        if(mouseX > TAKE_POSITIONX){
                                tan = yc/xc;
                                ugol = Math.atan(tan)*57;
                        }
                        if(mouseX < TAKE_POSITIONX){
                                tan = yc/xc;
                                ugol = Math.atan(tan)*57;
                        }
 
                        if(mouseX > TAKE_POSITIONX){
                                speedx = 7*Math.cos(ugol*(Math.PI/180));
                                speedy = 7*Math.sin(ugol*(Math.PI/180));
                        }
 
                        if(mouseX < TAKE_POSITIONX){
                                speedx = -7*Math.cos(ugol*(Math.PI/180));
                                speedy = -7*Math.sin(ugol*(Math.PI/180));
                        }
                }       
 
                private function polet(e:Event):void{
                        this.x += speedx / 2;
                        this.y += speedy / 2;
                }
 
                public function clearBullet():void{
                        removeChild(BULLET); //69 СТРОКА ЗДЕСЬ
 
                        removeEventListener(Event.ADDED, funcAttack);
                        removeEventListener(Event.ENTER_FRAME, polet);
                }
        }
}

Я таки не пойму в чем проблема, в иных классах removeChild работает вне функции где был addChild

GBee 06.12.2012 21:21

Вроде все хорошо, не считая некоторых моментов. Мой диагноз - множественный вызов clearBullet().

inozemcev 06.12.2012 21:26

Код AS3:

removeChild(BULLET); //69 СТРОКА ЗДЕСЬ

Поменяй на
Код AS3:

if(contains(BULLET)) removeChild(BULLET);

в иных классах removeChild работает вне функции где был addChild - ты заблуждаешься. Если объекта нет в списке отображения эта ошибка будет возникать всегда. Для уточнения есть ли объект в списке есть функция contains

PasserBy 06.12.2012 21:32

Цитата:

Сообщение от inozemcev (Сообщение 1108222)
Код AS3:

removeChild(BULLET); //69 СТРОКА ЗДЕСЬ

Поменяй на
Код AS3:

if(contains(BULLET)) removeChild(BULLET);

в иных классах removeChild работает вне функции где был addChild - ты заблуждаешься. Если объекта нет в списке отображения эта ошибка будет возникать всегда. Для уточнения есть ли объект в списке есть функция contains

Помогло, спасибо.

Но что значит вне класса?...
addChild и removeChild прописаны в одном классе, или же Вы имеете ввиду, что вызов removeChild из других классов провоцирует "сторонний" вызов removeChild?

GBee 06.12.2012 21:32

contains хитрая функция. В некоторых случаях ошибка сохранится

СлаваRa 06.12.2012 21:42

"гарантированная" конструкция

Код AS3:

if (this._bullet && this._bullet.parent === super) {
        super.removeChild(this._bullet);
}


inozemcev 06.12.2012 21:43

GBee дал правильный диагноз - множественный вызов clearBullet(), а точнее ты методом clearBullet() пытался убрать объект которого уже не было в списке отображения.

СлаваRa 06.12.2012 21:50

я только по этому и написал, с моим подходом ошибок в подобных ситуациях не возникнет.

PasserBy 06.12.2012 21:59

Цитата:

Сообщение от inozemcev (Сообщение 1108228)
GBee дал правильный диагноз - множественный вызов clearBullet(), а точнее ты методом clearBullet() пытался убрать объект которого уже не было в списке отображения.

Спасибо, это вероятнее всего.

Цитата:

Сообщение от СлаваRa (Сообщение 1108230)
я только по этому и написал, с моим подходом ошибок в подобных ситуациях не возникнет.

Не могли бы Вы объяснить свой код?

FlashRus 07.12.2012 09:09

А что тут объяснять то?
Проверили, если вообще _bullet и сранили его родителя с super (только не пойму, почему не с this). Логично, что если parent равен super'у, то это значит что _bullet лежит на сцене и его можно removeChild.


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

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