【问题标题】:AS3: How can I add a children (instance) on stage every time I press the button without replacing the existing children?AS3:如何在每次按下按钮时在舞台上添加一个孩子(实例)而不替换现有的孩子?
【发布时间】:2013-04-17 07:59:50
【问题描述】:

如何在每次按下按钮时在舞台上添加一个孩子(实例)而不替换现有的孩子?

我有四个类:Symbol1、Symbol3、Symbol4、all。

当我按下按钮 Symbol3 时,我想通过 all.as 类在舞台上创建 Symbol1 的实例。使用 Symbol4,我想按照舞台上的创建顺序删除其中一个创建的实例。 示例:我已经按了三下 Symbol3,并在舞台上创建了三个 Symbol1 实例。现在,如果我按 Symbol4,我将删除第一个创建的实例。如果我再按一次 Symbol4,我将删除第二个创建的实例。

    public class Symbol3 extends SimpleButton
{
    private var creator:all;
    private var child:Symbol1 = new Symbol1  ;
    private var child2:Symbol1 = new Symbol1  ;
    private var child3:Symbol222 = new Symbol222  ;

    public function Symbol3()
    {
        addEventListener(MouseEvent.CLICK, onCLICK);
    }

    private function onCLICK(s:MouseEvent)
    {
        creator = new all(child);
        stage.addChild(creator);
    }
}

.

    public class all extends MovieClip
{
    private var _thief1:MovieClip;

    public function all(par1:MovieClip)
    {
        _thief1 = par1;
        addEventListener(Event.ADDED_TO_STAGE, onADDED_TO_STAGE);
    }

    private function onADDED_TO_STAGE(e:Event)
    {
        removeEventListener(Event.ADDED_TO_STAGE, onADDED_TO_STAGE);
        this.addChild(_thief1);
        _thief1.x = Math.random() * 200;
        _thief1.y = Math.random() * 200;
    }
}

.

    public class Symbol4 extends SimpleButton
{
    public function Symbol4()
    {
        addEventListener(MouseEvent.CLICK, onCLICK);
    }

    private function onCLICK(s:MouseEvent)
    {
        stage.removeChild(?);
    }
}

这是我到目前为止。 谢谢

【问题讨论】:

  • 尝试返回值创建者,然后调用它(stage.removeChild(creator)) 并导入文件。
  • 我鼓励你使用有意义的变量名,因为Symbol3Symbol4 相当模糊,让你的代码晦涩难懂。 CreateButton 怎么样? DeleteButton ? all 也是类名的模糊选择。
  • 感谢您的回答。这只是我快速制作的一个例子。如果您对逻辑有一些想法,我将不胜感激。谢谢

标签: actionscript-3 replace instance removechild addchild


【解决方案1】:

您应该将所有可添加/可移除的精灵放在同一个容器中,我们称之为container。 然后添加按钮将如下所示:

private function onCLICK(s:MouseEvent)
{
    container.addChild(new all(new Symbol1()));
}

还有移除按钮:

private function onCLICK(s:MouseEvent)
{
    container.removeChildAt(0);
}

当移除第 0 层的孩子时,其他孩子会往下一层,下一个要移除的孩子会来到 0。

【讨论】:

  • 感谢您的回答。我明白了你的意思,但如果不替换现有的孩子,我仍然无法创建另一个孩子!?每次我按下按钮创建一个孩子时,现有的孩子就会消失。
  • 我基本上希望每次按下按钮都有新的孩子出现在舞台上。
  • 问题在于您没有重新实例化“子”MovieClip(然后称为 par1,然后称为 _thief1)。我编辑了我的答案。
【解决方案2】:

感谢科迪亚克的帮助!

我终于成功了。我不确定这是否是正确的方法,但至少它有效。

我有三个班级: AddChild2.as - 链接到 Button 创造者.as Ship2.as - 与 MovieClip 的链接

棘手的时刻是必须将阶段作为参数传输以避免错误:1009。另一种认为是Creator的空构造函数,它使代码更加灵活和独立。现在Creator 可以生成任何通过的movieClip。我再次相信还有另一种更好的方法可以做到这一点,因此欢迎任何改进。


    public class AddChild2 extends SimpleButton
{
    private var creatorche:Creator = new Creator;
    private var s:Ship2;

    public function AddChild2()
    {
        // constructor code
        addEventListener(MouseEvent.CLICK, onCLICK)
    }

    private function onCLICK(e:MouseEvent)
    {
        s = new Ship2;
        creatorche.onCreator(s, stage);
    }
}

.

    public class Creator extends MovieClip
{
    private var ship:MovieClip;

    public function Creator()
    {
        // constructor code
    }

    public function onCreator(par1:MovieClip, par2:Stage)
    {
        ship = par1;
        par2.addChild(ship);
        ship.x = Math.random() * 200;
        ship.y = Math.random() * 200;
    }

}

.

    public class Ship2 extends MovieClip
{


    public function Ship2()
    {
        // constructor code
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多