在 vanilla ActionScript 3 的嵌套 children 上无法调用 addChild() 来执行任何操作

Having trouble getting calls to addChild() on nested children in vanilla ActionScript 3 to do anything

假设以下代码:

package 
{
    import somenamespace.Button;

    import flash.display.*;
    import flash.events.Event;
    import flash.text.TextField;

    public final class Main extends Sprite
    {
        public function Main()
        {           
            stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
            function init(pEvent:Event = null):void {
                // support autoOrients
                stage.align = StageAlign.TOP_LEFT;
                stage.scaleMode = StageScaleMode.NO_SCALE;
                removeEventListener(Event.ADDED_TO_STAGE, init);


                /*var btn:Button = new Button(0, 0, 400, 400)
                addChild(btn);*/

                var sprite:Sprite = new Sprite();
                sprite.width = 400;
                sprite.height = 400;
                addChild(sprite);



                var label2:TextField = createCustomTextField(sprite, 0, 50, 200, 20);
                label2.text = "Drag to select some of this text.";
            }
        }

        private function createCustomTextField(sprite:Sprite, x:Number, y:Number, width:Number, height:Number):TextField {
            var result:TextField = new TextField();
            result.x = x; result.y = y;
            result.width = width; result.height = height;
            sprite.addChild(result);
            return result;
        }
    }
}

我无法让嵌套的 children 在屏幕上显示他们自己的 children。 addChild() 大概添加了 child,但屏幕上没有任何反应。我不明白为什么。我习惯使用 Flex 和 Starling 之类的东西,但是当直接使用香草时,即使在这个基本点上,成语似乎也发生了一些变化。

你可以看到我在设计自定义按钮时注释掉了一些代码 class,我在使用它时遇到了很多同样的麻烦;但是我能够让它最终在屏幕上绘制一个蓝色矩形,一旦我停止尝试将精灵添加到按钮的效果,一旦我开始使用按钮自己的 graphics 属性 改为绘制矩形(Button 扩展 Sprite),并在操作其宽度和高度时使用一些尴尬的时间等。

早些时候我试图将 TextField 直接添加到 Button,最初是在它自己的构造函数中,但甚至将它添加到 [=19= 中的常规 Sprite ] class 不工作。将 sprite.addChild(result); 替换为 addChild(result); 使其显示正常。

总的来说,这种设计有什么问题?我不只是问这个特定的例子,但总的来说,你如何让 children 添加 children,添加 children 等等?谢谢!

更新

好吧,事实证明,在 Sprite 上设置 widthheight 是导致问题的原因。把它拿出来,你就没事了。甚至可以让那个嵌套的Spritegraphic属性画一个一定宽高的矩形,然后给那个Sprite加上children,只要您实际上没有设置那些特定的属性。遵守这一规则,一切都会很好。违抗,世界末日!!!

...或者是吗?我的意思是,这些属性可能是有正当理由的;很难说为什么它们会导致诸如阻止 children 出现在屏幕上之类的问题,除了你触摸它们这一简单事实之外没有其他原因。在我进行实验时,我通常会确保为 Sprite 的任何 children 提供的大小足够大的值,并且它们的 xy 属性也被适当地设置,所以它们不应该被移出屏幕甚至移出 Sprite 本身。有人有想法吗?

编辑

另一件需要注意的事情是,一旦我得到 Button class 来绘制一个蓝色矩形,我就可以通过设置 [= Button 的 22=] 和 height 属性; Buttongraphics 属性 正在缩放其大小以与 Button 对齐,这是 built-in 算法的一部分。然而,这是否真的有效取决于以某种方式设置的东西,而这种设置本身似乎有点随机。在这一点上,我在没有弄乱 Sprites 的 widthheight 属性的情况下继续前进,但有些东西有点晦涩难懂。

这里有一些建议 - 看看这个:

package com.test
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            //Change the stage parameters
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            //Adding a test Sprite
            var sprite:Sprite = new Sprite();
            this.addChild(sprite);

            //Adding some color to the sprite so you can see ti
            sprite.graphics.beginFill(0xff0000,1);
            sprite.graphics.drawRect(0, 0, 100, 200);
            sprite.graphics.endFill();

            //Adding a text field
            var textField:TextField = new TextField();
            textField.text = "HELLO!";
            this.addChild(textField);

        }   
    }
}

这里有一个类似的例子,希望能说明发生了什么。首先,你的 init 函数在构造函数中被调用,所以我不确定它是否会像它应该的那样工作,尝试将它拉出到它自己的函数中。此外 - 实例化时的显示对象实际上没有任何内容,因此实际上不需要指定高度和宽度。让内容决定高度和宽度,除非您需要明确定义它们。

您可以修改示例,以便将 TextField 添加到精灵而不是主精灵,方法是:

sprite.addChild(textField);

希望这对您有所帮助!

我们先看看文档中关于宽度的说法属性: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#width

The width is calculated based on the bounds of the content of the display object.

新建的Sprite对象中没有内容。它只是一个空容器。 在没有内容的情况下读取这个值是有意义的,答案是 0。但是向它写入一个不同于 0 的值并没有太大意义。 你想怎么改变空的宽度?

基本上来说,一个空的 DisplayObject 不应该有可写的 属性 宽度。 也许当你尝试这样做时它应该抛出一个错误,但它并不是必须的,因为这个操作不是很合乎逻辑。