【问题标题】:AS3: How to add child in a container?AS3:如何在容器中添加孩子?
【发布时间】:2013-04-25 03:17:50
【问题描述】:

我现在无法解决几个小时;(。我想在容器中添加一个孩子。这是我到目前为止所做的。所有问题都在 Creator 类中。这一行 par2.addChild(ship); //有效,但是这一行 par2.containerSDv.addChild(ship); //error:1119.

谢谢

    public class Main extends MovieClip
{
    private var containerSD:Container = new Container;
    private var ship:Ship2;

    public function Main()
    {
        // constructor code
        stage.addChild(containerSD);
        //ship = new Ship2;
        //containerSD.addChild(ship);

    }
}

.

    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;
    private var containerSDv:Container = new Container;

    public function Creator()
    {
        // constructor code
    }

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

}

.

【问题讨论】:

    标签: actionscript-3 containers addchild


    【解决方案1】:

    我认为您可能需要退后一步,重新评估您的整体设计和目标。

    考虑这种方法:

    public class Main extends MovieClip
    {
        private var container:Sprite = new Sprite;
        private var newShipButton:NewShipButton = new NewShipButton;
        private var creator:Creator;
    
        public function Main()
        {
            creator = new Creator;
            addChild(container);
            addChild(newShipButton);
    
            newShipButton.addEventListener(MouseEvent.CLICK, newShipButtonHandler);
    
        }
    
        private function newShipButtonHandler(e:MouseEvent):void
        {
            // shipStyle would be a MovieClip of the artwork for a given ship.
            var ship:Ship = creator.makeShip(shipStyle, speed, power, container);
            ship.x = Math.random() * 200;
            ship.y = Math.random() * 200;
        }
    
    }
    

    这里是一个 Creator 类的例子

    public class Creator
    {
    
        public function Creator()
        {
            // constructor code
        }
    
        public function makeShip(style:MovieClip, speed:Number, power:Number, container:MovieClip):Ship
        {
            var ship:Ship = new Ship(style);
            ship.speed = speed;
            ship.power = power;
            container.addChild(ship);
            return ship;
        }
    
    }
    

    我做了一些假设,比如你有一个 Ship 类将扩展一个 MovieClip/Sprite 并拥有艺术作品,并且你的 NewShipButton 类将扩展 SimpleButton 并拥有艺术作品。

    如果这不符合您的需求,请说明您正在尝试做的哪些不符合这个极其简单的设计。

    我看到您的许多帖子似乎使事情变得比实际需要的困难得多。也许有一个很好的理由,但如果是这样,请解释为什么上述方法不适用于您的目的。

    【讨论】:

    • 您好原型,非常感谢您的回答。我的比赛每分钟都在变化。我在制作游戏的同时训练我的技能和学习。您上面的方法没问题并且有效,但我需要使用我的 Creator 类,该类的功能是在舞台上显示传递的对象。我希望能够将任何movieClip 对象传递给Creator 类,它会为传递的对象添加一些属性(速度、大小)。我不完全确定,但这应该是组合类型的设计。但是,一切正常,我可以在舞台上添加任何传递的对象,但不能添加到容器中。
    • 为什么你不能只调用创建者类来给你一艘拥有你想要的属性的船?
    • 我已经更新了我的答案。它现在有一个 Creator 类。你可以明白我的意思。您甚至可以在 Creator 类中移动速度/功率或其他内容的定义,但这只是我所说的一个示例。
    • 给我发一封电子邮件到prototype.in.training@gmail.com,如果你有gmail并且我们可以聊天,我可以比在这里更快地帮助你。
    • 感谢原型,现在一切都清楚了,只有一件事:您从 Main 类添加孩子,我正在尝试从 Creator 类中执行此操作。我这样做错了吗?你的方法的优点和缺点是什么?
    【解决方案2】:

    如果我为容器命名并取消选中设置中的严格模式并且我的代码有效。我发现了有关 DisplayObjectContainer http://joshblog.net/2007/07/12/disabling-actionscript-3-strict-mode-in-flash-cs3/

    的非常有用的文章
        public class Creator extends MovieClip
    {
        private var ship:MovieClip;
        private var containerSDv:Container = new Container;
    
        public function Creator()
        {
            // constructor code
        }
    
        public function onCreator(par1:MovieClip, par2:Stage)
        {
            ship = par1;
            //par2.addChild(ship); //works
            par2.getChildByName("contain").addChild(ship); //error:1119
            ship.x = Math.random() * 200;
            ship.y = Math.random() * 200;
        }
    
    }
    

    .

        public class Main extends MovieClip
    {
        private var containerSD:Container = new Container;
        private var ship:Ship2;
    
        public function Main()
        {
            // constructor code
            stage.addChild(containerSD).name = "contain";
            containerSD.x = 0;
            containerSD.y = 0;
    
    
        }
    }
    

    【讨论】:

    • 如果我保留上面的所有内容并且不触摸严格模式(勾选)我收到错误 1061:1061:通过静态类型 flash.display 的引用调用可能未定义的方法 addChild :DisplayObject
    • 所以,基本上我认为编译器不知道我的容器是一个动态对象,我不知道如何告诉它。
    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2012-03-06
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多