无法在vanilla ActionScript 3中对嵌套子项调用addChild()以执行任何操作

时间:2015-01-14 14:59:52

标签: actionscript-3 graphics

假设以下代码:

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;
        }
    }
}

我无法让嵌套的孩子在屏幕上显示自己的孩子。 addChild()可能会增加孩子,但屏幕上没有任何反应。我不明白为什么。我曾经习惯使用Flex和Starling这样的东西,但是这个成语在转向直接香草时甚至在这个基本点上都有所改变。

你可以看到我在设计自定义按钮类的地方注释了一些代码,我遇到了很多同样的麻烦;然而,当我开始尝试将一个精灵添加到按钮上时,我能够让它最终在屏幕上绘制一个蓝色矩形,并且一旦我开始使用按钮自己的graphics改为绘制矩形的属性(Button extends Sprite),以及使用一些笨拙的时间等操作其宽度和高度。

之前我曾尝试将TextField直接添加到Button,最初是在自己的构造函数中,但是甚至将其添加到Sprite类中的常规Main不工作。将sprite.addChild(result);替换为addChild(result);会使其显示正常。

一般来说,这类设计有什么问题?我不只是询问这个特定的例子,但总的来说,你如何让孩子们添加孩子来增加孩子等等?谢谢!

更新

嗯,事实证明,在width上设置heightSprite是造成问题的原因。拿出来,你很好。您甚至可以让嵌套的Sprite graphic属性绘制一个具有特定宽度和高度的矩形,然后将子项添加到Sprite,只要您不是实际设置那些特定的属性。遵守这一条规则,一切都很好。不服从,它是世界末日!!!

......或者是吗?我的意思是,那些属性可能是有正当理由的;很难说它们为什么会导致阻止儿童出现在屏幕上的问题,除了触摸它们的简单事实之外别无其他原因。在我进行实验时,我通常会确保提供的值足够大,可以容纳Sprite个孩子,以及他们的xy属性也设置得恰当,所以他们不应该被移出屏幕,甚至不能移出Sprite本身。有人有个主意吗?

修改

另外需要注意的是,一旦我得到Button类来绘制蓝色矩形,我就可以通过设置width和{{以某种方式调整矩形本身的大小。 1}} height的属性; Button' Button属性的大小已缩放以与graphics对齐,这是内置算法的一部分。然而,这实际上是否有效取决于某种方式设置的东西,并且设置本身似乎是随机的。在这一点上,我向前迈进,没有弄乱Button s' Spritewidth属性,但有些东西有点模糊。

2 个答案:

答案 0 :(得分:2)

让我们首先找出文档中有关width属性的内容: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#width

  

根据显示对象内容的界限计算宽度。

新创建的Sprite对象中没有内容。它只是一个空容器。 在没有内容的情况下阅读这个值是有意义的,答案是0.但是写一个与0不同的值并不是很有意义。 你想怎么改变什么的宽度?

基本上,空的DisplayObject不应具有可写属性宽度。 也许它会在你尝试这样做时引发错误,但它并不是真的必须这样做,因为操作不是很合理。

答案 1 :(得分:1)

我在这里建议了几件事 - 看看这个:

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而不是主Sprite:

sprite.addChild(textField);

希望这有帮助!