删除由类as3创建的Child

时间:2016-02-03 12:46:31

标签: actionscript-3 flash removechild

我已经为一个课程项目学习了AS3几个月,我所知道的大多数是通过查看其他问题在这里得到解决。

重点。

我有一个名为Generate的类,所以我将其导入到我的主时间轴,在该类中创建一个子并添加它。

现在我无法弄清楚如何删除它,它总是说它为空: " TypeError:错误#2007:参数child必须为非null。"

package  {

import MonsterOne;
import MonsterTwo;
import MonsterThree;
import MonsterFour;
import flash.display.*;

public class Generate extends MovieClip{

    public static var monsterID = String(monsterID);
    monsterID = Math.ceil(Math.random() * 4).toString();

    public function Generate(parent:Object){
        if (monsterID == 1){
            var monsOne:MonsterOne = new MonsterOne();
            monsOne.name = "monsterOne";
            parent.addChild(monsOne);
            monsOne.x = 100;
            monsOne.y = 200;
            trace("spawn1");
        }

这就是它的生成方式。 monsTwo有三个,四个和四个代码。相同的代码不同的名称这就是文件中的所有内容。

我已经尝试了各种方法来删除代码但总是出错并且没有实际移除孩子。

stage.removeChild(monsOne);
monsOne.parent.removeChild(monsOne);
removeChild(monsOne);

谁知道其他人。

我错过了什么或只是完全错了。

谢谢

- 编辑 -

if(o.monHP <= 0) {
    turnTimer.stop();
    turnTimer.removeEventListener(TimerEvent.TIMER, CounterA);
    var monsOne:MovieClip = getChildByName('monsterOne') as MovieClip;
    var monsTwo:MovieClip = getChildByName('monsterTwo') as MovieClip;
    var monsThree:MovieClip = getChildByName('monsterThree') as MovieClip;
    var monsFour:MovieClip = getChildByName('monsterFour') as MovieClip;
    parent.removeChild(monsOne);
    parent.removeChild(monsTwo);
    parent.removeChild(monsThree);
    parent.removeChild(monsFour);

    gotoAndStop('win');
}

我是如何试图将孩子移走的。

package  {

import MonsterOne;
import MonsterTwo;
import MonsterThree;
import MonsterFour;
import flash.display.*;

public class Generate extends MovieClip{

    public static var monsterID = String(monsterID);
    monsterID = Math.ceil(Math.random() * 4).toString();

    public function Generate(parent:Object){
        if (monsterID == 1){
            var monsOne:MonsterOne = new MonsterOne();
            monsOne.name = "monsterOne";
            parent.addChild(monsOne);
            monsOne.x = 100;
            monsOne.y = 200;
            trace("spawn1");
        }

        if (monsterID == 2){
            var monsTwo:MonsterTwo = new MonsterTwo();
            monsTwo.name = "monsterTwo";
            parent.addChild(monsTwo);
            monsTwo.x = 100;
            monsTwo.y = 200;
            trace("spawn2");
        }

        if (monsterID == 3){
            var monsThree:MonsterThree = new MonsterThree();
            monsThree.name = "monsterThree";
            parent.addChild(monsThree);
            monsThree.x = 100;
            monsThree.y = 200;
            trace("spawn3");
        }

        if (monsterID == 4){
            var monsFour:MonsterFour = new MonsterFour();
            monsFour.name = "monsterFour";
            parent.addChild(monsFour);
            monsFour.x = 100;
            monsFour.y = 200;
            trace("spawn4");
        }
    }
}

}  完整生成文件

2 个答案:

答案 0 :(得分:2)

你的代码有很多问题,要知道从哪里开始并不容易。您对显示列表和最重要的范围缺乏非常基本的了解。

显示清单:

当你做这样的事情时:

var monsOne:MovieClip = getChildByName('monsterOne') as MovieClip;
parent.removeChild(monsOne);

这可以被翻译为“不知道我在这里做什么”。为什么?因为代码意味着它期望名为“monsterOne”的DisplayObject存在于“this”(范围中的显示列表)的显示列表中,然后尝试从“父”中删除该对象。这没有任何意义,如果对象存在于显示列表A中,则将其从显示列表A中删除而不是从显示列表B中删除。

编程:

您正在使用镜像现有属性的变量和参数,例如:“parent”。你确定在你的编程水平上你可以把自己与这种危险的编程行为混淆吗?答案是否定的,不要镜像属性名称。

范围:

你一直在不断失去范围但是继续编写范围之类的代码甚至不存在。不要那么做。在一个范围内名为monsOne的变量在任何其他范围中都不存在。

更奇怪:

public static var monsterID = String(monsterID);
monsterID = Math.ceil(Math.random() * 4).toString();

你不知道这显然是什么,否则你不会这样做。

您的代码有什么作用?:

它创建一个和一个唯一的movieclip类型,每次创建它时,它给它完全相同的名称,并将其添加到我们一无所知的幻像“父”。然后,当你试图删除它时,你甚至不知道或记住这个幻影父母是什么,你不能真正使用getChildByName()要么你需要知道父母为了做到这一点,更糟糕的是那么多MovieClip可能在那里,并且都具有相同的名称。

如何解决?

当您询问有关如何解决问题的具体问题时,将在稍后填写此部分。

答案 1 :(得分:0)

Generate类只生成一个怪物。在gameOver函数中,您试图删除所有4个怪物,并且您会收到怪物不存在的错误。你应该添加条件:

if (monsOne) removeChild(monsOne);
if (monsTwo) removeChild(monsTwo);
if (monsThree) removeChild(monsThree);
if (monsFour) removeChild(monsFour);