【问题标题】:Access stage from arbitrary location从任意位置访问阶段
【发布时间】:2011-09-02 23:41:42
【问题描述】:

假设我有一个实用程序类,我想在其中访问舞台(以获取 frameRate)。

我并不特别想强迫用户在使用阶段之前将每个方法传递给我的类或在我的类上设置一个静态属性。

有没有什么方法可以在不被传递的情况下获得舞台?我只需要帧率!

【问题讨论】:

  • 我想我只测量 ENTER_FRAME 事件之间的间隔

标签: flash actionscript-3 stage


【解决方案1】:

在您的主文档类中将帧速率设置为公共静态变量或公共常量(或者在其他任何地方可以使用对舞台的引用),然后从您的实用程序类中调用该静态变量:

文档类

package
{
    //Imports
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;

    //Class
    [SWF(width = "1000", height = "500", BackgroundColor = "0x555555")]
    public class DocumentClass extends Sprite
    {
        //Static Variables
        public static var FRAME_RATE:uint;

        //Constructor
        public function DocumentClass()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.frameRate = FRAME_RATE = 60;

            //...
        }
    }
}

实用类

package
{
    //Imports
    import flash.events.EventDispatcher;

    //Class
    public class UtilityClass extends EventDispatcher
    {
        //Constructor
        public function UtilityClass()
        {
            trace("SWF Frame Rate: " + DocumentClass.FRAME_RATE);
        }
    }
}

[编辑]:


在您无法直接访问该阶段的情况下,您可以让您的用户将 stage.frameRate 值传递给实用程序类的构造函数,但我相信您会同意这种方法不是很好优雅的。我认为您测量 ENTER_FRAME 事件之间的间隔的想法是最好的解决方案。

【讨论】:

  • 谢谢,但我无法控制文档类。我的实用程序被编译成一个独立的 SWC。
  • 看起来如果没有人直接或间接地给我这个舞台是不可能的。哦,好吧!
  • 这是因为您的实用程序类不是显示对象,因此无法访问舞台。另一种可能的解决方案是使您的实用程序类成为显示对象,或强制使用将空白显示对象添加到显示列表中。这种方法确实是贫民窟,但是通过显示对象访问舞台是访问舞台属性的唯一常用方法。
  • 这是我发现的另一个选项 - 虽然它不需要用户将帧速率值传递给您的实用程序类,但它确实需要您的实用程序类通过 loaderInfo 并从显示对象实例化当前在显示列表中:blog.natebeck.net/2010/12/…,这是代码:github.com/ZaaLabs/ZaaUtils/blob/master/src/com/zaalabs/utils/…
【解决方案2】:

如果您没有计划更改帧速率运行时,最好使用包含您可以在整个项目中使用的所有全局值的设置类。

设置.as

package
{
    public class Settings
    {

        public static const FRAMERATE : int = 30;
        public static const BUILD : String = "build 0.12";
        public static const APPLICATION_WIDTH : int = 800;
        public static const APPLICATION_HEIGHT : int = 800;

    }
}

Main.as

package
{
    import flash.display.Sprite;

    public class Main extends Sprite
    {

        public function Main()
        {
            stage.frameRate = Settings.FRAMERATE;
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2016-02-29
    • 2010-10-06
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多