2014-03-12 58 views
0

在对@ @#%小时进行故障排除后,我发现我无法在类的构造函数中访问舞台的属性。鉴于一个DisplayObject子类这一点,例如,不工作:访问舞台属性

Constructor() { 
    this.width = stage.stageWidth; 
} 

这里的主要问题是,对象没有被添加到舞台 - 我的理解是:因为它不知道“它坐“,无法确定舞台宽度。在这种情况下,很容易通过响应调用this.width = stage.stageWidth一个ADDED_TO_STAGE事件与从未添加到舞台上一个类时,虽然

这种方法分解为解决这个问题 - 的BitmapData的子类,包含功能操纵例如,舞台的表示。据我所知,可能只有一个阶段与给定的.swf相关联......我觉得必须有某种方法将舞台属性传递给非DisplayObject类,而不是将它们作为参数传递。

+0

没有舞台,显示对象不会有任何有价值的维度。所以你可以使用默认值,或者面对没有阶段没有维度并且可以处理它的代码。我已经想出了解决这个问题的所有问题。 – philipp

+0

请继续阅读 - 我不关心显示对象!或者你是指第二部分? – Conduit

回答

0

如果您需要Stage不属于显示列表的一部分,请将舞台作为参数传递。将阶段的参考传递给该类的构造函数。您在应用程序中的入口点是文档类,在舞台上获取参考,并通过它。

//Somewhere, where you have reference on the stage 
var helper: SomeUtilityClass = new SomeUtilityClass(this.stage); 
+0

没有其他办法,呃?如果没有人提供更好的解决方案,我一定会接受这个 - 再次感谢,尼古拉斯! – Conduit

+0

还有其他解决方案,但我不喜欢它们。例如为舞台创建静态成员,所以它可以从任何地方访问。但我建议在AS3项目中省略'static'。这很慢。实际上,在设计良好的应用程序中,舞台仅用于获取屏幕大小;) –

+0

在这种情况下,最终目标是创建一个实用程序类,它表示舞台上的边框,但不是显示对象(它只是托管图形数据)。一个奇怪的问题,但这是我的项目所必需的。没有舞台的界限,我无法正确创建对象。一个困境...... – Conduit

0

好这个能做到这一点,通过重写一个getter:

public class MyDisplayObject extends DisplayObject { 
    //you constructor here 

    public override function get width():Number { 
     return (this.stage) ? this.stageWidth : <default>; 
    } 
} 

这种方法不会让你知道舞台的宽度实际上是添加到舞台对象之前的问题上运行。但实际上您应该听取ADDED_TO_STAGE事件,以便在可用时设置宽度(如果您希望对象始终与舞台的宽度相同)。此外,您可以听取活动RESIZE以正确更新它。