Этап доступа из произвольного места

Скажем, у меня есть служебный класс, в котором я хотел бы получить доступ к сцене (чтобы получить frameRate).

Я особенно не хочу заставлять пользователя переходить на этап к каждому методу или устанавливать статическое свойство в моем классе перед его использованием.

Есть ли способ удержать сцену, не проходя мимо? Все, что мне нужно, это frameRate!


person Cameron    schedule 02.09.2011    source источник
comment
Думаю, я просто измерю интервалы между событиями ENTER_FRAME   -  person Cameron    schedule 03.09.2011


Ответы (2)


установите частоту кадров как общедоступную статическую переменную или общедоступную константу в вашем основном классе документа (или где-либо еще ссылка на сцену), затем вызовите эту статическую переменную из вашего служебного класса:

Класс документа

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 - лучшее решение.

person Chunky Chunk    schedule 03.09.2011
comment
Спасибо, но у меня нет контроля над классом документа. Моя утилита скомпилирована в независимый SWC. - person Cameron; 03.09.2011
comment
Похоже, попасть на сцену невозможно без того, чтобы кто-то дал ее мне прямо или косвенно. Ну что ж! - person Cameron; 03.09.2011
comment
это потому, что ваш служебный класс не является экранным объектом, поэтому нет доступа к сцене. другое возможное решение - сделать ваш служебный класс экранным объектом или заставить пользователей добавлять пустой экранный объект в список отображения. этот подход - действительно гетто, но доступ к сцене через экранные объекты - единственный распространенный способ доступа к свойствам сцены. - person Chunky Chunk; 03.09.2011
comment
вот еще один вариант, который я нашел - хотя он не требует, чтобы пользователь передавал значение частоты кадров вашему служебному классу, он требует, чтобы ваш служебный класс был передан loaderInfo и был создан из экранного объекта, который в настоящее время находится в списке отображения: blog.natebeck.net/2010/12 / и вот код: github.com/ZaaLabs/ZaaUtils/blob/master/src/com/zaalabs/utils/ - person Chunky Chunk; 03.09.2011

Если вы не планируете изменять время выполнения с частотой кадров, было бы неплохо использовать класс настроек, содержащий все глобальные значения, которые вы могли бы использовать в своем проекте.

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

    }
}
person Mattias    schedule 03.09.2011