2014-01-31 4 views
1

Как я могу получить ссылку на мою сцену без, имеющей объект Sprite/DisplayObject, который уже добавлен на сцену? Получить этап в ActionScript-3 без DisplayObject?


Дополнительная информация: У меня есть статический класс, который является классом утилиты, и я хочу, чтобы он инициализировался в статическом конструкторе классов, но мне также нужна ссылка на сцену.

public class UtilClass 
{ 
    trace("init: " + stage); 
} 

Первое, что называется в моих AS-3 приложения является конструктор моего основного Sprite/DisplayObject и имеет доступ к сцене. Таким образом, сцена существует в этот момент. Затем Я вызываю утилиты моих UtilClass. Теперь я хочу, чтобы он инициализировался сам по себе при первом использовании (когда этап уже существует).
Я хочу знать, можно ли получить доступ к объекту сцены из любого места без инициализации извне класса утилиты.

Edit:

public class SimpleSprite extends Sprite 
{ 
    public static var aaa:int = 12; 

    public static function test():void 
    { 
     trace("here I am"); 
    } 

    trace(aaa, Capabilities.screenResolutionX+", "+Capabilities.screenResolutionY); 
    test(); 
} 
+0

Вам нужно передать его на свой класс, я думаю. Ваш класс нуждается в методах. – putvande

ответ

1

Упоминание этап доступен в вашем MainTimeline или Main, например, в зависимости от платформы. Вы можете добавить код, чтобы передать эту ссылку другим классам, если вам это нужно. Класс должен иметь метод (статический, в вашем случае), который примет параметр Stage и сохранит его где-нибудь внутри класса.

public class UtilClass { 
    private static var theStage:Stage=null; 
    public static function initialize(s:Stage):void { 
     if (theStage) return; // we're initialized already 
     theStage=s; 
    } 
    // once you call this, you can "trace(theStage)" and get correct output 
    // other methods can also rely on theStage now. 
} 

Затем вы вызываете UtilClass.initialize(stage);, и вы настроены.

+0

Да, это путь, если ответ на указанный выше вопрос ** «невозможно в AS-3» **. – Bitterblue

+0

Вы не можете инициализировать ссылку на сцену из класса утилиты * самостоятельно *, вам все равно придется вызывать методы этого класса из основного потока выполнения кода, который запускается в экземпляре 'Main' sprite/MC, который имеет доступ к этапу. Кроме того, если вы будете обращаться к статическим варам/функциям, то не будет компилироваться код, который будет использоваться только вне методов. (IIRC я ​​видел здесь вопрос, требующий этого). Так что да, «bootstrap» автономного класса для обнаружения своей среды «** невозможно в AS3 **». Он должен получать эту информацию извне. – Vesper

+0

На самом деле он хорошо компилируется. «Постановка кода только снаружи методов не будет компилироваться» _ (см. Мое редактирование), за исключением того, что вы имеете в виду что-то еще. – Bitterblue

0

Вам нужно будет инициализировать свой UtilClass и передать ссылку на сцену. Я рекомендую вам иметь класс только для ссылки «Управление».

Вы могли бы попробовать что-то вроде этого (просто быстрый пример):

public class StageReference 
{ 
    public static const STAGE_DEFAULT:String = 'stageDefault'; 
    protected static var _stageMap:Dictionary; 

    public static function getStage(id:String = StageReference.STAGE_DEFAULT):Stage 
    { 
     if (!(id in StageReference._getMap())) 
      throw new Error('Cannot get Stage ("' + id + '") before it has been set.'); 

     return StageReference._getMap()[id]; 
    } 

    public static function setStage(stage:Stage, id:String = StageReference.STAGE_DEFAULT):void 
    { 
     StageReference._getMap()[id] = stage; 
    } 

    public static function removeStage(id:String = StageReference.STAGE_DEFAULT):Boolean 
    { 
     if (!(id in StageReference._getMap())) 
      return false; 

     StageReference.setStage(null, id); 

     return true; 
    } 

    protected static function _getMap():Dictionary 
    { 
     if (!StageReference._stageMap) StageReference._stageMap = new Dictionary(); 

     return StageReference._stageMap; 
    } 
} 

При запуске приложения (главный класс или где вы начинаете включать логику)

StageReference.setStage(stage); 

И когда вам необходимо получить ссылку на эталон

trace('Checking the Stage: ', StageReference.getStage()); 
Смежные вопросы