as3 检查对象是否从舞台上移除

as3 check if an object is removed from the stage

这是我第一次在这个论坛上发帖,所以如果我做错了什么请告诉我。我正在尝试用 as3 制作游戏。在游戏中,您会看到一个代表颜色的单词。当您单击该块时,该块就会消失。问题是我如何检查该块是否在舞台上。因为尽管我单击该块并因此将其删除,但布尔值似乎并没有变为真。提前致谢

这是我所有的代码,所以我做了 8 个块,里面都有一个词(代表一种颜色)。我想要的是随机创建的单词与块中的那些单词相对应,如果您单击带有正确单词的块,您就赢了。所以问题主要是关于那篇被注释掉的文章

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.events.MouseEvent;
    import flash.utils.Timer;
    import flash.events.TimerEvent; 

    [SWF(backgroundColor = "0x000000")]

    public class Main extends Sprite 
    {
        public var blok:blokken = new blokken();
        public var blok2:blokken = new blokken();
        public var blok3:blokken = new blokken();
        public var blok4:blokken = new blokken();
        public var blok5:blokken = new blokken();
        public var blok6:blokken = new blokken();
        public var blok7:blokken = new blokken();
        public var blok8:blokken = new blokken();
        public var kleuren:Array = new Array("rood", "blauw", "geel", "groen");
        public var kleur:int = Math.floor(Math.random() * kleuren.length);
        public var tekstKleur:TextField = new TextField;
        public var grootheidswaanzin:TextFormat = new TextFormat();
        public var aanwezig:Boolean = true;
        public var tijdje:Timer = new Timer(15000,1);
        public var eindTekst:TextField = new TextField;

        public function Main() 
        {
            grootheidswaanzin.size = 25;

            tekstKleur.defaultTextFormat = grootheidswaanzin;
            tekstKleur.text = kleuren[kleur];
            tekstKleur.x = 415;       
            tekstKleur.y = 80;
            tekstKleur.textColor = 0xFFFFFF;
            addChild(tekstKleur);           

            eindTekst.x = 415;
            eindTekst.y = 200;
            eindTekst.textColor = 0xFFFFFF;
            eindTekst.text = "je faalt";
            eindTekst.defaultTextFormat = grootheidswaanzin;

            blok.x = 315;
            blok.y = 150;
            blok.naamTekst("rood");
            addChild(blok);

            blok2.x = 440;
            blok2.y = 150;
            blok2.naamTekst("rood");
            addChild(blok2);

            blok3.x = 315;
            blok3.y = 235;
            blok3.naamTekst("blauw");
            addChild(blok3);

            blok4.x = 440;
            blok4.y = 235;
            blok4.naamTekst("blauw");
            addChild(blok4);

            blok5.x = 315;
            blok5.y = 320;
            blok5.naamTekst("geel");
            addChild(blok5);

            blok6.x = 440;
            blok6.y = 320;
            blok6.naamTekst("geel");
            addChild(blok6);

            blok7.x = 315;
            blok7.y = 405;
            blok7.naamTekst("groen");
            addChild(blok7);

            blok8.x = 440;
            blok8.y = 405;
            blok8.naamTekst("groen");
            addChild(blok8);

            tijdje.addEventListener(TimerEvent.TIMER, vijfSecondenRegel);
            tijdje.start();
            /*if (blok.stage || blok2.stage) 
            {
                aanwezig = false;
            }else 
            {
                aanwezig = true;
                trace (aanwezig);
            }
            trace (aanwezig);

            if (kleuren[kleur] == "rood" && aanwezig == true) 
            {
                trace ("victory");
            }*/
        }

        public function vijfSecondenRegel(e:TimerEvent):void
        {
            removeEventListener(TimerEvent.TIMER,vijfSecondenRegel);

            removeChild(blok);
            removeChild(blok2);
            removeChild(blok3);
            removeChild(blok4);
            removeChild(blok5);
            removeChild(blok6);
            removeChild(blok7);
            removeChild(blok8);
            removeChild(tekstKleur);
            addChild(eindTekst);
        }
    }

}



package 
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.MouseEvent;
    import flash.text.TextFormat;

    public class blokken extends Sprite 
    {
        public var blokAchtergrond:Sprite = new Sprite;
        public var tekstInBlok: TextField = new TextField;
        public var TekstGrootte:TextFormat = new TextFormat();


        public function blokken()
        {
            blokAchtergrond.graphics.beginFill(Math.random() * 0xFFFFFF);
            blokAchtergrond.graphics.drawRect(0, 0, 120, 80);
            addChild(blokAchtergrond);

            TekstGrootte.size = 25; 
            tekstInBlok.defaultTextFormat = TekstGrootte;
            tekstInBlok.width = 120;
            tekstInBlok.height = 40;
            tekstInBlok.y = 40;
            tekstInBlok.x = 30;
            addChild(tekstInBlok);

            addEventListener(MouseEvent.MOUSE_DOWN, klikjes);
        }

        public function naamTekst(label:String):void 
        {
            tekstInBlok.text = label;
        }

        public function klikjes(e:MouseEvent):void 
        {
            removeChild(blokAchtergrond);
            removeChild(tekstInBlok);

        }
    }

}

您的问题是您在 class 的构造函数中设置了 aanwezig var(它只运行一次,甚至在任何显示树内容初始化之前)。因此,如果您以后不再次设置 var,该值将始终为 true

For the boolean var to change it's value, you have to have code that updates it

因此,在删除块的同时,您必须更新该布尔值:

removeChild(blok);
aanwezig = false; //or however you compute the value

也许你想做的行为不是普通变量(如果你想改变值就必须显式更新),创建一个 getter 函数:(getters/setters 就像一个变量,但每次访问时都使用一个函数来计算 return 值)

public function get aanwezig():Boolean {
    return !blok.stage && !blok2.stage 
}

然后当您执行以下操作时:trace(aanwezig) 如果这些对象都不在显示列表中,它将 return 为真。

此外,在您的 blokken class 中,您只是删除了块的子项,而不是块本身(所以 block2.stage 实际上仍然是真的,因为它仍在显示列表中,因为您只删除了它的子项)。

而不是做:

removeChild(blokAchtergrond);
removeChild(tekstInBlok);

执行此操作(将自身从其父项中删除)

if(parent){
    parent.removeChild(this);
}