Доступ к элементам сцены из подклассов - PullRequest
0 голосов
/ 17 марта 2011

Вопрос прост: Доступ к этапу объекты (такие как Movie Clip или текстовые поля) из подклассов .Проблема возникла, когда я определил подкласс и попытался получить доступ к объектам сцены.Как я могу это сделать?Представьте, что у меня на сцене есть мувиклип redBox_mc. Я хочу изменить его альфа после того, как я загрузил свой xml (или любое другое действие в подклассе)

Основной класс:

package src{
   // ..
   public class code01 extends MovieClip {
     public var rt:xmlReader = new xmlReader("art.xml"); // my subclass 
     public function code01():void {
     // .. my code
     }
   }
}

Подкласс xmlReader:

package src{
    // ..
    public class xmlReader extends MovieClip {
        // ..  
        public function xmlReader(xmlFilename:String)
            // .. my code
                stage.redBox_mc.alpha =  .2 ; // doesn’t work
                MovieClip(parent).redBox_mc.alpha =  .2 ; // doesn’t work
        }
    }
}

Пожалуйста, помогите мне ..

1 Ответ

10 голосов
/ 17 марта 2011

Есть много способов сделать сцену доступной для класса дочернего объекта:

ОПЦИЯ 1

Самый простой способ - это проанализировать ссылку на сценукласс дочернего объекта:

Main.as (класс документа):

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function init(e:Event = null):void
        {   
            var foo:Foo = new Foo(stage);

        }// end function

    }// end class

}// end package

Foo.as:

package 
{
    import flash.display.Stage;

    public class Foo
    {
        public function Foo(stage:Stage)
        {
            if(stage) trace("success"); // output: success

        }// end function

    }// end class

}// end package

ВАРИАНТ 2

Другим вариантом является добавление экранного объекта в список отображения.Таким образом, класс вашего экранного объекта будет иметь ссылку на сцену.Затем вам нужно добавить прослушиватель событий в классе вашего экранного объекта, который прослушивает экранный объект, который будет добавлен на сцену.Только когда получатель события получит это событие, у вас будет ссылка на сцену:

Main.as (класс документа):

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function init(e:Event = null):void
        {   
            var foo:Foo = new Foo();
            addChild(foo);

        }// end function

    }// end class

}// end package

Foo.as:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Foo extends Sprite
    {
        public function Foo()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function init(e:Event = null):void
        {   
            if(stage) trace("success"); // output: success

        }// end function

    }// end class

}// end package

ОПЦИЯ 3

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

Main.as (класс документа):

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function init(e:Event = null):void
        {   
            GlobalVars.stage = stage;

            var foo:Foo = new Foo();

        }// end function

    }// end class

}// end package

GlobalVar.as:

package
{
    import flash.display.Stage;

    public class GlobalVars
    {
        public static var stage:Stage;

    }// end class

}// end package

Foo.as

package 
{
    import flash.display.Stage;

    public class Foo
    {
        public function Foo()
        {
            var stage:Stage = GlobalVars.stage;
            if(stage) trace("success"); // output: success

        }// end function

    }// end class

}// end package

[ОБНОВЛЕНИЕ]

Глядя на ваш код, я просто не мог понятьпочему ваш xmlReader класс расширяет DisplayObject в первую очередь.xmlReader похоже обрабатывает всю логику, связанную с xml, например, загрузку и интерпретацию xml, так почему бы не оставить все как есть?Пусть другой класс обрабатывает объект на сцене.Я думаю, что реальным решением вашей проблемы является лучшая структура кода, примером которой является следующее:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite
    {
        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function init(e:Event = null):void
        {   
            var textField:TextField = new TextField();
            textField.name = "textField";
            stage.addChild(textField);

            var stageManager:StageManager = new StageManager(stage, "dummy.xml");

        }// end function

    }// end class

}// end package

import flash.display.Stage;
import flash.events.Event;
import flash.text.TextField;

class StageManager
{
    private var _stage:Stage;
    private var _xmlReader:XMLReader;

    public function StageManager(stage:Stage, url:String)
    {
        _stage = stage;
        _xmlReader = new XMLReader(url);
        _xmlReader.addEventListener(Event.COMPLETE, onXMLReaderComplete);

    }// end function

    private function onXMLReaderComplete(e:Event):void
    {
        var textField:TextField = _stage.getChildByName("textField") as TextField;
        textField.text = "XML LOADED!";

    }// end function

}// end class

import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.errors.IOError;


class XMLReader extends EventDispatcher
{
    public var xml:XML;

    public function XMLReader(url:String) 
    {
        read(url);

    }// end function

    public function read(url:String)
    {
        var urlLoader:URLLoader = new URLLoader(new URLRequest(url));
        urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onURLLoaderIOError);
        urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);

    }// end function

    private function onURLLoaderIOError(e:IOErrorEvent):void
    {
        throw new IOError(e.text);

    }// end function

    private function onURLLoaderComplete(e:Event):void
    {
        xml = URLLoader(e.target).data as XML;
        dispatchEvent(new Event(Event.COMPLETE));

    }// end function

}// end class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...