在 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
上设置 width
和 height
是导致问题的原因。把它拿出来,你就没事了。甚至可以让那个嵌套的Sprite
的graphic
属性画一个一定宽高的矩形,然后给那个Sprite
加上children,只要您实际上没有设置那些特定的属性。遵守这一规则,一切都会很好。违抗,世界末日!!!
...或者是吗?我的意思是,这些属性可能是有正当理由的;很难说为什么它们会导致诸如阻止 children 出现在屏幕上之类的问题,除了你触摸它们这一简单事实之外没有其他原因。在我进行实验时,我通常会确保为 Sprite
的任何 children 提供的大小足够大的值,并且它们的 x
和 y
属性也被适当地设置,所以它们不应该被移出屏幕甚至移出 Sprite
本身。有人有想法吗?
编辑
另一件需要注意的事情是,一旦我得到 Button
class 来绘制一个蓝色矩形,我就可以通过设置 [= Button
的 22=] 和 height
属性; Button
的 graphics
属性 正在缩放其大小以与 Button
对齐,这是 built-in 算法的一部分。然而,这是否真的有效取决于以某种方式设置的东西,而这种设置本身似乎有点随机。在这一点上,我在没有弄乱 Sprite
s 的 width
和 height
属性的情况下继续前进,但有些东西有点晦涩难懂。
这里有一些建议 - 看看这个:
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 不应该有可写的 属性 宽度。
也许当你尝试这样做时它应该抛出一个错误,但它并不是必须的,因为这个操作不是很合乎逻辑。
假设以下代码:
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
上设置 width
和 height
是导致问题的原因。把它拿出来,你就没事了。甚至可以让那个嵌套的Sprite
的graphic
属性画一个一定宽高的矩形,然后给那个Sprite
加上children,只要您实际上没有设置那些特定的属性。遵守这一规则,一切都会很好。违抗,世界末日!!!
...或者是吗?我的意思是,这些属性可能是有正当理由的;很难说为什么它们会导致诸如阻止 children 出现在屏幕上之类的问题,除了你触摸它们这一简单事实之外没有其他原因。在我进行实验时,我通常会确保为 Sprite
的任何 children 提供的大小足够大的值,并且它们的 x
和 y
属性也被适当地设置,所以它们不应该被移出屏幕甚至移出 Sprite
本身。有人有想法吗?
编辑
另一件需要注意的事情是,一旦我得到 Button
class 来绘制一个蓝色矩形,我就可以通过设置 [= Button
的 22=] 和 height
属性; Button
的 graphics
属性 正在缩放其大小以与 Button
对齐,这是 built-in 算法的一部分。然而,这是否真的有效取决于以某种方式设置的东西,而这种设置本身似乎有点随机。在这一点上,我在没有弄乱 Sprite
s 的 width
和 height
属性的情况下继续前进,但有些东西有点晦涩难懂。
这里有一些建议 - 看看这个:
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 不应该有可写的 属性 宽度。 也许当你尝试这样做时它应该抛出一个错误,但它并不是必须的,因为这个操作不是很合乎逻辑。