从子类访问阶段元素

Kat*_*ore 0 flash actionscript-3

问题很简单:从子类访问舞台对象(如Movie Clip或文本字段).当我定义一个子类并尝试访问阶段对象时,问题出现了.我怎样才能做到这一点?想象一下,我在舞台上有一个名为redBox_mc的影片剪辑.我希望在我加载xml之后将其更改为alpha.(或子类中的任何其他操作)

主要课程:

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮我 ..

Tau*_*ayi 10

有许多方法可以使子对象的类可以访问该阶段:

选项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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

方案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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

方案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
Run Code Online (Sandbox Code Playgroud)

GlobalVar.as:

package
{
    import flash.display.Stage;

    public class GlobalVars
    {
        public static var stage:Stage;

    }// end class

}// end package
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

[UPDATE]

看看你的代码,我无法弄清楚为什么你的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
Run Code Online (Sandbox Code Playgroud)